我有一个通常在tomcat上运行的GWT Web应用程序项目,但我无法让它可靠地连接到我的MySQL数据库。
它适用于以下情况:
在以下情况下不起作用
jettyRunWar
任务(首先构建战争,然后启动内置码头将其部署到)来运行gradle创建的本地码头。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
我也在几个月后回到了我们的提交历史中,但找不到没有问题的版本。但是,我很确定它曾经使用gradle的jettyRunWar
命令运行时没有问题。
以下是数据库连接的相关代码:
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();
}
我在几个环境中尝试过,因为你可以看到并尝试了几个版本的代码(例如,使用不同的GWT罐等)但我仍然不知道为什么它在某些配置中有效但在其他配置中却没有。
任何想法可能是什么问题?
答案 0 :(得分:3)
从版本5.1.17开始的mysql驱动程序发生此错误。降级到5.1.16可以解决这个问题。
编辑:我在mysqlbug跟踪器(http://bugs.mysql.com/bug.php?id=72630)中提交了一个有关它的错误。我得到了非常快的响应,原因可能是一些不受支持的编码异常。这对我来说是正确的,所以在修复了file.encoding系统属性(使用-Dfile.encoding = UTF-8运行tomcat)之后,所有这些都按预期工作。