我在Windows和Linux上设置了许多MySQL数据库,并且没有问题地将许多Java应用程序连接到它们。
这个特别令我疯狂的是,我检查了所有常见的嫌疑人,然后空白。
问题:
我在Ubuntu 14上安装了MySQL 5.6。我可以通过MySQL命令行从本地机器或远程PC连接到它,但我无法将我的Grails应用程序连接到数据库,也无法在MySQL所在的本地服务器上运行Tomcat在我的本地PC上安装或以开发模式运行。 Grails应用程序可以很好地连接到我在PC上运行的本地MySQL,但不能在Ubuntu上运行。
Ubuntu MySQL配置:
测试连接:
以上暗示MySQL运行正常,没有防火墙或网络问题。
Grails" DataSource.groovy"构造
dataSource {
pooled = true
driverClassName = "com.mysql.jdbc.Driver"
dialect = "org.hibernate.dialect.MySQL5InnoDBDialect"
}
environments {
development {
dataSource {
dbCreate = "create-drop"
url = "jdbc:mysql://x.x.x.x:3306/mydb"
username = "myuser"
password = "mypass"
}
}
}
注:
错误
Message: Communications link failure
The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
Line | Method
->> 377 | handleNewInstance in com.mysql.jdbc.Util
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
| 1036 | createCommunicationsException in com.mysql.jdbc.SQLError
| 338 | <init> . . . . . . . . . . . in com.mysql.jdbc.MysqlIO
| 2232 | coreConnect in com.mysql.jdbc.ConnectionImpl
日志: 文件/var/log/upstart/mysql.log中没有任何相关内容,也没有与服务器上的var / log / mysql / error.log相关。
百万美元的问题是:为什么MySQL能够连接,但JDBC不能?它们的工作方式(本地和远程机器)之间有什么区别?
This post有关于此问题的最多信息,但我没有找到任何解决方案。
还试过这个:
properties {
maxActive = -1
minEvictableIdleTimeMillis=1800000
timeBetweenEvictionRunsMillis=1800000
numTestsPerEvictionRun=3
testOnBorrow=true
testWhileIdle=true
testOnReturn=true
validationQuery="SELECT 1"
}
在与数据库相同的服务器上运行Tomcat上的Grails战
我或多或少有相同的错误,但不同的Java,不同的操作系统,不同的连接方法。
Tomcat7 /var/lib/tomcat7/conf/context.xml
<Resource name="myresource" auth="Container" type="javax.sql.DataSource"
maxActive="50" maxIdle="5" maxWait="10000"
username="myuser" password="mypass" driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/mydb"/>
Grails配置
environments {
production {
dataSource {
dbCreate = "update"
jndiName = "java:comp/env/myresource"
pooled = true
driverClassName = "com.mysql.jdbc.Driver"
dialect = "org.hibernate.dialect.MySQL5InnoDBDialect"
properties {
maxActive = -1
minEvictableIdleTimeMillis=1800000
timeBetweenEvictionRunsMillis=1800000
numTestsPerEvictionRun=3
testOnBorrow=true
testWhileIdle=true
testOnReturn=true
validationQuery="SELECT 1"
}
}
}
}
/var/log/tomcat7/catalina.out中的错误
2015-01-16 23:18:41,425 [localhost-startStop-1] ERROR pool.ConnectionPool - Unable to create initial connections of pool.
java.sql.SQLException: Driver:com.mysql.jdbc.Driver@52fc036d returned null for URL:jdbc:h2:mem:grailsDB;MVCC=TRUE;LOCK_TIMEOUT=10000
at org.apache.tomcat.jdbc.pool.PooledConnection.connectUsingDriver(PooledConnection.java:296)
at org.apache.tomcat.jdbc.pool.PooledConnection.connect(PooledConnection.java:182)
有趣的是,上面提到了h2:mem db,但我认为这只是一个红鲱鱼,它可能在尝试连接MySQL数据库之后尝试了。在DataSource.groovy文件中没有提到h2 db。
注意:
服务器上的Java(与MySQL服务器相同)是OpenJDK,而不是Oracle的:
# apt-get install openjdk-7-jre-headless
# java -version
java version "1.7.0_65"
OpenJDK Runtime Environment (IcedTea 2.5.3) (7u71-2.5.3-0ubuntu0.14.04.1)
OpenJDK 64-Bit Server VM (build 24.65-b04, mixed mode)
JDBC(不知道如何验证版本)
# apt-get install libmysql-java
# cp /usr/share/java/mysql.jar /usr/share/tomcat7/lib
我在my.cnf中尝试了以下绑定选项(另外,重启)
bind-address = 127.0.0.1
bind-address = x.x.x.x (i.e. my servers external fixed ip)
bind-address = 0.0.0.0
# bind-address = 127.0.0.1
都会出现同样的错误。在开发服务器上,我通常会将绑定地址注释掉,因此它会侦听所有接口。
我还检查过:
TOMCAT7_SECURITY=no
/etc/init.d/tomcat7中的
答案 0 :(得分:2)
我遇到了类似的问题。
只是为了澄清报告的错误日志中的行:
URL:jdbc:h2:mem:grailsDB;MVCC=TRUE;LOCK_TIMEOUT=10000
此数据库连接URL似乎是DataSource的默认值,当您未在自定义DataSource中指定任何有效URL时使用该URL。这意味着,当您在日志中看到此网址时,您尚未指定数据库的任何有效网址。
答案 1 :(得分:0)
我面临着同样的问题。 我升级了MySql依赖版本和驱动程序类名称,如下所示:
从:
mysql:mysql-connector-java:5.1.36
com.mysql.jdbc.Driver
收件人:
mysql:mysql-connector-java:8.0.18
com.mysql.cj.jdbc.Driver