【问题标题】:JBoss database connection pool auto-commit behaviorJBoss 数据库连接池自动提交行为
【发布时间】:2011-03-26 15:47:15
【问题描述】:

我们使用 JBoss 4 和 Oracle 以及通过 JBoss 数据源 XML 文件配置的 JNDI 数据源。

最近意识到默认情况下从数据源获取的所有连接都将自动提交属性设置为true。但是,我们依赖于 Oracle 存储过程,并希望控制存储过程中的提交。

我们使用普通的 JDBC 调用以及 Spring StoredProcedure 包装器从 JBoss 调用存储过程。尝试从 JBoss 数据源 XML 设置自动提交并没有真正奏效。

我只能看到,对于我们从数据源获得的每个连接,我们可以将自动提交属性设置为 false,但是有人知道我们如何在一个地方进行配置吗?

编辑:我正在添加我们使用的数据源配置:

<local-tx-datasource>
    <jndi-name>some name</jndi-name>
    <connection-url>jdbc:oracle:thin:@(description=(address_list=(address=(protocol=tcp)(port=1521)(host=xxx))(address=(protocol=tcp)(port=1521)(host=xxx)))(load_balance = yes)(connect_data=(SERVICE_NAME=xxx)(SERVER=DEDICATED)))</connection-url>
    <driver-class>oracle.jdbc.driver.OracleDriver</driver-class>
    <user-name>xxxr</user-name>
    <password>xxx</password>
    <!-- Checks the Oracle error codes and messages for fatal errors -->
    <exception-sorter-class-name>
        org.jboss.resource.adapter.jdbc.vendor.OracleExceptionSorter
    </exception-sorter-class-name>
    <min-pool-size>5</min-pool-size>
    <max-pool-size>25</max-pool-size>
    <!-- corresponding type-mapping in the standardjbosscmp-jdbc.xml -->
    <metadata>
        <type-mapping>Oracle10g</type-mapping>
    </metadata>
</local-tx-datasource>

我们也用过,但没变……

【问题讨论】:

    标签: java oracle jdbc jboss datasource


    【解决方案1】:

    就我而言,我使用的是 Jboss EAP 6 (AS7),我的解决方案是制作类 WrapperDataSource 的包装器并添加指令:

    wc.setAutoCommit(false);
    

    在 getConnection 方法中,为了在我的应用程序从 de JDBC 池获取连接时将自动提交连接设置为 false。

    这个链接解释了如何做

    http://antuansoft.blogspot.com.es/2017/01/jboss-datasources-set-autocommit-example.html

    希望对大家有所帮助

    【讨论】:

      【解决方案2】:

      您可以创建自己的数据源,它是您正在使用的数据源的子类。将其存储在 JNDI 中。您需要覆盖的唯一方法是 getConnection(),它可以:

      Connection public getConnection()
      {
        Connection conn = super.getConnection();
        conn.setAutoCommit(true);
        return conn;
      }
      

      【讨论】:

        【解决方案3】:

        数据源主要分为三种:

        JBoss Community ConfigDataSources

        您的 deploy/oracle-ds.xml 文件应使用 来获取连接,并将自动提交设置为 false。

        请参阅 Scott Stark 在此帖子中的回复:How to Declaratively set autoCommit to falseJ2EETM Connector Architecture Specification Version 1.5 第 15.5.3.1 节的原始来源。

        【讨论】:

        • 感谢您的回答,我必须说我已经查看了这些资源,但我看到的唯一方法仍然是以编程方式为我从 JBoss(版本 4)数据源检索的每个连接设置连接自动提交属性。理想情况下,我希望这个自动提交属性可以从 JBoss 数据源或连接池配置中进行管理——但我可能在这方面不走运......
        • 您说:“尝试从 JBoss 数据源 XML 设置自动提交并没有真正起作用。”你能告诉我们更多关于什么不起作用吗?另外,您可以发布您的数据源配置吗? JBoss 4.x 和 Oracle 9/10 对我来说一直都能正常工作,所以我怀疑这是配置中的问题。
        • 最后一个想法,如果您在连接上发出 DDL 命令,您可能会遇到问题,因为这些命令不适用于在事务中发出的标准 SQL 命令。
        • 我们调用一个存储过程,它在 JDBC 连接的上下文中将记录插入到表中。理想情况下,我们不想为每个插入发出数据库提交,但这是由于 JDBC 自动提交而发生的。
        • 你能看到每个语句之后容器发出的提交语句吗?如果您通过观察在引发异常时发生提交来推断自动提交行为,那么您可能需要检查是否捕获了异常并在 Context 对象上使用 setRollbackOnly() 方法。应用程序(已检查)异常不会强制回滚,因此很容易以这种方式被发现。见Handling Exceptions
        猜你喜欢
        • 2010-10-23
        • 1970-01-01
        • 2021-06-01
        • 2010-11-11
        • 2015-08-09
        • 1970-01-01
        • 1970-01-01
        • 2014-01-25
        • 1970-01-01
        相关资源
        最近更新 更多