繁体   English   中英

如何使用Hibernate / JPA检测开放数据库连接?

[英]How to detect open database connection with Hibernate / JPA?

我正在使用Java SE 6项目学习JPA w / Hibernate。 我只是希望能够检测Hibernate和我的数据库(MS SQL Server)之间的连接是否打开。 例如,我希望能够检测到这一点,记录它,并尝试在60秒内重新连接。

这是我认为会起作用但isOpen()似乎不是我想要的(总是如此):

EntityManagerFactory emf = Persistence.createEntityManagerFactory("rcc", props);
if (emf != null && emf.isOpen()) {
    EntityManager em = emf.createEntityManager();
    if (em == null || !emf.isOpen())
        // error connecting to database
    else ...

这在我看来是一个简单的问题,但我找不到答案!

我只是希望能够检测Hibernate和我的数据库(MS SQL Server)之间的连接是否打开。 例如,我希望能够检测到这一点,记录它,并尝试在60秒内重新连接。

您确实可以使用getDelegate()来获取EntityManager的底层提供程序对象,然后访问底层的JDBC Connection 但请仔细阅读javadoc:

返回EntityManager的基础提供程序对象(如果可用)。 此方法的结果是特定于实现的。

这使您的代码双重不可移植。 首先,它将您与底层实现联系起来(Hibernate的Session在这里)。 其次,您可能无法始终获得相同的结果(至少不会在Java EE容器中)。

真的,你不要这样,因为这完全违背了JPA的观点。 此外,您不希望自己处理此低级别连接验证。

不,相反, 您应该使用(独立)连接池来为您处理。 c3p0是其中之一,可以配置连接测试日志记录 采用连接池方式意味着更少的代码,更好的可靠性,更好的恢复能力,更好的检查,而不会丢失可移植性。 对我来说这看起来像是一个100%的双赢局面。

我的经历是NHibernate。 我希望它翻译。 在早期版本中,它非常积极地关闭了数据库连接。 在以后的版本中有一个选项可以让它保持打开状态。 你可以在Hibernate上检查一下。

通常您使用数据源访问您的数据库,并将其配置为执行您需要的操作,我在此处粘贴基本配置,以便为其详细配置google;)

<?xml version="1.0" encoding="UTF-8"?>

<datasources>
    <local-tx-datasource>
    <jndi-name>EnterpriseDS</jndi-name>
    <connection-url>jdbc:oracle:thin:@oracle10g:1521:sid</connection-url>
    <driver-class>oracle.jdbc.driver.OracleDriver</driver-class>
    <user-name>username</user-name>
    <password>password</password>

    <min-pool-size>5</min-pool-size>
    <max-pool-size>100</max-pool-size>
    <query-timeout>60</query-timeout>

    <exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.OracleExceptionSorter</exception-sorter-class-name>  

    <metadata>
        <type-mapping>Oracle10g</type-mapping>
    </metadata>

  </local-tx-datasource>

</datasources>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM