专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »Java教程 » ibatis:绕过iBATIS的事务管理 »正文

ibatis:绕过iBATIS的事务管理

来源: 发布时间:星期四, 2009年2月12日 浏览:195次 评论:0


不管你信不信事实证明ibatis 对数据库任何操作都加了事务无论你是否使用SqlMapClientstartTransaction思路方法在ibatis中事务总是开启而且无法通过配置来改变它庆幸是还有种思路方法来绕过事务否则spring也该无语了startTransaction思路方法只是让我们来控制更大范围事务而已
例如:
view plaincopy to clipboardpr?
publicvoid test1 throws SQLException, IOException {

Reader reader = Resources.getResourceAsReader("sql-map-config.xml");

SqlMapClient smc = SqlMapClientBuilder.buildSqlMapClient(reader);

List list = smc.queryForList("Test.testQuery", null);

.out.prln(list.size);

}

publicvoid test1 throws SQLException, IOException {

Reader reader = Resources.getResourceAsReader("sql-map-config.xml");

SqlMapClient smc = SqlMapClientBuilder.buildSqlMapClient(reader);

List list = smc.queryForList("Test.testQuery", null);

.out.prln(list.size);

}上面代码已经具有隐式事务了如果URL中不加SelectMethod=cursor话就会报错开事务必须加SelectMethod=cursor
至于如何绕过事务我稍后在讲或许有些朋友会问有事务有什么不好吗先不说好不好问题我先说种情况这种情况开了事务根本就无法执行那就是sqlserver分布式查询比如A机器上a库个视图bview是B机器上b表那么如果查询 select * from bview 时开启了事务就会报错原因是没有开启分布式事务像这种情况根本就没有必要开启分布式事务我有100个需求但都是查询要事务何用?
另外ibatis另类事务管理导致URL中必须添加SelectMethod=cursor不开游标会报错本来个可选配置在ibatis里面成了必选项
JDBC.DefaultAutoCommit选项成了鸡肋这仅仅是个默认值而已在下面写法中它才能派上用场
由于spring出现或许现在已经没有人单独使用ibatis了众所周知spring强大声明式事务在没有配置声明式事务的前包括hibernateibatis在内orm持久层都是没有事务状态那么spring是如何绕过ibatis自身事务管理网络是强大搜索引擎是强大不少网友将spring控制事务代码片段贴了出来块块片段中发现了线索经测试证明是可以绕过ibatis自己事务自己来控制事务就是利用SqlMapClientUserConnection思路方法看到这个思路方法名有所领悟其实这个思路方法在hibernate也是有对外提供给开发人员自己控制connection权利不过脱离了spring单独使用ibaits这么干是不是太麻烦了?
view plaincopy to clipboardpr?
/**

*

* Description:绕过ibatis事务管理做分布式查询情况

*

* @throws SQLException

* @throws IOException

* @mail [email protected]

* @since:Jul 13, 2008 5:28:32 PM

*/

public void test2 throws SQLException, IOException {

Reader reader = Resources.getResourceAsReader("sql-map-config.xml");

SqlMapClient smc = SqlMapClientBuilder.buildSqlMapClient(reader);

Connection conn = null;

List lits = null;

boolean isAutoCommit = false;

try {

conn = smc.getDataSource.getConnection;

isAutoCommit = conn.getAutoCommit;

conn.AutoCommit(true);

smc.UserConnection(conn);

lits = smc.queryForList("Test.testQuery", null);

} finally {

try {

conn.AutoCommit(isAutoCommit);

} finally {

conn.close;

}

}

.out.prln(lits.size);

}

/**

*

* Description:绕过ibatis事务管理做分布式查询情况

*

* @throws SQLException

* @throws IOException

* @mail [email protected]

* @since:Jul 13, 2008 5:28:32 PM

*/

public void test2 throws SQLException, IOException {

Reader reader = Resources.getResourceAsReader("sql-map-config.xml");

SqlMapClient smc = SqlMapClientBuilder.buildSqlMapClient(reader);

Connection conn = null;

List lits = null;

boolean isAutoCommit = false;

try {

conn = smc.getDataSource.getConnection;

isAutoCommit = conn.getAutoCommit;

conn.AutoCommit(true);

smc.UserConnection(conn);

lits = smc.queryForList("Test.testQuery", null);

} finally {

try {

conn.AutoCommit(isAutoCommit);

} finally {

conn.close;

}

}

.out.prln(lits.size);

} 通过这种思路方法JDBC.DefaultAutoCommit这个选项也算是个有用参数了
不过ibatis这种事务处理手段是不是太晦涩了些
标签:ibatis教程 ibatis
0

相关文章

读者评论

发表评论

  • 昵称:
  • 内容: