我正在笔记本电脑上开发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
在笔记本电脑上,我可以使用
登录本地mysqlmysql --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);
那怎么样?只有改变是连接的方法。疯狂的
答案 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!
仍在学习史蒂夫