深爱那片海 发表于 2015-1-18 11:04:53

了解下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:25

当然你也可以参加一些开源项目,一方面可以提高自己,另一方面也是为中国软件事业做贡献嘛!开发者在互联网上用CVS合作开发,用QQ,MSN,E-mail讨论联系,天南海北的程序员分散在各地却同时开发同一个软件,是不是很有意思呢?

再现理想 发表于 2015-1-21 15:12:14

当然你也可以参加一些开源项目,一方面可以提高自己,另一方面也是为中国软件事业做贡献嘛!开发者在互联网上用CVS合作开发,用QQ,MSN,E-mail讨论联系,天南海北的程序员分散在各地却同时开发同一个软件,是不是很有意思呢?

再见西城 发表于 2015-2-2 21:48:18

你可以去承接一些项目做了,一开始可能有些困难,可是你有技术积累,又考虑周全,接下项目来可以迅速作完,相信大家以后都会来找你的,所以Money就哗啦啦的。。。。。。

灵魂腐蚀 发表于 2015-2-8 07:35:50

Java是一种计算机编程语言,拥有跨平台、面向对java

仓酷云 发表于 2015-2-24 23:50:48

是一种简化的C++语言 是一种安全的语言,具有阻绝计算机病毒传输的功能

只想知道 发表于 2015-3-7 14:24:02

你一定会高兴地说,哈哈,原来成为Java高手就这么简单啊!记得Tomjava也曾碰到过一个项目经理,号称Java很简单,只要三个月就可以学会。

分手快乐 发表于 2015-3-15 07:30:15

Java自面世后就非常流行,发展迅速,对C++语言形成了有力冲击。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于个人PC、数据中心、游戏控制台

愤怒的大鸟 发表于 2015-3-21 20:24:01

如果你学过HTML,那么事情要好办的多,如果没有,那你快去补一补HTML基础吧。其实JSP中的Java语法也不多,它更象一个脚本语言,有点象ASP。
页: [1]
查看完整版本: 了解下JAVA的浅谈怎样分离JDBC事件与Spring+Hibernate