java - 无法使用 JDBC 连接到 Windows 7 上的 MySQL,但可以通过 phpmyadmin 和其他管理工具工作?

标签 java mysql windows jdbc

长话短说:

每次我尝试使用 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/211750https://stackoverflow.com/a/2103092/211750https://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/

相关文章:

java - 在 JDialog 上使用滚动条 Swing TextArea

java - Android 以编程方式更新 apk

python - 连接 mysql wamp 和 django 时出现问题?

java - 通过java以隐藏模式打开命令提示符

mysql - 将 mysql odbc 升级到 5.3 会终止使用 v5.1 建立的连接

python - "ImportError: No module named serial"- 安装 pyserial 之后

java - 需要 JPA/Hibernate 实体上的 setter 来获取 ID 和外部实体

java - 如何在 Java 中直接将字符串写入 S3?

mysql - 存储过程变量

mysql-根据列连接多个表