非常简单的东西,在这里 - 我对mysql不太了解它对我的要求。
我有一个简短的java测试用例,在我的开发系统上打开mysql上的连接但是,当我尝试将它放到我的服务器上时,它失败了。
任何有助于追踪这一点的人都会非常感激。
谢谢!
测试代码
import java.util.*;
import java.sql.*;
public class mysqltest {
static public void getDBConnection() {
System.out.println ("Start of getDBConnection.");
Connection conn = null;
String url = "jdbc:mysql://localhost:3306/";
String dbName = "magnets_development";
String driver = "com.mysql.jdbc.Driver";
String userName = "*****"; // blanked for publication
String password = "*****";
try {
Class.forName (driver).newInstance();
System.out.println ("driver.newInstance gotten.");
conn = DriverManager.getConnection (url+dbName, userName, password);
System.out.println ("Connection gotten: " + conn + ".");
Statement sql = conn.createStatement ();
ResultSet results = sql.executeQuery ("use " + dbName + ";");
}
catch (Exception ex) {
System.out.println ("*** Got exception.");
ex.printStackTrace();
}
}
public static void main(String args[]) {
System.out.println ("Main started.");
mysqltest.getDBConnection();
}
}
开发系统输出 (预期/正确回复)
olie$ java mysqltest
Main started.
Start of getDBConnection.
Properties set.
driver.newInstance gotten.
Connection gotten: com.mysql.jdbc.Connection@c980c9.
olie$
服务器输出 (我正在尝试追踪错误)(删除了一些空行。)
mini$ java mysqltest
Main started.
Start of getDBConnection.
Properties set.
driver.newInstance gotten.
*** Got exception.
com.mysql.jdbc.CommunicationsException: Communications link failure due to underlying exception:
** BEGIN NESTED EXCEPTION **
java.net.ConnectException
MESSAGE: Connection refused
STACKTRACE:
java.net.ConnectException: Connection refused
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:333)
at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:195)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:182)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:432)
at java.net.Socket.connect(Socket.java:520)
at java.net.Socket.connect(Socket.java:470)
at java.net.Socket.<init>(Socket.java:367)
at java.net.Socket.<init>(Socket.java:209)
at com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.java:256)
at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:271)
at com.mysql.jdbc.Connection.createNewIO(Connection.java:2771)
at com.mysql.jdbc.Connection.<init>(Connection.java:1555)
at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:285)
at java.sql.DriverManager.getConnection(DriverManager.java:525)
at java.sql.DriverManager.getConnection(DriverManager.java:140)
at mysqltest.getDBConnection(mysqltest.java:34)
at mysqltest.main(mysqltest.java:49)
** END NESTED EXCEPTION **
Last packet sent to the server was 3 ms ago.
at com.mysql.jdbc.Connection.createNewIO(Connection.java:2847)
at com.mysql.jdbc.Connection.<init>(Connection.java:1555)
at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:285)
at java.sql.DriverManager.getConnection(DriverManager.java:525)
at java.sql.DriverManager.getConnection(DriverManager.java:140)
at mysqltest.getDBConnection(mysqltest.java:34)
at mysqltest.main(mysqltest.java:49)
mini$
答案 0 :(得分:16)
关于这个主题的一个有用的说明。我花了至少30分钟试图调试相同的错误,这是我的错误。
在我的MySQL配置文件中,我碰巧将 BIND ADDR 设置为机器的IP。我没有将其设置为127.0.0.1
或0.0.0.0
。所以MySQL会接受来自外部的JDBC连接,但不接受内部的JDBC连接。我只是在从本地机器连接时才收到Connection Refused。
将该地址更改为0.0.0.0
允许它侦听对任何IP的请求。这允许内部和外部IP。
希望这能帮助那些犯了同样愚蠢错误的人。请查看上面有关netstat -an | grep 3306
。
答案 1 :(得分:6)
呸!我道歉 - 我刚刚设置了“仅限本地连接”。我对Java应用程序在本地运行这一事实感到困惑(所以看起来似乎是“本地连接”,但因为它是通过TCP连接的,所以它是一个“远程”连接,即使它起源于localhost。
我最终会学习如何管理这些东西。与此同时,我希望其他人可以从我的错误中吸取教训。
感谢所有花时间帮助我的人。我已经允许“远程”连接,但我的所有用户帐户都只是'用户名'@'localhost'(即,没有'用户名'@'%',这将允许任何机器连接。)希望,至少我得到了那个部分。
再次感谢!
答案 2 :(得分:2)
此外,请确保您的MySQL服务器的数据库用户帐户允许来自其他地址但localhost的连接。出于安全原因,在较小的服务器中,可能(并且可能默认?)限制与localhost的连接,以便只有本地Web应用程序可以使用魔术编号的用户/密码组合访问数据库。
答案 3 :(得分:1)
“连接被拒绝”消息只有一个原因,不要介意它是mysql还是其他任何服务。 服务器没有收听。 尝试使用“netstat -an”和grep端口3306进行验证。
答案 4 :(得分:0)
您是否已验证可以使用名称和密码连接到服务器上的数据库。
此外,如果您通过网址进行连接,则不需要以下行。
properties.setProperty("socket", "/Applications/MAMP/tmp/mysql/mysql.sock");
以上属性似乎特定于Os X.您是否在OS X上运行服务器?
答案 5 :(得分:0)
您的网址中包含localhost。您是否尝试连接到网络上的此服务器?您的网址可能不正确。
答案 6 :(得分:0)
/ *回答日期已过期,但我的回答是针对Future * /
我有同样的问题。
我该如何解决?
答案:
打开Xammp或其他服务器, 并运行MYSQL ... 。 如果SQL未运行,则抛出异常。
答案 7 :(得分:-1)
这是我的代码,适用于os X上的mysql
public SQL(String host, String port, String database, String userid, String password)
{
queryType = QUERYTYPE.Single;
String driver = "org.gjt.mm.mysql.Driver";
String url = "jdbc:mysql://" + host;
if (port != null)
{
url += ":" + port;
}
else
{
url += ":" + defaultPort;
}
url += "/" + database;
try
{
Class.forName(driver);
connection = DriverManager.getConnection(url, userid, password);
}
catch (Exception e)
{
e.printStackTrace();
}
}