JBoss连接池出现意外问题

时间:2014-01-17 09:22:34

标签: oracle hibernate jboss transactions jta

我花了最后几天试图在几天前提出的开发过程中找到一些新问题的原因......我还没有找到它。但我找到了解决方法。但让我们从问题本身开始。

我们正在使用 JBoss EAP 6.1.0.GA(AS 7.2.0.Final-redhat-8)作为我们的大型企业项目的应用服务器。 JPA层由 Hibernate Core {4.2.0.Final-redhat-1} 使用 oracle.jdbc.OracleDriver(版本11.2)连接 Oracle 11.2来处理。 0.3.0

几个星期前,一切都按预期工作,我们没有数据库相关的问题。我们使用以下数据源:

<datasource jta="true" jndi-name="java:/myDS" pool-name="myDS" enabled="true" use-java-context="true" use-ccm="true">
    <connection-url>jdbc:oracle:thin:@192.168.0.93:1521:DEV</connection-url>
    <driver>oracle</driver>
    <transaction-isolation>TRANSACTION_READ_COMMITTED</transaction-isolation>
    <pool>
        <min-pool-size>1</min-pool-size>
        <max-pool-size>20</max-pool-size>
        <prefill>true</prefill>
        <use-strict-min>false</use-strict-min>
        <flush-strategy>FailingConnectionOnly</flush-strategy>
    </pool>
    <security>
        <user-name>MY_DB</user-name>
        <password>pass</password>
    </security>
</datasource>

大多数时候我们有5到10个打开的连接,使用1-3(单一开发环境)......池保持这个级别并且工作得很好。

但是对我们的代码进行了一些未知的更改,池停止工作......不再释放它的连接......甚至根本没有重用它们!它花了一些简单的请求来填充池,最多连接20个连接,JPA拒绝任何新的数据库查询。

我们花了几天的时间来查找代码的相关更改......但没有成功!

今天我发现了一种解决方法。我们稍微更改了persistence.xml:

<persistence-unit name="myPU">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <jta-data-source>java:/myDS</jta-data-source>
    <properties>
        <property name="jboss.entity.manager.factory.jndi.name"     value="java:/myDSMF" />
        <property name="hibernate.dialect"                          value="org.hibernate.dialect.Oracle10gDialect" />
        <property name="hibernate.transaction.manager_lookup_class" value="org.hibernate.transaction.JBossTransactionManagerLookup" />
        <property name="hibernate.default_batch_fetch_size"         value="1000" />
        <property name="hibernate.jdbc.batch_size"                  value="0" />
        <property name="hibernate.connection.release_mode"          value="after_statement" />
   <!-- <property name="hibernate.connection.release_mode"          value="after_transaction" /> -->
        <property name="hibernate.connection.SetBigStringTryClob" value="true" />
    </properties>
</persistence-unit>

hibernate.connection.release_modeafter_transaction更改为after_statement就可以了。但之前从未接触过这种设定。现在连接按预期释放,并且池可以再次使用。

我不明白为什么after_transaction不再起作用...因为提交了更改。我们在数据库中看到了所有这些东西。提交交易应该结束 - 不是吗?

虽然我发现这个简单的解决方法,但我真的知道了这个问题。我没有把这种知识推迟到制作时间的感觉。所以任何反馈都非常感谢!谢谢!

1 个答案:

答案 0 :(得分:1)

您正在使用 JTA 。因此, after_transaction 模式从不推荐用于JTA事务。

以下是JBOSS网站上的文件。

  

after_transaction - 说要使用   ConnectionReleaseMode.AFTER_TRANSACTION的。 此设置不应该是   在JTA环境中使用。另请注意   ConnectionReleaseMode.AFTER_TRANSACTION,如果考虑会话   在自动提交模式下,连接将被释放,就像释放一样   模式是AFTER_STATEMENT。

因此您应该明确使用自动 after_statement 来积极释放连接。

参考

Connection Release Modes