防止JBoss 7上的JNDI数据源的Oracle连接自动提交(Jeeves DBMS)

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

大纲

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

You cannot commit with autocommit set! 

我不能做什么

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

  con.setAutoCommit(false); 

我尝试了什么

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

   false  

但这被忽略了。

此外,我尝试使用具有以下属性的xa-datasource:

   false  

但autoCommit属性属于连接,而不属于数据源,因此引发了PropertyNotFoundexception。

我的问题

如何在JBoss7下的JNDI数据源中将Autocommit设置为false,我错过了什么?

我的定义

  jdbc:oracle:thin:@****:****:****  false  oracle.jdbc  10 100 true false FailingConnectionOnly   ***** *****   5000 1   

更新

代码片段:

  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一样获得连接。 所以我回到了开头。

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