使用纯的JDBC+SERVLET的数据库事务的问题

http://topic.csdn.net/u/20080705/18/d894b5e5-8b7b-4560-af16-e4b9d8405681.html
这是我在CSDN的发贴的地址

现在的问题,

如何像SSH整合开发一样,事务把struts的action包围 了,action中调用某一SERVICE层出错,整个ACTION中的代码进行回滚,那是有SSH的情况,使用了SPRING的AOP

如果使用纯的JDBC呢、、如何将事务把SERVLET包围 起来,,
知道这里高手多,感谢大家!

CSDN贴中有的高手说使用FILTER来进行开发,有没有相关的例程,我并不太了解如何用FILTER开发,感谢

事务: 说白了就是在一个connection里面做了一堆的事情, 在特定的时间点 [完成,异常] 进行提交或回滚.

所以, 无论是否Spring的TransactionManager还是自己的Servlet上的事务控制, 都是基于在一个事务单元内的一个connection上的, 所以, 你要将connection绑定在一个ThreadLocal上, 让里面所有的jdbc操作使用这个connection就好, 在Servlet的所有jdbc操作完成后, 再进行显示的commit 或 rollback.

下面的代码随手写的, 只是用于说明问题.
[code="java"]
SessionConnectionUtil {

static ThreadLocal holder = new ThreadLocal();

public static getConnection() {
if (holder.get() == null) {
holder.sut(new Connection());
}
return (Connection) holder.get();
}

public static closeConnection() {
holder.set(null);
}

}

CustomServlet extends HttpServlet {
CustomDao dao;
service() {
try {
dao.doSomething();

    SessionConnectionUtil.getConnection().commit();
} catch (Exception e) {
        SessionConnectionUtil.getConnection().rollback();
} finally {
    SessionConnectionUtil.closeConnection();
}

}
}

CustomDao {
doSomething() {
Connection connection = SessionConnectionUtil.getConnection();
...
}
}[/code]

使用ThreadLocal和Filter。
改造一下你原有的获得JDBC连接的类。然后在
[code="java"]
public class CommitFilter implements Filter {

public void destroy() {
    // TODO Auto-generated method stub

}

public void doFilter(ServletRequest request, ServletResponse response,
        FilterChain chain) throws IOException, ServletException {
    chain.doFilter(request, response);
    DBManager.commit();
}

public void init(FilterConfig arg0) throws ServletException {
    // TODO Auto-generated method stub

}

}

public class DBManager{
private static final ThreadLocal connection = new ThreadLocal(){

    @Override
    protected Object initialValue() {
        return _getConnection();
    }

};

private static Connection _getConnection(){//这个方法可以是你旧有的以静态方式获得JDBC连接的方法的改名。
    Connection conn=null;
    //此处添加你获取JDBC的连接的代码。
    conn.setAutoCommit(false);
    return conn;
}

public static Connection getConnection(){
    return (Connection)connection.get();
}

public static void commit(){
    if(getConnection().isClose())thrown new RuntimeException();//这里不检测Connection是否是Null,并且在连接被关闭后抛出异常,是为了避免你的程序中非法对connection操作(比如提前关闭了连接,或者是调用了这个方法两次)
    getConnection().commit();//放心此处得到的是同一Connection
    getConnection().close();
}

}

public class YourServlet ....{//你的Servlet

...
public void doPost(.....){
    DBManager.getConnection();
    ....//doSomething.
    //去掉原有的关闭连接的代码。
}
...

}

[/code]

最后配置Filter管理你的所有使用到数据库的Servlet。这个就不用我说了吧?呵呵

忘了在Filter里加上rollBack()的代码了。
[code="java"]try{
chain.doFilter(request, response);

}catch(Throwable t){
DBManager.getConnection().rollback();
DBManager.getConnection().close();
return ;
}
DBManager.commit();[/code]

异常捕捉的代码就偷懒了。你自己改造一下。思路和loggege一样类似。

上海时间: 1:18 :D

广州时间20:33 :)