【问题标题】:unable to connect to MySQL database using JDBC无法使用 JDBC 连接到 MySQL 数据库
【发布时间】:2014-01-16 12:00:49
【问题描述】:

我有这个 Java 应用程序,我现在正在其中开发一个模块,该模块可以从文件中读取和执行 SQL 语句并输出查询结果。如果我通过它的主要方法启动模块,它工作正常。我给出了数据库连接设置文件的路径(包括用户、密码、端口等)、包含 SQL 查询的文件的路径和输出文件的名称。正如我所说,作为独立启动,它工作正常,连接没有问题,执行查询并输出结果。 如果我将它集成到应用程序工作流程中,即使凭据(即数据库连接设置文件)相同,它也无法连接到数据库。我试图将它包装在一个线程中,尝试搜索是否需要异步启动连接,但没有任何帮助。 mysql-connector-java-5.1.28 在类路径中,一切看起来都很好。我也尝试设置自动重新连接(注释行),但它也失败了。这是创建连接的代码:

    String url = "jdbc:mysql://"+server+":3306/?useCursorFetch=true";
//String url = "jdbc:mysql://"+server+":3306/?autoReconnect=true";

try {
    return DriverManager.getConnection(url, user, password);
} catch (SQLException e1) {
        Logging.outputStackTrace(e1);
        throw new RuntimeException("Cannot connect to DB server: " +  e1.getMessage());

使用服务器 = 本地主机。用户和通行证都很好,抱歉重复第三次,通过模块的main方法启动时连接成功。 这是我通过应用程序运行模块时得到的堆栈跟踪:

ERROR: An error occurred : Could not create connection to database server. at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
Check the error log for details
sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
java.lang.reflect.Constructor.newInstance(Unknown Source)
com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
com.mysql.jdbc.Util.getInstance(Util.java:386)
com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1015)
com.mysql.jdbc.SQLError.createSQLException(SQLError.java:989)
com.mysql.jdbc.SQLError.createSQLException(SQLError.java:975)
com.mysql.jdbc.SQLError.createSQLException(SQLError.java:920)
com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2575)
com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2311)
com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:834)
com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:47)
sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
java.lang.reflect.Constructor.newInstance(Unknown Source)
com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:416)
com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:347)
java.sql.DriverManager.getConnection(Unknown Source)
java.sql.DriverManager.getConnection(Unknown Source)
org.application.utilities.DBConnection.connectToMySQL(DBConnection.java:144)
org.application.utilities.DBConnection.connect(DBConnection.java:107)
org.application.utilities.RunSQL.run(RunSQL.java:110)
org.application.workflow.Processing.extractData(Processing.java:201)
org.application.workflow.Processing.<init>(Processing.java:73)
org.application.gui.ApiGUI$2.actionPerformed(ApiGUI.java:349)
javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
javax.swing.DefaultButtonModel.setPressed(Unknown Source)
javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
java.awt.Component.processMouseEvent(Unknown Source)
javax.swing.JComponent.processMouseEvent(Unknown Source)
java.awt.Component.processEvent(Unknown Source)
java.awt.Container.processEvent(Unknown Source)
java.awt.Component.dispatchEventImpl(Unknown Source)
java.awt.Container.dispatchEventImpl(Unknown Source)
java.awt.Component.dispatchEvent(Unknown Source)
java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
java.awt.Container.dispatchEventImpl(Unknown Source)
java.awt.Window.dispatchEventImpl(Unknown Source)
java.awt.Component.dispatchEvent(Unknown Source)
java.awt.EventQueue.dispatchEventImpl(Unknown Source)
java.awt.EventQueue.access$200(Unknown Source)
java.awt.EventQueue$3.run(Unknown Source)
java.awt.EventQueue$3.run(Unknown Source)
java.security.AccessController.doPrivileged(Native Method)
java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
java.awt.EventQueue$4.run(Unknown Source)
java.awt.EventQueue$4.run(Unknown Source)
java.security.AccessController.doPrivileged(Native Method)
java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
java.awt.EventQueue.dispatchEvent(Unknown Source)
java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
java.awt.EventDispatchThread.pumpEvents(Unknown Source)
java.awt.EventDispatchThread.pumpEvents(Unknown Source)
java.awt.EventDispatchThread.run(Unknown Source)

任何想法为什么会发生这种情况?这是与线程相关的问题吗? GUI的事件管理器可以与它有关吗?数据库没有多个连接或并发连接。只有一次,完成后正确关闭。通过 MySQL 命令行,我还可以访问我的数据库,我确保服务器每次都处于打开状态,等等...... 谢谢。

【问题讨论】:

    标签: java mysql jdbc database-connection


    【解决方案1】:

    我想你忘了提到数据库名称

    String url = "jdbc:mysql://"+server+":3306/?useCursorFetch=true";
    

    必须

    String url = "jdbc:mysql://"+server+":3306/DB_NAME?useCursorFetch=true";
    

    【讨论】:

    • 感谢您的快速回复。数据库名称不是问题。它不连接到服务器,这不是找不到架构或数据库的问题。正如我所说,作为独立的,它与我在帖子中放置的 URL 完全一致。我添加了数据库名称,它仍然是相同的行为。还有其他想法吗?
    • 其他方面看起来很完美?您是否从文件中获取连接详细信息,因此可能有可用空间导致问题,因此请尝试通过在您的主要方法中从文件中获取详细信息来测试连接,因为我已经遇到了属性文件的这个问题希望这有帮助
    • 我知道你的意思,属性也有同样的问题,但我检查并仔细检查了空格,从连接详细信息文件中修剪了每个条目,对整个 url 以及用户进行了硬编码,通过,仍然一无所获。现在我想看看是不是 EDT 弄乱了它。我在 API 之上有一个接口,所以直到现在。它看起来像一些线程并发之类的东西..
    • 你能发布完整的堆栈跟踪吗?
    • 当然。我编辑了我的帖子并添加了堆栈跟踪的其余部分。 ApiGUI.java:349 发生的事情是实例化处理线程并启动它。在处理线程内部,RunSQL 模块被实例化并执行。请注意,我尝试过使用和不使用线程化 RunSQL 模块。
    【解决方案2】:

    好的。知道了。当我通过应用程序运行 SQL 模块时,我通过

    将文件编码设置为 ANSI
    System.setProperty("file.encoding", "ANSI");
    

    独立运行时并非如此。 显然 DriverManager.getConnection(url, user, pass) 不会自行设置字符集以确保它以兼容的字符编码发送请求。也许这应该在 java.sql 包中修复。

    【讨论】:

      猜你喜欢
      • 2014-12-09
      • 2018-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-03
      • 2013-06-18
      • 1970-01-01
      • 2015-04-01
      相关资源
      最近更新 更多