仓酷云

标题: 了解下JAVA的浅谈怎样分离JDBC事件与Spring+Hibernate [打印本页]

作者: 深爱那片海    时间: 2015-1-18 11:04
标题: 了解下JAVA的浅谈怎样分离JDBC事件与Spring+Hibernate
不得不提一下的是:.net是看到java红,而开发出来的工具。
成绩:客户在其数据库操纵过程当中必要挪用我们的事情流接口,如许就必要将我们的事情流操纵与他们的业 务操纵置于统一个事件中。我们的服务接纳的都是spring的声明式事件,而客户接纳的是对connection举行事件处置。
怎样包管JDBC事件的分歧性?
想到的办理计划一:利用jta事件,用tomcat+jotm供应事件办理器。为何一入手下手就想到要利用jta事务??实践上我们和客户都是利用的统一个数据库,为了便利,各自利用了分歧的数据库毗连体例,利用jta的话的确有bt的意义在内里。可是现实上是我们的第一反响都是jta。最初没有接纳该办法的缘故原由也很复杂:我未将jotm设置乐成!汗一个。
想到的办理计划二:将客户的这些特定代码用spring办理起来。由于要修正客户部分代码,这个计划遭到了客户的激烈否决。因而保持。
想到的办理计划三:客户数据库操纵与我们的服务利用统一个数据库毗连。然后编程处置事件。存在两种体例:一种是把客户的毗连传给我们,另外一种则是把我们的毗连传给客户。第一种体例对我们的影响太年夜,以是最初决意接纳后一种体例:从hibernatesession中猎取connection然后传送给客户。接上去检察一下HibernateTemplate的execute()办法,思绪就很复杂了:猎取界说的sessionFactory-->创立一个新的session并翻开-->将session与以后线程绑定-->给客户代码前往connection-->翻开事务-->客户利用我们传送的connection举行数据库操纵-->我们不带声明事件的服务操纵-->提交事件-->排除绑定。
JDBC事件实践要注重的中央是:
1、将session与以后线程绑定利用的TransactionSynchronizationManager.bindResource()办法,这样在HibernateTemplate里才干找到session;
2、我们的服务必定要把声明式事件完全干失落,不然会有commit;
3、我们服务挪用终了后必定要flushsession,不然客户代码不会感知数据库里的数据变更。
终极办理:利用了spring里经常使用的模板和回调。JDBC事件代码以下:
  1. public class TransactionTemplate {  
  2.     protected final Log logger = LogFactory.getLog(TransactionTemplate.class);  
  3.     private FlushMode flushMode = FlushMode.ALWAYS;  
  4.     public Object execute(TransactionCallback callback) {  
  5.         //起首猎取sessionFactory  
  6.         SessionFactory sessionFactory = (SessionFactory) Framework.getEngine() 
  7.  
  8.                 .getContainer().getComponent("sessionFactory");  
  9.         //创立一个新的session并翻开  
  10.         logger.debug("Opening single Hibernate Session in 
  11. TransactionTemplate");  
  12.         Session session = getSession(sessionFactory);  
  13.         //将session与以后线程绑定  
  14.         TransactionSynchronizationManager.bindResource(sessionFactory, new 
  15. SessionHolder(session));  
  16.         //猎取数据库毗连  
  17.         Connection conn = session.connection();  
  18.         Object result = null;  
  19.         Transaction transaction = null;  
  20.         try {  
  21.             //入手下手处置JDBC事件  
  22.             transaction = session.beginTransaction();  
  23.             try {  
  24.                 result = callback.doInTransaction(conn);  
  25.             }  
  26.             catch (RuntimeException ex) {  
  27.                 doRollback(session, transaction);  
  28.                 throw ex;  
  29.             }  
  30.             catch (Error err) {  
  31.                 doRollback(session, transaction);  
  32.                 throw err;  
  33.             }  
  34.             //假如数据库操纵过程当中没有产生非常则提交事件  
  35.             transaction.commit();  
  36.         } catch (WorkflowException e) {  
  37.             logger.error("数据库操纵失利,事件回滚也失利!");  
  38.             throw e;  
  39.         } catch (RuntimeException ex) {  
  40.             logger.error("数据库操纵失利,事件被回滚!");  
  41.             throw ex;  
  42.         } catch (Error err) {  
  43.             logger.error("数据库操纵失利,事件被回滚!");  
  44.             throw err;  
  45.         } finally {  
  46.             // 将session与以后线程排除绑定  
  47.             TransactionSynchronizationManager.unbindResource(sessionFactory); 
  48.  
  49.             doClose(session);  
  50.         }  
  51.         return result;  
  52.     }  
  53.  
  54.     protected Session getSession(SessionFactory sessionFactory) {  
  55.         Session session = SessionFactoryUtils.getSession(sessionFactory, true);
  56.   
  57.         FlushMode flushMode = getFlushMode();  
  58.         if (flushMode != null) {  
  59.             session.setFlushMode(flushMode);  
  60.         }  
  61.         return session;  
  62.     }  
  63.  
  64.     private void doRollback(Session session, Transaction transaction) {  
  65.         logger.debug("数据库操纵非常,入手下手回滚事件");  
  66.         try {  
  67.             transaction.rollback();  
  68.             logger.debug("回滚事件乐成!");  
  69.         }  
  70.         catch (Exception e) {  
  71.             logger.error("回滚事件失利!");  
  72.             throw new WorkflowException("回滚事件失利!");  
  73.         } finally {  
  74.             session.clear();  
  75.         }  
  76.     }  
  77.  
  78.     private void doClose(Session session) {  
  79.         logger.debug("入手下手封闭毗连");  
  80.         try {  
  81.             session.close();  
  82.         }  
  83.         catch (Exception e) {  
  84.             logger.error("封闭毗连失利!");  
  85.             throw new WorkflowException("封闭毗连失利!");  
  86.         }  
  87.     }  
  88.     public FlushMode getFlushMode() {  
  89.         return flushMode;  
  90.     }  
  91.  
  92.     public void setFlushMode(FlushMode flushMode) {  
  93.         this.flushMode = flushMode;  
  94.     }  
  95. }  
  96. public interface TransactionCallback {  
  97.  
  98.     Object doInTransaction(Connection conn);  
  99. }
复制代码
挪用伪代码:  
  1. public void methodA(){  
  2.         TransactionTemplate transactionTemplate=new TransactionTemplate();  
  3.         transactionTemplate.execute(new TransactionCallback(){  
  4.             public Object doInTransaction(Connection conn) {  
  5.                 //客户代码  
  6.                 client.method1("1");  
  7.                 //我们代码 间接利用  
  8.                 our.method2();  
  9.                 //客户代码  
  10.                 client.method3("l");  
  11.                 return null;    
  12.             }  
  13.         });  
  14.     }
复制代码
大型的应用一般不会用这些框架(因为性能考虑);开发人员根据需要选择用一些框架,也可以不选用框架;不用框架并不代表要自己写框架;修改框架的可能性更小。
作者: 小魔女    时间: 2015-1-18 14:32
当然你也可以参加一些开源项目,一方面可以提高自己,另一方面也是为中国软件事业做贡献嘛!开发者在互联网上用CVS合作开发,用QQ,MSN,E-mail讨论联系,天南海北的程序员分散在各地却同时开发同一个软件,是不是很有意思呢?
作者: 再现理想    时间: 2015-1-21 15:12
当然你也可以参加一些开源项目,一方面可以提高自己,另一方面也是为中国软件事业做贡献嘛!开发者在互联网上用CVS合作开发,用QQ,MSN,E-mail讨论联系,天南海北的程序员分散在各地却同时开发同一个软件,是不是很有意思呢?
作者: 再见西城    时间: 2015-2-2 21:48
你可以去承接一些项目做了,一开始可能有些困难,可是你有技术积累,又考虑周全,接下项目来可以迅速作完,相信大家以后都会来找你的,所以Money就哗啦啦的。。。。。。
作者: 灵魂腐蚀    时间: 2015-2-8 07:35
Java是一种计算机编程语言,拥有跨平台、面向对java
作者: 仓酷云    时间: 2015-2-24 23:50
是一种简化的C++语言 是一种安全的语言,具有阻绝计算机病毒传输的功能
作者: 只想知道    时间: 2015-3-7 14:24
你一定会高兴地说,哈哈,原来成为Java高手就这么简单啊!记得Tomjava也曾碰到过一个项目经理,号称Java很简单,只要三个月就可以学会。
作者: 分手快乐    时间: 2015-3-15 07:30
Java自面世后就非常流行,发展迅速,对C++语言形成了有力冲击。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于个人PC、数据中心、游戏控制台
作者: 愤怒的大鸟    时间: 2015-3-21 20:24
如果你学过HTML,那么事情要好办的多,如果没有,那你快去补一补HTML基础吧。其实JSP中的Java语法也不多,它更象一个脚本语言,有点象ASP。




欢迎光临 仓酷云 (http://ckuyun.com/) Powered by Discuz! X3.2