【问题标题】:cannot achieve connectivity with MySQL db on remote machine无法在远程机器上实现与 MySQL 数据库的连接
【发布时间】:2016-01-23 14:24:36
【问题描述】:

我正在笔记本电脑上开发 Java/Spring/Hibernate/CXF/MySQL SOAP Web 服务和相应的 Web Spring MVC 客户端。计划是最终将生成的两个战争文件转移到我托管在 mybiz.com 上的远程服务器上。

笔记本电脑和服务器都有一个 MySQL 版本 5.x.x 的实例 笔记本电脑和服务器都有一个 root@localhost 用户(duh) 服务器还有其他三个用户: zzdb_admin@% zzdb_admin@localhost zzdb_admin@mybiz.com 都具有相同的密码 remotepw 并且都已授予和刷新了各种权限。

两个 MySQL 实例都有一个名为 zzdb 的数据库。 MySQL 的两个实例都将@@session.old_passwords、@@global.old_passwords 和@@global.secure_auth 设置为0;在所有情况下,密码的哈希值都是 41 个字符宽。

直接登录远程服务器时,我可以手动登录两台机器上的所有帐户

mysql --user=root --password=remoterootpw
mysql --user=zzdb_admin --password=remotepw
mysql --host=localhost --user=zzdb_admin --password=remotepw

在笔记本电脑上我可以登录到本地 mysql

mysql --user=root --password=localrootpw
mysql --host=mybiz.com --user=zzdb_admin --password=remotepw

所以所有用户和密码都是正确的。它们的哈希值都是 41 个字符。重要提示:请注意,这最后证明可以与远程计算机上的实例建立连接。

webservice'pom 的 mysql-connector-java 版本为 5.1.8。

现在变得很奇怪。在 web 服务的属性文件中使用这些行:

hibernate.connection.url=jdbc:mysql://localhost:3306/zzdb
hibernate.connection.username=root
hibernate.connection.password=localrootpw

webapp 可以连接到本地数据库实例,一切都很好。但是仅将这三行更改为

hibernate.connection.url=jdbc:mysql://mybiz.com:3306/zzdb
hibernate.connection.username=zzdb_admin
hibernate.connection.password=remotepw

抛出可怕的“用户 'zzdb_admin'@'localhost' 的访问被拒绝”错误

这让我拔出了我剩下的几根头发。看起来我没有遗漏任何东西,并且所有内容都拼写正确。有人知道发生了什么吗?

TIA,

还在学习的史蒂夫

附录:尝试一种不同的、更简单的方法成功了!

Class.forName("com.mysql.jdbc.Driver");
String connectionUrl = "jdbc:mysql://mybiz.com/zzdb?user=zzdb_admin&password=remoteapw";
Connection conn = DriverManager.getConnection(connectionUrl);

现在怎么样?唯一的变化是连接的方法。疯了

【问题讨论】:

    标签: java mysql hibernate jdbc


    【解决方案1】:

    MySQL 远程链接有一个绑定地址。你应该评论它。可以参考this blog

    【讨论】:

      【解决方案2】:

      解决了这个问题,哦,这是一个多么微妙的问题!

      Web 服务基础的 applicationContext.xml 使用 Atomikos bean 作为数据源

      <bean id="dataSourceServerA" class="com.atomikos.jdbc.AtomikosDataSourceBean" init-method="init" destroy-method="close">
        <property name="uniqueResourceName"    value="XADBMS_A" />
        <property name="xaDataSourceClassName" value="com.mysql.jdbc.jdbc2.optional.MysqlXADataSource" />
        <property name="xaProperties">  <!-- properties will be different for different data sources ie MySQL/HSDB/DB2 etc -->
          <props>
              <prop key="uri">$dbServerA{hibernate.connection.uri}</prop>
              <prop key="user">$dbServerA{hibernate.connection.username}</prop>
              <prop key="password">$dbServerA{hibernate.connection.password}</prop>
          </props>
      </property>
      <property name="poolSize"><value>20</value></property>
      <property name="testQuery" value="SELECT 1" />
      

      又在 EntityManagerFactor bean 中使用。只要我指向 MySQL 的本地实例,此配置就可以很好地工作。无论我做什么,将配置更改为指向远程实例都会失败,并引用 zzdb_admin@localhost。

      所以我创建了第二个更简单的连接测试器,仅使用

      Class.forName("com.mysql.jdbc.Driver");
      String connectionUrl = "jdbc:mysql://mybiz.com/zzdb?user=zzdb_admin&password=removepw";
      theApp.conn = DriverManager.getConnection(connectionUrl);
      

      还有尤里卡!它可以建立远程连接。所以这让我想到问题出在 Atomikos bean 配置上。

      原来我没有设置一个关键的 xaProperty - serverName,当没有明确设置默认值时 - 你猜对了 - localhost。 Atomikos 不够“聪明”,无法从传递给它的 uri 中推断出主机名。

      所以只是切换到

      <bean id="dataSourceServerA" class="com.atomikos.jdbc.AtomikosDataSourceBean" init-method="init" destroy-method="close">
        <property name="uniqueResourceName"    value="XADBMS_A" />
        <property name="xaDataSourceClassName" value="com.mysql.jdbc.jdbc2.optional.MysqlXADataSource" />
        <property name="xaProperties">  <!-- properties will be different for different data sources ie MySQL/HSDB/DB2 etc -->
          <props>
              <prop key="serverName">mybiz.com</prop>
              <prop key="port">3306</prop>
              <prop key="databaseName">zzdb</prop>
              <prop key="user">$dbServerA{hibernate.connection.username}</prop>
              <prop key="password">$dbServerA{hibernate.connection.password}</prop>
          </props>
      </property>
      <property name="poolSize"><value>20</value></property>
      <property name="testQuery" value="SELECT 1" />
      

      成功了。所以问题是配置之一。确实非常微妙!

      感谢所有回复的人!

      结案!

      还在学习的史蒂夫

      【讨论】:

        猜你喜欢
        • 2018-08-29
        • 1970-01-01
        • 2023-04-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-08
        • 2014-08-26
        • 1970-01-01
        相关资源
        最近更新 更多