首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 我来也! 请教一下,在纯的JDBC中,如何项目采用分层了DAO层,服务层和SERVLET控制层,,那么怎么在servlet中启用JDBC的事务?
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • ghyghost
    • 等级:
    发表于:2008-07-05 18:18:10 楼主
    我来也! 请教一下,在纯的JDBC中,如何项目采用分层了DAO层,服务层和SERVLET控制层,,那么怎么在servlet中启用JDBC的事务?
    20  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-05 18:18:161楼 得分:0
    此回复为自动发出,仅用于显示而已,并无任何其他特殊作用
    楼主【ghyghost】截止到2008-07-05 18:18:10的历史汇总数据(不包括此帖):
    发帖的总数量:107                      发帖的总分数:1840                   
    结贴的总数量:99                      结贴的总分数:1750                   
    无满意结贴数:27                      无满意结贴分:590                     
    未结的帖子数:8                        未结的总分数:90                     
    结贴的百分比:92.52 %              结分的百分比:95.11 %                 
    无满意结贴率:27.27 %              无满意结分率:33.71 %                 
    值得尊敬
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-05 18:33:472楼 得分:0

    如果服务层没有用spring,不能用AOP拦截的话,可以在filter中控制事务,但粒度有点太大了

    有一篇文章 “用 JOTM 向Servlet中添加事务”,不知道能否对你有所帮助
    http://tech.ccidnet.com/art/1077/20030820/60272_1.html

    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-05 18:36:543楼 得分:0
    事务的事情应该是DAO层分内的,没必要在servlet业务逻辑层开发。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • ghyghost
    • 等级:
    发表于:2008-07-05 18:38:034楼 得分:0
    感谢lnfszl,,要实现的效果就是将事务打包在servlet中,,,

    但他使用了JOTM来实现

    有没有原生JAVA的办法实现的,感谢

    大家继续讨论
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • ghyghost
    • 等级:
    发表于:2008-07-05 18:43:065楼 得分:0
    dgqbcht:

    在DAO层中??不应该,,极大的情况下,我们需要在servlet中调用的所有的服务层的东西是一个整体,如果在servlet中调用某一个服务层出错,那么整个SERVLET的所有的东西全回滚,

    其实这个实现就是lnfszl网友给的地址想要的答案,但他使用的是三方类实现的
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-05 18:47:576楼 得分:0
    那就把dao层所需的数据库连接改为由参数传入,在servlet里管理数据库连接不就行了么。
    try {
    conn = ...;
    conn.setAutoCommit(false);
    callSomeFunction(conn, other params);
    conn.commit();
    }
    catch(Exception e) {
    conn.rollback();
    }
    finally{
    conn.setAutoCommit(true);
    //下面把conn关闭回收了
    ....
    }

    不知道回答了你的问题没。。。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-05 18:52:597楼 得分:0
    主要是你servlet的下一层的方法的接口的问题,如果servlet的下一层(应该是你说的服务层)里所需的数据库连接要求由调用者传入,那就可以由调用者来控制事务了。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • ghyghost
    • 等级:
    发表于:2008-07-05 19:00:538楼 得分:0
    嗯,小兵的问题可以解决这个问题,就是CONNECTION由参数来做,,

    我再想一想,考虑一下这个设计问题
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • ghyghost
    • 等级:
    发表于:2008-07-05 19:13:439楼 得分:0
    头晕的很,想的!


    小兵,总感觉不太爽的感觉就是

    在SERVLET中将CONN对象由参数传给服务层有些不太爽,这样层一层之间就耦合了,服务层应该调用DAO方法才对,呵呵

    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-05 19:19:2210楼 得分:0
    或者这样也行,如果你不用spring的话,在dao和servlet之间做一个服务层,解决所有的事务问题,servlet层跟这个服务层打交道就行。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-05 19:20:0611楼 得分:0
    应该是服务层调用dao层,服务层控制事务。
    如果只是传Connection的话,也算不上耦合。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • ghyghost
    • 等级:
    发表于:2008-07-05 19:24:4812楼 得分:0
    dgqbcht   

    那如果有多个服务层呢,,多个服务层共同操作是一个整体流程,那么如何保证 这个整体流程完整性呢?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • ghyghost
    • 等级:
    发表于:2008-07-05 19:25:5013楼 得分:0
    poscard
    我认为不应该是服务层控制事务

    应该在SERVLET控制事务

    SERVLET中有可能调用N个服务层,他们是一个整体啊,而不是一个服务是一个整体,是多个服务层的操作是一个整体
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-05 19:27:2814楼 得分:0
    不过,如果是在servlet里决定完成一个业务功能需要在同一个事务里调用哪些方法(而这可能本该是你的服务层做的),那确实是有耦合了。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • ghyghost
    • 等级:
    发表于:2008-07-05 19:28:1115楼 得分:0
    我先回家,现在在单位,,
    回家再研究,这个问题大家1000%都遇到,只不过避开了事务,至少我现在的公司是这样,,就有一个DB.JAVA文件,里面有QUERY,UPDATE方法,传进的是STRING SQL参数,,

    根本没有使用事务,我感觉这样很不好,很危险,

    所以特来请教,先下,回家再继续!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • ghyghost
    • 等级:
    发表于:2008-07-05 19:29:5916楼 得分:0
    小兵,,事常的情况下,服务层的确是控制事务的,,但如果你这样做,,

    服务层控制事务的粒度就太细了,,

    我想粗粒度,就想在SERVLET中将所有调用的服务层加事务,,这样SERVLET中所有的东西都是一个完整性了,呵呵
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • java2000_net
    • 等级:
    发表于:2008-07-05 19:55:4817楼 得分:0
    啥叫事务?就是他们必须全部完成或者全部不完成。

    所以,应该在逻辑业务层进行。而不是在控制层或者表现层
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-05 20:56:3418楼 得分:0
    引用 15 楼 ghyghost 的回复:
    我先回家,现在在单位,,
    回家再研究,这个问题大家1000%都遇到,只不过避开了事务,至少我现在的公司是这样,,就有一个DB.JAVA文件,里面有QUERY,UPDATE方法,传进的是STRING SQL参数,,

    根本没有使用事务,我感觉这样很不好,很危险,

    所以特来请教,先下,回家再继续!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-05 22:34:1419楼 得分:0
    事务上下文模式

    ThreadLocal 绑定 Connection,事务代码采用动态代理业务方法,代理的结构如下:

    try {
        con.begin
        method.invoke(...)
        con.commit
    }catch() {
        con.rollback
    }

    如果完成一个业务逻辑需要调用到多个业务类中的方法的话,这样得使用门面模式把多个业务类
    集合成为一个,将这个门面进行代理。当然了,如果你想让 Connection 出现在你的业务方法中
    的话,那么动态代理这一步就可以省略掉。

    业务逻辑方法调用 DAO 中的 Connection 通过 ThreadLocal 得到,
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-06 01:37:0320楼 得分:0
    给你一个纯JDBC MVC模式的写法的例子吧,分为VO,DAO,BIZ,SERVLET
    VO:
    Java code
    public class DataVo { long dms_id; public long getDms_id() { return this.dms_id; } public void setDms_id(long str) { this.dms_id = str; } String dms_title; public String getDms_title() { return this.dms_title; } public void setDms_title(String str) { this.dms_title = str; } java.sql.Date dms_addtime; public java.sql.Date getDms_addtime() { return this.dms_addtime; } public void setDms_addtime(java.sql.Date str) { this.dms_addtime = str; } String dms_content; public String getDms_content() { return this.dms_content; } public void setDms_content(String str) { this.dms_content = str; } long nodeId; public long getNodeId() { return this.nodeId; } public void setNodeId(long str) { this.nodeId = str; } String text; public String getText() { return this.text; } public void setText(String str){ this.text=str; } String parm = "dms_id,dms_title,dms_addtime,dms_content,nodeId"; public String getParm() { return parm; } public void setParm(String parm) { this.parm = parm; } String parm1 = "dms_title,dms_content,nodeId"; public String getParm1() { return parm1; } public void setParm1(String parm1) { this.parm1 = parm1; } String parm2 = "dms_title=?,dms_content=?,nodeId=? where dms_id=?"; public String getParm2() { return parm2; } public void setParm2(String parm2) { this.parm2 = parm2; } }


    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-06 01:37:4721楼 得分:0
    BIZ:
    Java code
    import java.sql.Connection; import java.util.List; import java.util.Vector; import common.jiangbin.dms.DBConnection; import common.jiangbin.dms.SplitPageCommon; public class DataBiz { public void insert(DataVo vo) { DBConnection dbc = new DBConnection(); if (dbc.getConnect()) { Connection conn = dbc.getConn(); try { DataDao dao = new DataDao(); dao.insert(conn, vo); } catch (Exception e) { e.printStackTrace(); } finally { try { if (conn != null) { conn.close(); conn = null; } } catch (Exception e) { e.printStackTrace(); } } } else { System.out.println("数据库连接失败!"); } } public List findbyAll(SplitPageCommon spvo,String sqlw) { Vector v = new Vector(); DBConnection dbc = new DBConnection(); if (dbc.getConnect()) { Connection conn = dbc.getConn(); try { DataDao dao = new DataDao(); v = dao.findbyAll(conn,spvo,sqlw); } catch (Exception e) { e.printStackTrace(); } finally { try { if (conn != null) { conn.close(); conn = null; } } catch (Exception e) { e.printStackTrace(); } } } else { System.out.println("数据库连接失败!"); } return v; } public DataVo findbykey(DataVo vo) { DataVo dvo = new DataVo(); DBConnection dbc = new DBConnection(); if (dbc.getConnect()) { Connection conn = dbc.getConn(); try { DataDao dao = new DataDao(); dvo = dao.findbykey(conn, vo); } catch (Exception e) { e.printStackTrace(); } finally { try { if (conn != null) { conn.close(); conn = null; } } catch (Exception e) { e.printStackTrace(); } } } else { System.out.println("数据库连接失败!"); } return dvo; } public void update(DataVo vo) { DBConnection dbc = new DBConnection(); if (dbc.getConnect()) { Connection conn = dbc.getConn(); try { DataDao dao = new DataDao(); dao.update(conn, vo); } catch (Exception e) { e.printStackTrace(); } finally { try { if (conn != null) { conn.close(); conn = null; } } catch (Exception e) { e.printStackTrace(); } } } else { System.out.println("数据库连接失败!"); } } public void delete(DataVo vo) { DBConnection dbc = new DBConnection(); if (dbc.getConnect()) { Connection conn = dbc.getConn(); try { DataDao dao = new DataDao(); dao.delete(conn, vo); } catch (Exception e) { e.printStackTrace(); } finally { try { if (conn != null) { conn.close(); conn = null; } } catch (Exception e) { e.printStackTrace(); } } } else { System.out.println("数据库连接失败!"); } } }
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-06 01:38:1222楼 得分:0
    Servlet:
    Java code
    import java.io.IOException; import java.io.PrintWriter; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import common.dms.SplitPageCommon; public class DataServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doPost(request, response); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { int _act = 1; String act = request.getParameter("act"); if (act != null && !act.equals("")) { _act = Integer.parseInt(act); } else { _act = 1; } switch (_act) { case 1: // 添加资料 this.insert(request, response); break; case 2: // 修改某条记录 this.update(request, response); break; case 3: // 删除某一条数据 this.delete(request, response); break; } } //1:添加资料 public void insert(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String dms_title=request.getParameter("dms_title"); String dms_content=request.getParameter("dms_content"); String nodeId=request.getParameter("nodeId"); DataVo vo=new DataVo(); vo.setDms_title(dms_title); vo.setDms_content(dms_content); vo.setNodeId(Long.parseLong(nodeId)); DataBiz biz=new DataBiz(); biz.insert(vo); //request.getRequestDispatcher("DataDervlet?act=2&nodeId="+nodeId).forward(request, response); String path = request.getContextPath(); response.sendRedirect(path+"/DataServlet?act=2&nodeId="+nodeId); } //2:修改某条记录 public void update(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String dms_id=request.getParameter("dms_id"); String dms_title=request.getParameter("dms_title"); String dms_content=request.getParameter("dms_content"); String nodeId=request.getParameter("nodeId"); DataVo vo=new DataVo(); vo.setDms_title(dms_title); vo.setDms_content(dms_content); vo.setNodeId(Long.parseLong(nodeId)); vo.setDms_id(Long.parseLong(dms_id)); DataBiz biz=new DataBiz(); biz.update(vo); String path = request.getContextPath(); response.sendRedirect(path+"/TreeServlet?act=2&type=3&nodeId="+nodeId); } //3:删除某条记录 public void delete(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String nodeId=request.getParameter("nodeId"); String dms_id=request.getParameter("dms_id"); DataVo vo=new DataVo(); vo.setDms_id(Long.parseLong(dms_id)); DataBiz biz=new DataBiz(); biz.delete(vo); String path = request.getContextPath(); response.sendRedirect(path+"/TreeServlet?act=2&type=3&nodeId="+nodeId); } }


    这个应该就是一个比较标准的纯的JDBC MVC的写法了,事业操作全都应该在BIZ层中进行
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-06 10:04:4223楼 得分:0
    jdbc有事务控制,一旦发生上面错误向外抛异常(不提交事物),servlet捕捉异常,根据不同的异常转到不同的页面
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-06 17:10:5224楼 得分:0
      样都看不懂!@!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-06 20:12:2925楼 得分:0