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 :)