无法在远程计算机上实现与MySQL数据库的连接

时间:2015-10-23 23:05:00

标签: java mysql hibernate jdbc

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

笔记本电脑和服务器都有MySQL版本5.x.x的实例 笔记本电脑和服务器都有root @ localhost用户(duh) 该服务器还有三个其他用户: zzdb_admin @% zzdb_admin @本地 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的版本为5.1.8的mysql-connector-java。

现在变得奇怪了。在webservice的属性文件中使用这些行:

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);

那怎么样?只有改变是连接的方法。疯狂的

3 个答案:

答案 0 :(得分:0)

我不确定,但mysql有一个用户权限选项。因此,您的zzdb_admin用户可能没有远程连接访问权限。您可以从mysql工作台

查看权限

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

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);

和EUREKA!它可以进行远程连接。所以这让我觉得问题不得不依赖于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" />

做了这个伎俩。所以问题就是配置问题。确实非常微妙!

感谢所有回复的人!

CASE CLOSED!

仍在学习史蒂夫