2011-01-18 9 views
1

J'ai essayé de vérifier si la connexion est en haut ou en bas à MySQL en utilisant le testeur de pool de connexion C3P0. Cela fonctionne si le mot de passe est correct. Mais le mot de passe peut être changé et je dois faire savoir à l'utilisateur qu'il n'y a pas de connexion à MySQL.Le testeur de pool de connexion C3P0 n'est pas appelé

Je veux comprendre pourquoi buildSessionFactory() ne démarre pas testeur de connexion.

J'ai utilisé Hibernate + C3P0.

Voici une ma config:

setProperty("hibernate.connection.driver_class", 
"com.mysql.jdbc.Driver"); 
setProperty("hibernate.dialect", "org.hibernate.dialect.MySQLDialect"); 
setProperty("hibernate.connection.url", "jdbc:mysql://localhost:" 
+ getDBPort() + "/emplatcore"); 
setProperty("hibernate.connection.username", Network.getInstance() 
.getMASDBAccountCred().getUserName()); 
setProperty("hibernate.connection.password", Network.getInstance() 
.getMASDBAccountCred().getPassword()); 

setProperty("hibernate.show_sql", "false"); 

setProperty("hibernate.c3p0.aquire_increment", 
Integer.toString(getConnectionAcquireIncrement())); 
setProperty("hibernate.c3p0.idle_test_period", 
Integer.toString(getIdleTestPeriod())); 
setProperty("hibernate.c3p0.timeout", 
Integer.toString(getIdleTimeout())); 
setProperty("hibernate.c3p0.max_size", 
Integer.toString(getMaxConnections())); 
setProperty("hibernate.c3p0.max_statements", 
Integer.toString(getStatementCache())); 
setProperty("hibernate.c3p0.min_size", 
Integer.toString(getInitialPoolSize())); 
setProperty(
"c3p0.connectionTesterClassName", 
"com.nortelnetworks.mcp.ne.mediaserver.db.dao.hibernate.c3p0.MCPHibernateConnectionTester"); 
setProperty("c3p0.acquireRetryAttempts", 
Integer.toString(getAcquireRetryAttempts())); 
setProperty("c3p0.acquireRetryDelay", 
Long.toString(getAcquireRetryDelay())); 

Réglages:

<parm name="ConnectionAcquireIncrement" default="2" /> 
<parm name="IdleTestPeriod" default="30"/> 
<parm name="IdleTimeOut" default="0" /> 
<parm name="MaxConnections" default="10"/> 
<parm name="StatementCache" default="5" /> 
<parm name="InitialPoolSize" default="2" /> 
<parm default="5" name="AcquireRetryAttempts" /> 
<parm default="5000" name="AcquireRetryDelay" /> 
<parm default="3306" name="Port" /> 

Il ne fait pas exception dans mon code. Ce que j'essaie de dire est que, pour une raison quelconque, MySQL DB est en baisse alors buildSessionFactory() n'est pas échoué. Comme je l'ai lu sur le forum, c'est le bon scénario. Mais j'ai créé un testeur de connexion C3P0 qui devrait fonctionner à chaque fois pour vérifier l'état de la connexion et me faire savoir si la connexion à DB est établie ou non. Mais dans ce cas, le testeur n'est pas appelé pour une raison quelconque. Je veux comprendre pourquoi cela arrive.

La documentation dit ne rien mentionner à propos de cette situation. S'il s'agit d'un bug et que le testeur doit être démarré, le problème devrait être résolu.

C'est ce dont je parle.

Répondre

1

Je ne sais pas si cela aide, mais j'ai remarqué que vous avez spécifié le paramètre IdleTestPeriod alors que, selon le C3P0 manual, il devrait être idleConnectionTestPeriod. Vérifiez également la section sur hibernate configuration. Ainsi, selon le manuel:

Si ce chiffre est supérieur à 0, c3p0 testera tous les inactifs, mais mis en commun connexions non vérifiées-out, tout ce nombre de secondes.

et la valeur par défaut est 0 - donc, s'il n'est pas configuré correctement, le testeur ne sera pas appelé. J'espère que cela t'aides.

0

J'ai eu le même problème et dans mon cas, Gradle manquait la dépendance d'hibernate c3p0. Ajouter la ligne suivante à build.gradle a fait l'affaire.

compile('org.hibernate:hibernate-c3p0:5.2.9.Final') 
Questions connexes