Java JDBC MySQL连接在一些Tomcat上工作,但在其他带有MySQLNonTransientConnectionException的Tomcat上失败

Java JDBC MySQL连接在一些Tomcat上工作,但在其他带有MySQLNonTransientConnectionException的Tomcat上失败,java,mysql,tomcat,jdbc,jetty,Java,Mysql,Tomcat,Jdbc,Jetty,我有一个通常在tomcat上运行的GWT web应用程序项目,但我无法让它可靠地连接到我的MySQL数据库 它适用于以下情况: 作为Eclipse中的“Web应用程序”运行 在远程Tomcat6服务器上部署gradle和war构建 在本地Tomcat7服务器上部署gradle和war构建 它在以下情况下不起作用 在gradle通过jettyRunWar任务创建的本地码头上运行(该任务首先构建war,然后启动内置码头将其部署到) 在远程Tomcat7服务器上部署gradle和war构建 w

我有一个通常在tomcat上运行的GWT web应用程序项目,但我无法让它可靠地连接到我的MySQL数据库

它适用于以下情况:

  • 作为Eclipse中的“Web应用程序”运行
  • 在远程Tomcat6服务器上部署gradle和war构建
  • 在本地Tomcat7服务器上部署gradle和war构建
它在以下情况下不起作用

  • 在gradle通过
    jettyRunWar
    任务创建的本地码头上运行(该任务首先构建war,然后启动内置码头将其部署到)
  • 在远程Tomcat7服务器上部署gradle和war构建
web应用程序在所有情况下都可以正常启动,但在最后两种情况下,第一次数据库访问失败,出现以下异常:

com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Could not create connection to database server.
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
at com.mysql.jdbc.Util.getInstance(Util.java:386)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1015)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:989)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:975)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:920)
at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2575)
at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2311)
at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:834)
at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:47)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:416)
at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:347)
at com.mysql.jdbc.jdbc2.optional.MysqlDataSource.getConnection(MysqlDataSource.java:443)
at com.mysql.jdbc.jdbc2.optional.MysqlDataSource.getConnection(MysqlDataSource.java:141)
at com.mysql.jdbc.jdbc2.optional.MysqlDataSource.getConnection(MysqlDataSource.java:111)
    [snip: our code creating the connection to the database]

Caused by: java.lang.NullPointerException
at com.mysql.jdbc.Buffer.<init>(Buffer.java:55)
at com.mysql.jdbc.MysqlIO.proceedHandshakeWithPluggableAuthentication(MysqlIO.java:1740)
at com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1290)
at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2493)
at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2526)
... 44 more
正如您所见,我在多个环境中尝试了它,并尝试了多个版本的代码(例如,使用不同的GWT JAR等),但我仍然不知道为什么它在某些配置中有效,但在其他配置中无效


知道问题出在哪里吗?

此错误发生在5.1.17版开始的mysql驱动程序中。降级到5.1.16对我来说解决了这个问题


编辑:我在mysqlbug跟踪器()中提交了一个与此相关的bug。我得到了非常快的响应,原因可能是一些不受支持的编码异常。这对我来说是正确的,因此在修复file.encoding系统属性(使用-Dfile.encoding=UTF-8运行tomcat)后,所有这些都按预期工作。

此错误发生在从5.1.17版开始的mysql驱动程序中。降级到5.1.16对我来说解决了这个问题


编辑:我在mysqlbug跟踪器()中提交了一个与此相关的bug。我得到了非常快的响应,原因可能是一些不受支持的编码异常。这对我来说是正确的,因此在修复file.encoding系统属性(使用-Dfile.encoding=UTF-8运行tomcat)后,所有这些都按预期工作。

此错误发生在从5.1.17版开始的mysql驱动程序中。降级到5.1.16对我来说解决了这个问题


编辑:我在mysqlbug跟踪器()中提交了一个与此相关的bug。我得到了非常快的响应,原因可能是一些不受支持的编码异常。这对我来说是正确的,因此在修复file.encoding系统属性(使用-Dfile.encoding=UTF-8运行tomcat)后,所有这些都按预期工作。

此错误发生在从5.1.17版开始的mysql驱动程序中。降级到5.1.16对我来说解决了这个问题


编辑:我在mysqlbug跟踪器()中提交了一个与此相关的bug。我得到了非常快的响应,原因可能是一些不受支持的编码异常。这对我来说是正确的,所以在修复file.encoding系统属性(使用-Dfile.encoding=UTF-8运行tomcat)之后,所有这些都按预期工作。

哇,非常感谢,降级到5.1.16对我来说也很有效!您知道如何在gradle jettyRunWar任务上设置file.encoding吗?请查看错误报告。我们发现原因是通过jvm属性“-Dfile.encoding=UFT-8”(而不是UTF-8)传递给tomcat的编码无效。所以在这种情况下降级是不必要的。哇,非常感谢,降级到5.1.16对我来说也很有效!您知道如何在gradle jettyRunWar任务上设置file.encoding吗?请查看错误报告。我们发现原因是通过jvm属性“-Dfile.encoding=UFT-8”(而不是UTF-8)传递给tomcat的编码无效。所以在这种情况下降级是不必要的。哇,非常感谢,降级到5.1.16对我来说也很有效!您知道如何在gradle jettyRunWar任务上设置file.encoding吗?请查看错误报告。我们发现原因是通过jvm属性“-Dfile.encoding=UFT-8”(而不是UTF-8)传递给tomcat的编码无效。所以在这种情况下降级是不必要的。哇,非常感谢,降级到5.1.16对我来说也很有效!您知道如何在gradle jettyRunWar任务上设置file.encoding吗?请查看错误报告。我们发现原因是通过jvm属性“-Dfile.encoding=UFT-8”(而不是UTF-8)传递给tomcat的编码无效。因此,在这种情况下,降级是不必要的。
public static Connection getConnection(String host, int port, String database, String user, String password) throws SQLException
{
    MysqlDataSource dataSource = new MysqlDataSource();
    dataSource.setServerName(host);
    dataSource.setPort(port);
    dataSource.setDatabaseName(database);
    dataSource.setUser(user);
    dataSource.setPassword(password);
    dataSource.setConnectTimeout(Preferences.MYSQL_CONNECTION_TIMEOUT);
    return dataSource.getConnection();
}