【问题标题】:How to detect open database connection with Hibernate / JPA?如何使用 Hibernate / JPA 检测打开的数据库连接?
【发布时间】:2011-01-07 19:58:03
【问题描述】:

我正在使用 Java SE 6 项目学习带有 Hibernate 的 JPA。我只是希望能够检测 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 ...

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

【问题讨论】:

  • J2SE 中的 JPA?那是行不通的。您是指 Java SE 还是 Java EE? JPA 是 Java EE 的一部分,因此您隐式使用 Java EE。
  • 是的 - Java SE 6 (1.6.0_18),抱歉。现已修复。

标签: java sql-server hibernate orm jpa


【解决方案1】:

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

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

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

这使您的代码具有双重不可移植性。首先,它将您与底层实现联系起来(此处为 Hibernate 的Session)。其次,您可能不会总是得到相同的结果(至少在 Java EE 容器中不会)。

真的,您不希望这样,因为这完全违背了 JPA 的意义。另外,您不想自己处理这种低级别的连接验证。

不,相反,您应该使用(独立的)连接池,它会为您解决这个问题。 c3p0 就是其中之一,可以为connection testinglogging 配置。采用连接池方式意味着更少的代码、更好的可靠性、更好的恢复能力、更好的检查,而不会失去可移植性。对我来说,这看起来像是一个 100% 双赢的局面。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      通常你使用数据源访问你的数据库,然后你配置它来做你需要的,我在这里粘贴基本配置,详细配置谷歌为它;)

      <?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>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-03-29
        • 2021-05-18
        • 1970-01-01
        • 1970-01-01
        • 2016-10-24
        • 1970-01-01
        • 2016-04-24
        • 1970-01-01
        相关资源
        最近更新 更多