加入收藏 | 设为首页 | 会员中心 | 我要投稿 辽源站长网 (https://www.0437zz.com/)- 云专线、云连接、智能数据、边缘计算、数据安全!
当前位置: 首页 > 站长百科 > 正文

oracle – JBoss连接池的意外问题

发布时间:2021-01-12 22:00:37 所属栏目:站长百科 来源:网络整理
导读:我花了最后几天试图在几天前提出的开发过程中找到一些新问题的原因……而我还没有找到它.但我找到了解决方法.但让我们从问题本身开始. 我们使用JBoss EAP 6.1.0.GA(AS 7.2.0.Final-redhat-8)作为我们的应用服务器,用于一个相当大的企业项目. JPA层由Hibernat

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

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

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

<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_mode从after_transaction更改为after_statement就可以了.但之前从未接触过这种设定.现在连接按预期释放,并且池再次可用.

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

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

解决方法

您正在使用JTA.所以after_transaction模式从不推荐用于JTA事务.

这是JBOSS网站上的文件.

after_transaction – says to use
ConnectionReleaseMode.AFTER_TRANSACTION. This setting should not be
used in JTA environments. Also note that with
ConnectionReleaseMode.AFTER_TRANSACTION,if a session is considered to
be in auto-commit mode connections will be released as if the release
mode were AFTER_STATEMENT.

所以你应该明确地使用auto或after_statement来积极地释放连接.

参考

Connection Release Modes.

(编辑:辽源站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读