To be safe, I created a commit wrapper that goes out and sets the forceCommit
flag to true, then calls commitTransaction(). I didn't feel comfortable about
calling connection.commit() directly. This allows me to selectively choose when
I want to force a commit or have ibatis check the isCommitRequired flag. My
only worry left is if an instance of TransactionConfig shared by other
transactions and if so, will changing its value effect the other transactions
as well? Or is TransactionConfig cloned for each transaction. I wouldn't mind
if the other transactions temporarily forced a commit while this one finished
up but I am just curious.
public void forceCommitWork(){
try{
if(sqlMapSession instanceof SqlMapSessionImpl){
SqlMapExecutorDelegate sqlMapExecutorDelegate =
((SqlMapSessionImpl) sqlMapSession).getDelegate();
TransactionManager transManager =
sqlMapExecutorDelegate.getTxManager();
TransactionConfig config = transManager.getConfig();
//remember the original force commit setting
boolean originalForceCommitSetting = config.isForceCommit();
//temporarly change it to true
config.setForceCommit(true);
sqlMapSession.commitTransaction();
//revert the force commit setting
config.setForceCommit(originalForceCommitSetting);
}else{
throw new TechnicalException("Expected sqlMapSession to be an
instanceof SqlMapSessionImpl");
}
}catch(SQLException se){
throw new TechnicalException(se.getMessage());
}
}
From: iss...@hotmail.com
To: user-java@ibatis.apache.org
Subject: Using Connection.commit() in place of
SqlMapSession.commitTransaction(). "commitRequired" Benefit
Date: Wed, 8 Apr 2009 01:19:31 +0000
Hi guys,
This is a two part question.
1) Is there a significant performance pickup if you use commitRequired="false".
As you know this attribute is set to false by default. I couldn't find any
information on the benefit of keeping that field false.
2) I would like to run an sql update query using a Statement object. Its for
throw away install scripts that I do not want the sql to be in the xml files.
So if I run an sql update query using a Statement object with
commitRequired="false", the expected behavior of
sqlMapSession.commitTransaction() would be to do nothing because ibatis didn't
detect the update. So what I ended up doing is the following code snippet:
--------
sqlMapSession.startTransaction();
Connection connection = sqlMapSession.getCurrentConnection();
Statement stmt = connection.createStatement()
stmt.executeUpdate("UPDATE item SET type="NA");
connection.commit(); //did not use sqlMapSession.commitTransaction()
-------
Note how I used the connection's commit() instead of commitTransaction(). Is
this ok? Am I bypassing something that could be dangerous? From my testing, it
shows that everything is ok.
Thank you in advance.
Isster
_________________________________________________________________
Rediscover HotmailĀ®: Get quick friend updates right in your inbox.
http://windowslive.com/RediscoverHotmail?ocid=TXT_TAGLM_WL_HM_Rediscover_Updates1_042009