java应用程序无法连接到远程MySQL数据库,但可以连接到本地MySQL数据库

java应用程序无法连接到远程MySQL数据库,但可以连接到本地MySQL数据库,java,mysql,hibernate,Java,Mysql,Hibernate,给定两个MySQL服务器,一个本地,一个远程。 两者都有一个数据库foobar,其中包含一个表bohica。 本地服务器已定义用户“myadmin”@“%”、“myadmin”@“localhost”。 远程服务器定义了用户“myadmin”@“%”、“myadmin”@“localhost”和“myadmin”@“my.domain.com” 已将权限授予所有这些用户,并刷新了权限 两台服务器都已启动 从命令提示符窗口,我可以连接到两台服务器,即 mysql --user=myadmin --

给定两个MySQL服务器,一个本地,一个远程。 两者都有一个数据库foobar,其中包含一个表bohica。 本地服务器已定义用户“myadmin”@“%”、“myadmin”@“localhost”。 远程服务器定义了用户“myadmin”@“%”、“myadmin”@“localhost”和“myadmin”@“my.domain.com”

已将权限授予所有这些用户,并刷新了权限

两台服务器都已启动

从命令提示符窗口,我可以连接到两台服务器,即

mysql --user=myadmin --password=mylocalpw
mysql --user=myadmin --password=myremotepw --host=my.domain.com
两者都成功了,这证明我可以访问并登录到远程服务器

我的java/maven/hibernate应用程序有一个上下文文件

...
<bean id="databasePropertiesServerB"
  class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<!--
  <property name="location"          value="classpath:databaseServerBlocal.properties" />
-->
  <property name="location"          value="classpath:databaseServerBliveadmin.properties" />
  <property name="placeholderPrefix" value="$dbServerB{" />
  <property name="placeholderSuffix" value="}" />
</bean>

<bean id="dataSourceServerB"  class="com.atomikos.jdbc.AtomikosDataSourceBean" init-method="init" destroy-method="close">
  <property name="uniqueResourceName"    value="XADBMS_B" />
  <property name="xaDataSourceClassName" value="com.mysql.jdbc.jdbc2.optional.MysqlXADataSource" />
  <property name="xaProperties">
      <props>
          <prop key="databaseName">foobar</prop>
          <prop key="user">$dbServerB{hibernate.connection.username}</prop>
          <prop key="password">$dbServerB{hibernate.connection.password}</prop>
      </props>
  </property>
  <property name="poolSize"><value>20</value></property>
  <property name="testQuery" value="SELECT 1" />
</bean> 

<bean id="emfB" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
  <property name="packagesToScan"         value="com.mybiz.forms" />
  <property name="dataSource"             ref="dataSourceServerB" />
  <property name="jpaDialect"             ref="jpaHibernateDialect" />
  <property name="jpaVendorAdapter"       ref="jpaHibernateVendorAdapter" />
  <property name="jpaProperties">
    <props>
      <prop key="hibernate.dialect">$dbServerB{hibernate.dialect}</prop>
      <prop key="hibernate.connection.characterEncoding">$dbServerB{hibernate.connection.characterEncoding}</prop>
      <prop key="hibernate.connection.driver_class">$dbServerB{hibernate.connection.driver_class}</prop>
      <prop key="hibernate.connection.url">$dbServerB{hibernate.connection.url}</prop>
      <prop key="hibernate.connection.release_mode">$dbServerB{hibernate.connection.release_mode}</prop>
      <prop key="hibernate.cache.provider_class">$dbServerB{hibernate.cache.provider_class}</prop>
      <prop key="hibernate.c3p0.min_size">$dbServerB{hibernate.c3p0.min_size}</prop>
      <prop key="hibernate.c3p0.max_size">$dbServerB{hibernate.c3p0.max_size}</prop>
      <prop key="hibernate.c3p0.timeout">$dbServerB{hibernate.c3p0.timeout}</prop>
      <prop key="hibernate.c3p0.max_statements">$dbServerB{hibernate.c3p0.max_statements}</prop>
      <prop key="hibernate.show_sql">$dbServerB{hibernate.show_sql}</prop>
      <prop key="hibernate.format_sql">$dbServerB{hibernate.format_sql}</prop>
      <prop key="hibernate.hbm2ddl.auto">$dbServerB{hibernate.hbm2ddl.auto}</prop>
      <prop key="hibernate.transaction.factory_class">com.atomikos.icatch.jta.hibernate3.AtomikosJTATransactionFactory</prop>
      <prop key="hibernate.transaction.manager_lookup_class">com.atomikos.icatch.jta.hibernate3.TransactionManagerLookup</prop>
    </props>
  </property>
</bean> 
...
和databaseServerBlocaladmin.properties

hibernate.dialect=org.hibernate.dialect.MySQLInnoDBDialect
hibernate.connection.characterEncoding=UTF-8
hibernate.connection.driver_class=com.mysql.jdbc.Driver
hibernate.connection.url=jdbc:mysql://my.domain.com:3306/foobar
hibernate.connection.username=myadmin
hibernate.connection.password=myremotepw
hibernate.connection.release_mode=after_transaction
hibernate.cache.provider_class=org.hibernate.cache.NoCacheProvider
hibernate.c3p0.init_size=10
hibernate.c3p0.min_size=10
hibernate.c3p0.max_size=50
hibernate.c3p0.timeout=600
hibernate.c3p0.max_statements=50
hibernate.show_sql=false
hibernate.format_sql=true
hibernate.hbm2ddl.auto=create
hibernate.dialect=org.hibernate.dialect.MySQLInnoDBDialect
hibernate.connection.characterEncoding=UTF-8
hibernate.connection.driver_class=com.mysql.jdbc.Driver
hibernate.connection.url=jdbc:mysql://localhost:3306/foobar
hibernate.connection.username=myadmin
hibernate.connection.password=mylocalpw
hibernate.connection.release_mode=after_transaction
hibernate.cache.provider_class=org.hibernate.cache.NoCacheProvider
hibernate.c3p0.init_size=10
hibernate.c3p0.min_size=10
hibernate.c3p0.max_size=50
hibernate.c3p0.timeout=600
hibernate.c3p0.max_statements=50
hibernate.show_sql=false
hibernate.format_sql=true
hibernate.hbm2ddl.auto=update
现在它变得奇怪了。 当我调整“databasePropertiesServerB”bean中的“location”属性值以使用databaseServerBlocal.properties时, 该应用程序可以连接到本地服务器,并按预期执行操作

但是(而且你知道有一个但是来了…)

当我调整“databasePropertiesServerB”bean中的“location”属性值以使用databaseServerBliveadmin.properties时,我得到了可怕的结果

java.sql.SQLException: Access denied for user 'myadmin'@'localhost' (using password: YES)
嗯。我可以手动登录到远程服务器,这证明用户名和密码是正确的。 我一直非常小心地在两个.properties文件中正确拼写用户名和密码值-没有尾随空格,等等。所以我在这一点上被难住了。有什么想法吗

蒂亚


仍在学习Stev

完整答案出现在后面的问题中

基本上,hibernate属性文件的所有内容以及MySQL两个实例上的帐户和密码都是正确的-原因是没有在entity manager工厂bean使用的Atomikos数据源bean中显式设置xaProperties.server属性-如果没有显式设置,则默认设置为“localhost”,当然,这在远程机器上不起作用,因为它试图以xxxxx身份登录。%

鬼鬼祟祟的

结案


仍在学习的Steve

完整答案出现在后面的问题中

基本上,hibernate属性文件的所有内容以及MySQL两个实例上的帐户和密码都是正确的-原因是没有在entity manager工厂bean使用的Atomikos数据源bean中显式设置xaProperties.server属性-如果没有显式设置,则默认设置为“localhost”,当然,这在远程机器上不起作用,因为它试图以xxxxx身份登录。%

鬼鬼祟祟的

结案


仍在学习Steve

在创建DB用户帐户时,我会避免使用%(通配符)。这允许任何知道用户名/密码的服务器进行连接。此外,我喜欢为每个应用程序使用唯一的用户名来增强安全性。最后,永远不要在公共DNS中放置DB主机。如果您使用的是linux,则应将其保存在内部和/etc/hosts文件中。错误消息似乎是在使用其他属性文件。我将创建一个不同的用户帐户和密码,然后尝试重新连接。否,我可以通过临时将用户名更改为helloThere来确认选择时是否正在使用databaseServerBliveadmin.properties,并确保错误消息中显示了这一点。您正在使用hibernate.hbm2ddl.auto=create for databaseServerBliveadmin.properties文件和hibernate.hbm2ddl.auto=update for databaseServerBlocaladmin.properties文件。我想这就是问题所在。请检查。好的。告诉我,如果是远程服务器,您是否从头开始创建数据库?也可以试试jdbc:mysql://my.domain.com:3306/foobar?user=myadmin&password=myremotepw 在创建DB用户帐户时,我会避免使用%(通配符)。这允许任何知道用户名/密码的服务器进行连接。此外,我喜欢为每个应用程序使用唯一的用户名来增强安全性。最后,永远不要在公共DNS中放置DB主机。如果您使用的是linux,则应将其保存在内部和/etc/hosts文件中。错误消息似乎是在使用其他属性文件。我将创建一个不同的用户帐户和密码,然后尝试重新连接。否,我可以通过临时将用户名更改为helloThere来确认选择时是否正在使用databaseServerBliveadmin.properties,并确保错误消息中显示了这一点。您正在使用hibernate.hbm2ddl.auto=create for databaseServerBliveadmin.properties文件和hibernate.hbm2ddl.auto=update for databaseServerBlocaladmin.properties文件。我想这就是问题所在。请检查。好的。告诉我,如果是远程服务器,您是否从头开始创建数据库?也可以试试jdbc:mysql://my.domain.com:3306/foobar?user=myadmin&password=myremotepw 在属性文件中。