2012-11-21 2 views
0

Quand je commence ma demande je teste ma base de données interne est correcte comme suit:Comment tester la base de données Hibernate est correct, rapidement

HibernateUtil.beginTransaction(); 

Ceci est une base de données de H2. J'utilise Hibernate en haut avec le pooling c3p0.

Problème est-il prend une minute pour décider qu'il ne peut pas être une transaction, je voudrais réessayer dans les 10 secondes. J'ai regardé les propriétés c3p0 et je ne vois rien qui puisse le faire.

* Mise à jour * Commentaire m'a fait réaliser que HibernateUtil.beginTransaction() se cachait ce que je faisais alors remplacé par:

System.out.println("Get Session"+new Date()); 
Session session = com.jthink.songlayer.hibernate.HibernateUtil.getSession(); 
System.out.println("Get Txn"+new Date()); 
Transaction t = session.getTransaction(); 
System.out.println("Set Timeout"+new Date()); 
t.setTimeout(10); 
System.out.println("Begin Txn"+new Date()); 
session.beginTransaction(); 
System.out.println("Commit"+new Date()); 
t.commit(); 

sortie est

Get SessionWed Nov 21 12:15:56 GMT 2012 
Get TxnWed Nov 21 12:16:27 GMT 2012 
Set TimeoutWed Nov 21 12:16:27 GMT 2012 
Begin TxnWed Nov 21 12:16:27 GMT 2012 
FailedWed Nov 21 12:16:46 GMT 2012 

Il semble donc 30 secondes est passé à obtenir une session (pas clair comment il peut même obtenir une session que la base de données est corrompue) et puis 19 secondes en essayant de commencer la transaction

alors que lorsque la base de données est très bien, les horaires sont quelques secondes

Get SessionWed Nov 21 12:23:57 GMT 2012 
Get TxnWed Nov 21 12:23:59 GMT 2012 
Set TimeoutWed Nov 21 12:23:59 GMT 2012 
Begin TxnWed Nov 21 12:23:59 GMT 2012 
CommitWed Nov 21 12:23:59 GMT 2012 

Le problème principal semble être qu'il faut de longue date à (sorte de) obtenir une session quand db corrompu

+0

Est-ce que ce fil vous aide? http://stackoverflow.com/questions/635047/transaction-timeout-not-working-on-hibernate-with-oracle – lcguida

+0

thx, aide mais ne résout pas le problème. –

Répondre

1

I supposons que vous n'avez pas configuré acquireRetryAttempts pour votre C3P0 et qu'il essaie de se connecter à la base de données pendant 30 fois, ce qui est la valeur par défaut. Diminuez cette valeur et vous l'obtiendrez beaucoup plus rapidement.

Il y a aussi des options que vous souhaitez régler:

  • acquireRetryDelay (par défaut: 1s)
  • breakAfterAcquireFailure (par défaut: false)
+0

Ah, merci qui a du sens –

+0

J'ai diminué "hibernate.c3p0.acquireRetryAttempts" de 30 à 10 (comme j'ai besoin de nouvelles tentatives pour quand utiliser réellement l'application normalement) et qui a réduit le délai à un niveau plus acceptable, bien que toujours supérieur à 10 secondes. –

-1

Essayez ceci: HibernateUtil.getSessionFactory(). opensession();

À la place de: HibernateUtil.getSession();

+0

Je n'ai pas cette classe dans ma classe HibernateUtil, mais quel serait le but de changer cela. –

Questions connexes