2017-05-19 3 views
0

J'ai un cas étrange sur le pool de connexion C3P0 configuré avec Hibernate JPA via persistence.xml.C3P0 Pool se connecte au mauvais serveur MySQL

Ceci est mon persistence.xml:

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<persistence xmlns="http://java.sun.com/xml/ns/persistence" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.0" 
      xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"> 
    <persistence-unit name="public_db" transaction-type="RESOURCE_LOCAL"> 

     <description>MySQL Persistence Unit</description> 
     <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider> 

     <properties> 
      <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" /> 
      <property name="javax.persistence.jdbc.url" value="jdbc:mysql://AAA.BBB.CCC.DDD:3306/public_db" /> 
      <property name="javax.persistence.jdbc.user" value="USERNAME" /> 
      <property name="javax.persistence.jdbc.password" value="SECRET" /> 
      <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" /> 

      <property name="hibernate.hbm2ddl.auto" value="update" /> 
      <property name="hibernate.show_sql" value="true" /> 
      <property name="hibernate.format_sql" value="true" /> 
      <property name="hibernate.transaction.flush_before_completion" value="false" /> 

      <property name="hibernate.connection.provider_class" 
         value="org.hibernate.connection.C3P0ConnectionProvider" /> 
      <property name="hibernate.c3p0.min_size" value="5" /> 
      <property name="hibernate.c3p0.max_size" value="50" /> 
      <property name="hibernate.c3p0.timeout" value="500" /> 
      <property name="hibernate.c3p0.max_statements" value="50" /> 
      <property name="hibernate.c3p0.idle_test_period" value="2000" /> 
     </properties> 
    </persistence-unit> 

<persistence> 

Après avoir construit des paquets application JAR, si je cours sur la machine locale, cela fonctionne, il peut se connecter au serveur MySQL à AAA.BBB.CCC.DDD.

Cependant, si j'exécute l'application JAR sur un serveur distant, j'obtiens l'erreur:

[2017-05-19 11:11:02,509 +0700] [DEBUG] [c.m.v.r.BasicResourcePool] An exception occurred while acquiring a poolable resource. Will retry. 
    java.sql.SQLException: Access denied for user 'USRENAME'@'AAA.BBB.CCC.EEE' (using password: YES) 
      at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:964) 
      at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3970) 
      at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3906) 
      at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:873) 
      at com.mysql.jdbc.MysqlIO.proceedHandshakeWithPluggableAuthentication(MysqlIO.java:1710) 
      at com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1226) 
      at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2253) 
      at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2284) 
      at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2083) 
      at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:806) 
      at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:47) 
      at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
      at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) 
      at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 
      at java.lang.reflect.Constructor.newInstance(Constructor.java:423) 
      at com.mysql.jdbc.Util.handleNewInstance(Util.java:425) 
      at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:410) 
      at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:328) 
      at com.mchange.v2.c3p0.DriverManagerDataSource.getConnection(DriverManagerDataSource.java:175) 
      at com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:220) 
      at com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:206) 
      at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1PooledConnectionResourcePoolManager.acquireResource(C3P0PooledConnectionPool.java:203) 
      at com.mchange.v2.resourcepool.BasicResourcePool.doAcquire(BasicResourcePool.java:1138) 
      at com.mchange.v2.resourcepool.BasicResourcePool.doAcquireAndDecrementPendingAcquiresWithinLockOnSuccess(BasicResourcePool.java:1125) 
      at com.mchange.v2.resourcepool.BasicResourcePool.access$700(BasicResourcePool.java:44) 
      at com.mchange.v2.resourcepool.BasicResourcePool$ScatteredAcquireTask.run(BasicResourcePool.java:1870) 
      at com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:696) 

Chose étrange que j'ai configuré le serveur à AAA.BBB.CCC.DDD mais la source de données C3P0 tente de se connecter au serveur MySQL à l'hôte distant, qui est AAA.BBB.CCC.EEE.

Je ne place aucune place dans le code avec localhost ou AAA.BBB.CCC.EEE.

Quelqu'un a-t-il déjà ressenti cela?

Répondre

0

Après un creusement, cela ressemble à un problème de configuration réseau et DB. Le compte DB lors de l'exécution sur un hôte distant n'a pas l'autorisation d'accéder au serveur de base de données. Donc, juste corriger la permission, alors ça fonctionne! La chose étrange de ce problème est que si le délai de connexion DB sur C3P0, il revient à la mise en commun sur la machine actuelle, de sorte que le message d'erreur sur l'adresse IP DB est très difficile à disséquer le problème.