####问题

  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);
}