仓酷云
标题:
了解下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事件代码以下:
public class TransactionTemplate {
protected final Log logger = LogFactory.getLog(TransactionTemplate.class);
private FlushMode flushMode = FlushMode.ALWAYS;
public Object execute(TransactionCallback callback) {
//起首猎取sessionFactory
SessionFactory sessionFactory = (SessionFactory) Framework.getEngine()
.getContainer().getComponent("sessionFactory");
//创立一个新的session并翻开
logger.debug("Opening single Hibernate Session in
TransactionTemplate");
Session session = getSession(sessionFactory);
//将session与以后线程绑定
TransactionSynchronizationManager.bindResource(sessionFactory, new
SessionHolder(session));
//猎取数据库毗连
Connection conn = session.connection();
Object result = null;
Transaction transaction = null;
try {
//入手下手处置JDBC事件
transaction = session.beginTransaction();
try {
result = callback.doInTransaction(conn);
}
catch (RuntimeException ex) {
doRollback(session, transaction);
throw ex;
}
catch (Error err) {
doRollback(session, transaction);
throw err;
}
//假如数据库操纵过程当中没有产生非常则提交事件
transaction.commit();
} catch (WorkflowException e) {
logger.error("数据库操纵失利,事件回滚也失利!");
throw e;
} catch (RuntimeException ex) {
logger.error("数据库操纵失利,事件被回滚!");
throw ex;
} catch (Error err) {
logger.error("数据库操纵失利,事件被回滚!");
throw err;
} finally {
// 将session与以后线程排除绑定
TransactionSynchronizationManager.unbindResource(sessionFactory);
doClose(session);
}
return result;
}
protected Session getSession(SessionFactory sessionFactory) {
Session session = SessionFactoryUtils.getSession(sessionFactory, true);
FlushMode flushMode = getFlushMode();
if (flushMode != null) {
session.setFlushMode(flushMode);
}
return session;
}
private void doRollback(Session session, Transaction transaction) {
logger.debug("数据库操纵非常,入手下手回滚事件");
try {
transaction.rollback();
logger.debug("回滚事件乐成!");
}
catch (Exception e) {
logger.error("回滚事件失利!");
throw new WorkflowException("回滚事件失利!");
} finally {
session.clear();
}
}
private void doClose(Session session) {
logger.debug("入手下手封闭毗连");
try {
session.close();
}
catch (Exception e) {
logger.error("封闭毗连失利!");
throw new WorkflowException("封闭毗连失利!");
}
}
public FlushMode getFlushMode() {
return flushMode;
}
public void setFlushMode(FlushMode flushMode) {
this.flushMode = flushMode;
}
}
public interface TransactionCallback {
Object doInTransaction(Connection conn);
}
复制代码
挪用伪代码:
public void methodA(){
TransactionTemplate transactionTemplate=new TransactionTemplate();
transactionTemplate.execute(new TransactionCallback(){
public Object doInTransaction(Connection conn) {
//客户代码
client.method1("1");
//我们代码 间接利用
our.method2();
//客户代码
client.method3("l");
return null;
}
});
}
复制代码
大型的应用一般不会用这些框架(因为性能考虑);开发人员根据需要选择用一些框架,也可以不选用框架;不用框架并不代表要自己写框架;修改框架的可能性更小。
作者:
小魔女
时间:
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