日期:2014-05-17  浏览次数:20889 次

DAO涉及事务与service解耦问题?
DAO使用JDBC实现 连接池+线程单例+封装事物
控制事物的方法在connection中定义在service层使用

问题就出现这里 JDBC和service耦合了 完全不符合分层设计思想有什么好的解决办法么?



求教育  感谢!!!!
JDBC service

------解决方案--------------------
这个应用场景很普遍,在 J2EE 中称为“事务上下文”,近乎所有的框架、J2EE 容器都是采用 ThreadLocal 来实现的,基本步骤也很简单,主要流程是这样的:

1:为 Service 创建一个代理类,在代理类的横切逻辑中开始处从数据库连接池中获取一个连接,并开启事务后,将该连接放到 ThreadLocal 中去,在横切逻辑的结尾中提交事务,关闭连接,并从 ThreadLocal 中删除这个连接即可,在 catch 块中回滚事务,关闭连接,从 ThreadLocal 中移除连接。

2:重构 DAO 接口,将 Connection 从参数传入的方法,改为从 ThreadLocal 中获取即可。由于事务和连接在 Service 的代理类中获取和开启的,对于 DAO 而言无须关心连接从哪来的。

3:如果经过适当的处理,可以对事务传播方式做一些处理。

通过以上处理,可以将 Service, DAO 和数据库连接对象解耦。

在这个帖子的 22 楼有一些参考代码,这代码是基于 JPA 的,你将 JPA 中的 EntityManager 看作是 JDBC 中的 Connection 就可以了。

http://bbs.csdn.net/topics/320130592#post-321368751