【问题标题】:How do I test Hibernate Database is okay, quickly如何快速测试 Hibernate 数据库是否正常
【发布时间】:2012-11-21 11:26:49
【问题描述】:

当我启动我的应用程序时,我测试我的内部数据库是否正常,如下所示:

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

所以主要问题似乎是当数据库损坏时(某种程度上)获得一个会话需要很长时间

【问题讨论】:

标签: java database hibernate h2 c3p0


【解决方案1】:

我想你没有为你的 C3P0 配置 acquireRetryAttempts 并且它尝试连接到数据库 30 次,这是默认值。减小这个值,你会更快地得到它。

还有一些您可能想要调整的选项:

  • acquireRetryDelay(默认:1s)
  • breakAfterAcquireFailure(默认:false)

【讨论】:

  • 我将“hibernate.c3p0.acquireRetryAttempts”从 30 减少到 10(因为在实际正常使用应用程序时我需要重试一些)并且将超时减少到更可接受的水平,尽管仍然大于 10秒。
【解决方案2】:

试试这个:HibernateUtil.getsessionfactory().opensession();

代替:HibernateUtil.getSession();

【讨论】:

  • 我的 HibernateUtil 类中没有那个类,但是改变它的目的是什么。
猜你喜欢
  • 1970-01-01
  • 2015-08-20
  • 1970-01-01
  • 2010-09-05
  • 1970-01-01
  • 2014-03-01
  • 2011-09-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多