####问题
Dbutils 作为一个超轻量级的orm框架,仅仅是对jdbc进行了简单的封装,主要是将查询的结果封装成javaBean。在做数据的持久化操作时,使用关系型数据库,从关系字段到对象属性的映射,用纯粹的jdbc操作时,虽然比较简单,但是数据量大,很是枯燥乏味,便很易出错。Dbutils基本只能解决这个问题,包括存储过程,事务都需要自己管理。
在数据库操作时常常会遇到使用多个数据库的时候。多个库之间做事务就比较麻烦了。
####方案
一般思路,打开数据库A,插入,打开数据库B,插入,提交数据库A,提交数据库B.看起来很简单的,但是,其中任何一步都可能出现异常,还要考虑到回滚。处理起来是比较麻烦的。
如果对第一个库是比较简单的操作,我可以,打开数据库A,插入,提交数据库A,打开数据库B,插入,提交数据库B。如果操作B库时出现异常,那我可以删除A库的提交。
####案例
下面是用Dbutils使用存储过程操作两个数据库的事务。
1.向数据库A中添加一条用户记录。使用了存储过程(主要是用存储过程生成用户ID的逻辑).
Connection conn = DBUtil.getConnection();
Long id;
try {
conn.setAutoCommit(false);
CallableStatement cst = conn.prepareCall(“call p_user_add(?,?)”);
cst.setString(2,"username");
id = cst.getLong(1);
conn.commit();
} catch (SQLException ex) {
try {
conn.rollback();
} catch (SQLException e) {
e.printStackTrace();
}
throw new DBException(ex);
} finally {
try {
conn.setAutoCommit(true);
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
2.向数据库B添加一条记录,如果添加异常,删除向A中添加的记录。
try {
DBUtil.beginTransaction();
DBUtil.update(2,"insert into user_info (userid) values (?)", uid);
DBUtil.endTransaction();
}catch (DBException e){
// 异常时删除第一个库的提交.
DBUtil.update("delete from _user where userid = ?",uid);
DBUtil.rollback(e);
}