当我启动我的应用程序时,我测试我的内部数据库是可以的,如下所示:
HibernateUtil.beginTransaction();
这是一个H2数据库。我在c3p0池中使用Hibernate。
麻烦是一分钟决定它不能成为交易,我希望它能在10秒内重试。我查看了c3p0属性,看不到任何可以做到这一点。
*更新* 评论让我意识到HibernateUtil.beginTransaction()隐藏了我正在做的事情,所以替换为:
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();
输出
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
所以似乎花了30秒来获得一个Session(不清楚它是如何在数据库损坏的情况下获得Session)然后19秒尝试开始交易
而当数据库很好时,时间是几秒钟
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
所以主要的问题似乎是,当数据库损坏时需要很长时间才能获得一个会话
答案 0 :(得分:1)
我想你没有为你的C3P0配置acquireRetryAttempts
,它试图连接数据库30次,这是默认值。减少这个值,你会得到更快的速度。
您也可以选择调整选项:
acquireRetryDelay
(默认值:1s)breakAfterAcquireFailure
(默认值:false)答案 1 :(得分:-1)
试试这个:HibernateUtil.getsessionfactory()。opensession();
取代:HibernateUtil.getSession();