【问题标题】:Prevent Oracle Connection autocommit for JNDI Datasource on JBoss 7 (Jeeves DBMS)防止 JBoss 7 (Jeeves DBMS) 上 JNDI 数据源的 Oracle 连接自动提交
【发布时间】:2014-01-25 05:48:57
【问题描述】:

我目前对 JBoss 7 中的 Oracle JNDI 数据源的自动提交设置有一个奇怪的情况。

大纲

我要部署的应用程序,我可以检查但不能更改,从连接池获取连接并尝试在某些语句后提交。显然,默认情况下,连接的自动提交设置为“true”,因此会引发异常。

    You cannot commit with autocommit set!

我不能做什么

由于无法更改应用源,以下“解决方案”不适用:

    con.setAutoCommit(false);

我尝试了什么

我查看了standalone.xml 的XML Schema,发现数据源定义中有两个很有希望的元素:

    <connection-property name="autoCommit">
     false
    </connection-property>

但这被忽略了。

我还尝试使用具有以下属性的 xa 数据源:

    <xa-datasource-property name="autoCommit">
     false
    </xa-datasource-property>

但 autoCommit 属性属于连接,而不是数据源,因此引发了 PropertyNotFound 异常。

我的问题

如何在 JBoss7 下的 JNDI 数据源中将 Autocommit 设置为 false,我是否遗漏了什么?

我的定义

<datasource jta="false" jndi-name="java:/*****" pool-name="*****" enabled="true">
    <connection-url>jdbc:oracle:thin:@****:****:****</connection-url>
    <connection-property name="autoCommit">
        false
    </connection-property>
    <driver>oracle.jdbc</driver>
    <pool>
        <min-pool-size>10</min-pool-size>
        <max-pool-size>100</max-pool-size>
        <prefill>true</prefill>
        <use-strict-min>false</use-strict-min>
        <flush-strategy>FailingConnectionOnly</flush-strategy>
    </pool>
        <security>
        <user-name>*****</user-name>
        <password>*****</password>
    </security>
    <timeout>
        <blocking-timeout-millis>5000</blocking-timeout-millis>
        <idle-timeout-minutes>1</idle-timeout-minutes>
    </timeout>
</datasource>

更新

代码片段:

      public AccessManager(jeeves.resources.dbms.Dbms dbms, SettingManager sm)
        throws SQLException
      {
        List operList = dbms.select("SELECT * FROM Operations").getChildren();          
      }

更新 2

我要部署的应用程序是 Geonetwork CSW 2.9.0,以防万一有人有这方面的经验。我必须配置一个 JNDI 数据源,因为空间索引只发生在容器管理的连接上。

更新 3

堆栈跟踪:

    15:52:18,203 ERROR [jeeves.engine] (MSC service thread 1-4) Raised exception while starting appl handler. Skipped.
    15:52:18,205 ERROR [jeeves.engine] (MSC service thread 1-4)    Handler   : org.fao.geonet.Geonetwork
    15:52:18,206 ERROR [jeeves.engine] (MSC service thread 1-4)    Exception : java.sql.SQLException: You cannot commit with autocommit set!
    15:52:18,210 ERROR [jeeves.engine] (MSC service thread 1-4)    Message   : You cannot commit with autocommit set!
    15:52:18,213 ERROR [jeeves.engine] (MSC service thread 1-4)    Stack     : java.sql.SQLException: You cannot commit with autocommit set!
            at org.jboss.jca.adapters.jdbc.BaseWrapperManagedConnection.jdbcCommit(BaseWrapperManagedConnection.java:984)
            at org.jboss.jca.adapters.jdbc.WrappedConnection.commit(WrappedConnection.java:757)
            at jeeves.resources.dbms.Dbms.commit(Dbms.java:150)
            at jeeves.resources.dbms.AbstractDbmsPool.close(AbstractDbmsPool.java:158)
            at jeeves.server.resources.ResourceManager.release(ResourceManager.java:302)
            at jeeves.server.resources.ResourceManager.close(ResourceManager.java:270)
            at jeeves.server.JeevesEngine.initAppHandler(JeevesEngine.java:556)
            at jeeves.server.JeevesEngine.init(JeevesEngine.java:182)
            at jeeves.server.sources.http.JeevesServlet.init(JeevesServlet.java:87)
            at javax.servlet.GenericServlet.init(GenericServlet.java:242)
            at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1202)
            at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:1102)
            at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:3655)
            at org.apache.catalina.core.StandardContext.start(StandardContext.java:3873)
            at org.jboss.as.web.deployment.WebDeploymentService.start(WebDeploymentService.java:90)
            at org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1811)
            at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1746)
            at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
            at java.lang.Thread.run(Thread.java:662)

更新 4

刚刚意识到 Jeeves DBMS 是一个简单的 JNDI 数据源包装器,它可以像任何人使用普通 JDBC 一样获取连接。所以我又回到了起点。

【问题讨论】:

  • 快速测试:尝试将 JTA 设置为 true,因为这会强制自动提交默认为 false。这里的问题是您的问题是从错误的角度提出的;数据源不管理连接的自动提交设置,这是想要使用连接的逻辑的责任。那么使用数据源获取连接的技术是什么?答案应该在那里。
  • 感谢您的意见,这实际上让我想得更远。我刚刚意识到使用的技术是 Jeeves DBMS(不知道你是否可以这样称呼它,我没有使用 jeeves 的经验)不幸的是 JTA=true 也不起作用。 (更新问题)

标签: java oracle jboss datasource autocommit


【解决方案1】:

感谢您给我指路,找到了适合我的解决方案(更正:解决方法)。我对原始数据源做了一个包装,覆盖了 getConnection() 方法并将其绑定在一个新的 JNDI 名称下。这样我就可以完全控制数据源,而不会丢失容器的任何功能。

【讨论】:

  • 我不确定这是一个实际的解决方案还是只是一种解决方法,但如果您确定您因此得到了帮助(目前) - 我不会再提供任何进一步的信息。
  • 您说的完全正确,这不是真正的解决方案。这是一个“精心设计的解决方案”,但不是常见的 stackoverflow 意义上的。谢谢!
  • @JSniffer 我也面临同样的问题..您能否提供所有更改的详细信息?
猜你喜欢
  • 1970-01-01
  • 2011-03-26
  • 2012-08-16
  • 2013-05-15
  • 1970-01-01
  • 2012-07-09
  • 2012-09-13
  • 2012-05-29
  • 2014-12-01
相关资源
最近更新 更多