2010-10-05 29 views
2

我想弄清楚如何配置我的项目,使JPA超时并在配置的时间量后抛出异常。有两种情况下,我想这样的事情发生:JPA(和/或Hibernate) - 如何为连接和/或查询设置超时阈值?

  • 当JPA是甚至无法连接到数据库
  • 当JPA查询时间超过超时临界值更长的时间才能返回结果集

我不知道,如果这两种情况可以(对于每个不同的超时阈值)被分开地构造,或者如果一个阈值用于两者。

我的项目是当前设置如下:

  • 编码到JPA 2.0规范
  • 使用Hibernate 3.5.6作为JPA实现
  • 使用C3P0连接与Hibernate池
  • 使用persistence.xml配置文件(使用Hibernate的相关属性值仅在必要时)
  • 我们ing任何Hibernate特定的配置文件

回答

6

JPA2持久财产“javax.persistence.query.timeout”允许您设置的查询超时(假设底层的JDBC驱动程序支持的话)。

+0

+1在这个属性的单挑。不幸的是,它似乎不适用于ojdbc14.jar文件中的Oracle JDBC驱动程序。我无法获得更新的驱动程序,因为该项目正在使用Oracle 10g服务器,并且暂时不会升级。 – 2010-10-05 16:40:52

1

This page on the Hibernate wiki详细说明如何配置c3p0连接池,包括超时设置。

请注意,这些类型的细节实际上与JPA或Hibernate没有多大关系,但它们是您在DataSource /数据库连接(本例中为c3p0)本身设置的设置。

+0

所以这似乎回答我有关连接超时的问题,但我仍不很了解如何为查询设置超时。当你说“数据源”时,你是指JDBC层的东西吗?我如何从JPA访问它? – 2010-10-05 16:17:12

+0

纠正我,如果我错了,但C3P0只会汇集连接,并且您仍然需要配置底层数据源 - 是吗?如果是的话是什么我指的是,你需要配置超时底层的JDBC驱动程序,既获得连接和个人查询 – 2010-10-05 16:25:07

+0

来设置我唯一需要的连接属性是驱动程序类(oracle.jdbc。 OracleDriver),连接URL(jdbc:oracle:thin:@myhost:1521:ORCL)以及用户和密码。这些都是通过persistence.xml文件中的4个标准JPA 2属性完成的。如果我想尝试配置JDBC的话,我不知道该去哪里。 – 2010-10-05 16:37:24

0

您应该设置Java客户端以及数据库服务器默认超时: 如果您使用的是Spring,请使用@Transactional(timeout = 10),最终设置preparedStatement.setQueryTimeout()提示以关闭10内的事务秒。 同时,使您的服务器到客户端超时略高于超时,这样的“Java客户端用户”超时,也就是说,在15秒: https://mariadb.com/kb/en/mariadb/query-limits-and-timeouts/

+0

Ofcourse,对于Spring + Hibernate的堆栈,您必须在超时时添加1秒以避免此错误: https://hibernate.atlassian.net/browse/HHH-9482 – kisna 2016-04-27 23:59:26