长话短说:
每次我尝试使用 JDBC 连接到本地 MySQL 服务器(可在大量其他 sql 客户端上运行)时,它根本无法连接,并且出现异常:
- 线程“main”com.mysql.jdbc.exceptions.jdbc4.CommunicationsException 中的异常:通信链接失败
- ....堆栈跟踪....
- 引起:java.net.SocketException:无效参数:connect
更多详细信息:
我有一个正在运行的本地 MySQL 服务器,我可以使用以下信息连接到它:
- 地址:本地主机或 127.0.0.1(均有效)
- 端口:3306
- 和我的用户名/密码/数据库名称
使用应用程序:HeidiSQL、phpmyadmin、MySQL Workbench 和 mysqladmin
运行 mysqladmin version 确认服务器已启动、工作并启用了 tcp/ip。
执行 mysqladmin 变量 显示“skip_networking”已关闭(完整配置见下文)。
MySQL 日志没有显示任何异常(也在下方)。
我正在使用 JDBC 连接器 v5.1.15,mysql-connector-java-5.1.15-bin.jar。它在我的 Eclipse 项目类路径中。
所有 Windows 7(旗舰版,64 位,如果重要的话)防火墙都关闭。
但我仍然收到堆栈跟踪错误,如下所示。当其他一切都能够正常连接时,我终究无法弄清楚出了什么问题...
我已尝试在下方包含所有相关信息。我希望它只是一些简单而愚蠢的东西,我忽略了并且找不到,因为我看起来太难了......但是谁知道呢:/heh。
我已经尝试了我在网上其他类似问题中找到的所有方法,但似乎没有任何效果(包括 https://stackoverflow.com/a/2985169/211750、https://stackoverflow.com/a/2103092/211750、https://serverfault.com/questions/89955/unable-to-connect-to-mysql-through-jdbc-connector-through-tomcat-or-externally 和其他)
我的测试代码:
package sqltest;
import com.mysql.jdbc.Driver;
import java.sql.DriverManager;
import java.util.Properties;
public class main {
public static void main(String[] args) throws Exception {
String url = "jdbc:mysql://localhost:3306/dbname?user=user&password=****&";
Driver driver = (Driver) Class.forName("com.mysql.jdbc.Driver").newInstance();
DriverManager.getConnection(url);
}
}
堆栈跟踪:http://pastebin.com/qv332y86
MySQL 变量转储:http://pastebin.com/merSEDdD
我的.ini: http://pastebin.com/EWZX2enz
MySQL mysqladmin 版本:
Server version 5.5.20-log
Protocol version 10
Connection localhost via TCP/IP
TCP port 3306
Uptime: 1 min 37 sec
Threads: 1 Questions: 17 Slow queries: 0 Opens: 33 Flush tables: 1 Open tables: 26 Queries per second avg: 0.175
MySQL 日志:
120314 21:37:20 [Note] Plugin 'FEDERATED' is disabled.
120314 21:37:20 InnoDB: The InnoDB memory heap is disabled
120314 21:37:20 InnoDB: Mutexes and rw_locks use Windows interlocked functions
120314 21:37:20 InnoDB: Compressed tables use zlib 1.2.3
120314 21:37:20 InnoDB: Initializing buffer pool, size = 128.0M
120314 21:37:20 InnoDB: Completed initialization of buffer pool
120314 21:37:20 InnoDB: highest supported file format is Barracuda.
120314 21:37:20 InnoDB: Waiting for the background threads to start
120314 21:37:21 InnoDB: 1.1.8 started; log sequence number 1619921
120314 21:37:21 [Note] Event Scheduler: Loaded 0 events
120314 21:37:21 [Note] wampmysqld: ready for connections.
Version: '5.5.20-log' socket: '' port: 3306 MySQL Community Server (GPL)
120314 21:38:02 [Note] wampmysqld: Normal shutdown
120314 21:38:02 [Note] Event Scheduler: Purging the queue. 0 events
120314 21:38:02 InnoDB: Starting shutdown...
120314 21:38:02 InnoDB: Shutdown completed; log sequence number 1619921
120314 21:38:02 [Note] wampmysqld: Shutdown complete
最佳答案
原来是 Java 更喜欢 IPv6 把事情搞砸了,所以我不得不添加 -Djava.net.preferIPv4Stack=true,但由于我在 tomcat 下运行,我不得不通过一种迂回的方式来设置属性。我不确定这样做的标准方法是什么(如果有的话),但我通过编辑 Catalina.bat 并将 -Djava.net.preferIPv4Stack=true 添加到文件末尾来让它工作。见:
rem Execute Java with the applicable properties
if not "%JPDA%" == "" goto doJpda
if not "%SECURITY_POLICY_FILE%" == "" goto doSecurity
%_EXECJAVA% %JAVA_OPTS% %CATALINA_OPTS% %DEBUG_OPTS% -Djava.net.preferIPv4Stack=true -Djava.endorsed.dirs="%JAVA_ENDORSED_DIRS%" -classpath "%CLASSPATH%" -Dcatalina.base="%CATALINA_BASE%" -Dcatalina.home="%CATALINA_HOME%" -Djava.io.tmpdir="%CATALINA_TMPDIR%" %MAINCLASS% %CMD_LINE_ARGS% %ACTION%
goto end
:doSecurity
%_EXECJAVA% %JAVA_OPTS% %CATALINA_OPTS% %DEBUG_OPTS% -Djava.net.preferIPv4Stack=true -Djava.endorsed.dirs="%JAVA_ENDORSED_DIRS%" -classpath "%CLASSPATH%" -Djava.security.manager -Djava.security.policy=="%SECURITY_POLICY_FILE%" -Dcatalina.base="%CATALINA_BASE%" -Dcatalina.home="%CATALINA_HOME%" -Djava.io.tmpdir="%CATALINA_TMPDIR%" %MAINCLASS% %CMD_LINE_ARGS% %ACTION%
goto end
:doJpda
if not "%SECURITY_POLICY_FILE%" == "" goto doSecurityJpda
%_EXECJAVA% %JAVA_OPTS% %CATALINA_OPTS% %JPDA_OPTS% %DEBUG_OPTS% -Djava.net.preferIPv4Stack=true -Djava.endorsed.dirs="%JAVA_ENDORSED_DIRS%" -classpath "%CLASSPATH%" -Dcatalina.base="%CATALINA_BASE%" -Dcatalina.home="%CATALINA_HOME%" -Djava.io.tmpdir="%CATALINA_TMPDIR%" %MAINCLASS% %CMD_LINE_ARGS% %ACTION%
goto end
:doSecurityJpda
%_EXECJAVA% %JAVA_OPTS% %CATALINA_OPTS% %JPDA_OPTS% %DEBUG_OPTS% -Djava.net.preferIPv4Stack=true -Djava.endorsed.dirs="%JAVA_ENDORSED_DIRS%" -classpath "%CLASSPATH%" -Djava.security.manager -Djava.security.policy=="%SECURITY_POLICY_FILE%" -Dcatalina.base="%CATALINA_BASE%" -Dcatalina.home="%CATALINA_HOME%" -Djava.io.tmpdir="%CATALINA_TMPDIR%" %MAINCLASS% %CMD_LINE_ARGS% %ACTION%
goto end
:end
关于java - 无法使用 JDBC 连接到 Windows 7 上的 MySQL,但可以通过 phpmyadmin 和其他管理工具工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9713371/