Java(Grails)无法远程或本地连接到MySQL,但MySQL命令行可以

时间:2015-01-17 13:39:46

标签: mysql tomcat java-ee grails

我在Windows和Linux上设置了许多MySQL数据库,并且没有问题地将许多Java应用程序连接到它们。

这个特别令我疯狂的是,我检查了所有常见的嫌疑人,然后空白。

问题:

我在Ubuntu 14上安装了MySQL 5.6。我可以通过MySQL命令行从本地机器或远程PC连接到它,但我无法将我的Grails应用程序连接到数据库,也无法在MySQL所在的本地服务器上运行Tomcat在我的本地PC上安装或以开发模式运行。 Grails应用程序可以很好地连接到我在PC上运行的本地MySQL,但不能在Ubuntu上运行。

Ubuntu MySQL配置:

  1. MySQL 5.6通过apt-get install mysql-server-5.6
  2. 安装在Ubuntu 14上
  3. 创建数据库mydb;
  4. 创建用户' myuser' @'%'通过' mypass';
  5. 确定
  6. 授予*的所有权限。 *到' myuser' @'%';
  7. 绑定地址在my.cnf中被注释掉,因此它绑定到所有ips。
  8. service mysql restart。
  9. iptables没有运行。
  10. 没有为此服务器配置ISP防火墙,一切都是敞开的。
  11. 测试连接:

    1. 来自本地服务器:" mysql -u myuser -p mydb" - 工作,可以创建表等。
    2. 如上所述从远程PC运行窗口通过:" mysql -u myuser -p -h x.x.x.x mydb"其中x.x.x.x是我的服务器的IP。工作良好。可以创建表等。
    3. 以上暗示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"
              }
          }
      }
      

      注:

      • 还试过:url =" jdbc:mysql://x.x.x.x/mydb"
      • JDBC jar是:mysql-connector-java-5.1.34.jar
      • 使用的Java是:Windows jkd1.7.0_60

      错误

      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中的

2 个答案:

答案 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