我们使用Weblogic服务器并在获取连接到Oracle 10g时始终将autoCommit设置为“false”。
我想知道Weblogic中是否有设置,如果未在应用程序代码中显式调用Commit或Rollback,它将自动提交事务。我听说Websphere中存在类似的设置。
答案 0 :(得分:5)
看起来您没有使用Container托管或Bean托管的事务。或者,就此而言,您只是从DataSource
检索连接,然后禁用autocommit
,而无需初始建立事务上下文;这意味着您正在使用JDBC事务(依赖于底层数据库的事务管理器)。
当您使用Container或Bean托管事务时,您将不再需要担心事务中使用的autocommit
的{{1}}属性,因为容器将确保Connection
在将autocommit
返回给应用程序之前,将property设置为false。
如果需要使用容器管理的事务,则需要使用EJB。除非引发Connection
或RuntimeException
,否则与EJB关联的任何事务都将自动提交。
如果您需要使用Bean管理或程序化事务,则必须使用UserTransaction
API。
如果您正在使用负责建立连接的Hibernate之类的ORM框架,那么您应该记住,Hibernate负责关闭Connection的autocommit属性。在大多数情况下,它会关掉房产。
如果您打算使用JDBC事务,尽管有更好的JTA事务替代方法,那么您可以尝试从管理控制台或数据源的JDBC配置文件中为驱动程序设置ApplicationException
属性。 。 JDBC配置文件的片段如下所示:
defaultAutoCommit
在管理控制台中,您可以在DataSource配置的属性文本区域中添加<?xml version='1.0' encoding='UTF-8'?>
<jdbc-data-source xmlns="http://xmlns.oracle.com/weblogic/jdbc-data-source" xmlns:sec="http://xmlns.oracle.com/weblogic/security" xmlns:wls="http://xmlns.oracle.com/weblogic/security/wls" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.oracle.com/weblogic/jdbc-data-source http://xmlns.oracle.com/weblogic/jdbc-data-source/1.0/jdbc-data-source.xsd">
<name>JDBC Data Source-Oracle</name>
<jdbc-driver-params>
<url>jdbc:oracle:thin:@localhost:1521:oracle</url>
<driver-name>oracle.jdbc.OracleDriver</driver-name>
<properties>
<property>
<name>user</name>
<value>app</value>
</property>
<!-- Disable autocommit for connections-->
<property>
<name>defaultAutoCommit</name>
<value>false</value>
</property>
</properties>
...
属性:
答案 1 :(得分:1)
当您调用connection.close()
方法时,App Server上连接池内部配置的连接并未真正关闭,它们实际上会返回到连接池,并可供下一个请求对象使用。不确定DataSource连接池是否会跟踪返回到池的连接是否存在未提交的更改并对其执行自动提交或回滚?
答案 2 :(得分:0)
将autoCommit设置为false是正确的做法。
我知道的所有RDBMS都在最后提交事务,除非明确回滚。你看到不同的行为吗?如果您怀疑出现了问题,可以选择打开数据库服务器中的日志记录,在那里您可以看到提交请求。恐怕我不知道如何在Oracle中做到这一点。
登录应用服务器可能没有用,因为它也可能没有发出明确的提交