首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JBoss连接池的意外问题

JBoss连接池的意外问题
EN

Stack Overflow用户
提问于 2014-01-17 09:22:33
回答 1查看 9.2K关注 0票数 4

我花了几天时间试图找出几天前在开发过程中出现的一些新问题的原因.我还没找到呢。但我找到了解决办法。但让我们从问题本身开始。

我们使用JBoss EAP 6.1.0.GA (作为7.2.0.Final-redhat-8)作为我们的应用服务器,用于一个相当大的企业项目。JPA层由Hibernate Core {4.2.0、1}使用oracle.jdbc.OracleDriver (Version 11.2)连接 11.2.0.3.0进行处理。

几周前,一切都如期而至,我们没有数据库相关的问题。我们使用了以下数据源:

代码语言:javascript
复制
<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:

代码语言:javascript
复制
<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不再工作了..。因为已经提交了更改。我们在数据库中看到了所有这些东西。而提交一笔交易应该结束它-不是吗?

虽然我已经找到了一个简单的解决办法,但我还是会真正了解这个问题。我没有好的感觉把这些知识推迟到生产时间。因此,任何反馈都是非常感谢的!谢谢!

EN

回答 1

Stack Overflow用户

发布于 2015-06-29 15:05:06

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

这是JBOSS的文档。

after_transaction -说要使用ConnectionReleaseMode.AFTER_TRANSACTION。此设置不应在JTA环境中使用。还请注意,如果使用ConnectionReleaseMode.AFTER_TRANSACTION,如果会话被认为处于自动提交模式,连接将被释放,就好像发布模式是AFTER_STATEMENT一样。

因此,您应该显式地使用after_statementauto来积极地释放连接。

参考文献

连接释放方式

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21182114

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档