要想进行事务管理,有一个概念必须要清楚,即:必须保证开始事务,和关闭事务是同一个数据库连接。 事务上下文的主要实现,依赖于ThreadLocal,关于该类的作用,不多讲。不清楚的同学可以自己Google查一下。 以面以基于c3po数据源管理为例。
一、封装一个简单的连接池
     
           /**
 * @author <a href="mailto:[email protected]">大胡子</a>
 * @功能描述:连接池接口
 * @Since Mar 11, 2011
 * 
 */
public interface PooledConnection {

/**
 * 
 * @author <a href="mailto:[email protected]">大胡子</a>
 * @功能描述:初始化
 * @Since Mar 11, 2011
 */
public  void init(); /**
 * 
 * @author <a href="mailto:[email protected]">大胡子</a>
 * @功能描述:关闭连接池
 * @Since Mar 11, 2011
 */
public void destory(); /**
 * 
 * @author <a href="mailto:[email protected]">大胡子</a>
 * @功能描述:获取连接
 * @Since Mar 11, 2011
 * @return
 * @throws SQLException
 */
public Connection getConnection() throws SQLException;

public void releaseConnection(Connection conn) throws SQLException;
}
 
      /**
 * @author <a href="mailto:[email protected]">大胡子</a>
 * @功能描述:基于C3PO连接池的实现类
 * @Since Mar 11, 2011
 *
 */
public class RYTPooledConnection implements PooledConnection {

/**
 * c3po的数据源
 */
private  static ComboPooledDataSource ds;

/**
 * 关闭数据源
 */
public final void destory() {
ds.close();
} /**
 * 获取数据库连接
 */
public final  Connection getConnection() throws SQLException {
return ds.getConnection();
}

/**
 * 初始化
 */
public final  void init() {
if(null == ds){
ds = new ComboPooledDataSource();
}
} public void releaseConnection(Connection conn) throws SQLException {
if(null != conn){
conn.close();
}
}
}以上代码,就是对c3po就行了一个简单的封装,之所以提供接口,目的相信大家都懂,为了方便扩展,以后若是不用C3PO怎么办? 很多人会问,你这里没有提供连接池的大小,初始化连接信息之类,那么我告诉你。你只需要在src目录下,提供
c3p0.properties文件,c3po数据源会自动初始化这些信息。c3p0.driverClass=com.mysql.jdbc.Driver
c3p0.jdbcUrl=jdbc:mysql://127.0.0.1:3306/testdb
c3p0.user=root
c3p0.password=123456
c3p0.initialPoolSize=10
c3p0.minPoolSize=10
c3p0.maxPoolSize=100
    这样,我们第一部分的工作就做完了。
二、我们来对事务对象进行一个抽象。定义一个事务对象:     
public class Transaction {

/**database connection**/
private Connection connection;

/***trasaction begon count***/
private Integer transCount;

/*****commited cout**/
private Integer commitCount;

/***Deep**/
private Integer transDeep;

/**
 * 
 * @Function:judge is all transaction commited
 * @Since Mar 30, 2011
 * @return
 */
public boolean isFullExecute(){
return  commitCount + 1 == transCount;
}


public Integer getTransDeep() {
return transDeep;
} public void setTransDeep(Integer transDeep) {
this.transDeep = transDeep;
} public Connection getConnection() {
return connection;
} public Integer getTransCount() {
return transCount;
} public Integer getCommitCount() {
return commitCount;
} public void setConnection(Connection connection) {
this.connection = connection;
} public void setTransCount(Integer transCount) {
this.transCount = transCount;
} public void setCommitCount(Integer commitCount) {
this.commitCount = commitCount;
}


}         关于transCount和commitCount作一个简单的说明,这两个属性是我们来模仿一个简单的嵌套事务的。 这个嵌套事务不像spring的嵌套事务那么复杂。 仅仅是逻辑上的嵌套而已,我们定义一个开启事务的次数,以及一个提交的次数。这样,我们可以用两者判断事务是不是完全提交了。 
   

解决方案 »

  1.   

    public class Transaction {
        
        /**database connection**/
        private Connection connection;
        
        /***trasaction begon count***/
        private Integer transCount;
        
        /*****commited cout**/
        private Integer commitCount;
        
        /***Deep**/
        private Integer transDeep;
        
        /**
         * 
         * @Function:judge is all transaction commited
         * @Since Mar 30, 2011
         * @return
         */
        public boolean isFullExecute(){
            return  commitCount + 1 == transCount;
      

  2.   

    空了讲讲spring里的事务控制啊。
      

  3.   


    等有空吧,怎么? 你现在也学习折腾Java?
      

  4.   

    我记得session的创建有2中方式的,
      

  5.   

    代码入侵程度很高,看上去是 JDBC,但实际上又不是 JDBC,完全没有按照 JDBC 规范来走。JDBC 规范连接池是需要实现 javax.sql.DataSource 接口的,而你整了个 PooledConnection 这个接口,与标准的 JDBC 接口没有丝毫关系,代码入侵就是从这个接口开始的!试想一下,如果哪天找到更好的解决方案,能很方便地使用新方案替换么?
      

  6.   

    扫了一眼,
    1 ,openSession多线程BUGGY
    2,MethodInterceptor不知引用的哪个包,但如果做想做这么底层的框架,至少也要动态编译或基于ASM来做吧。
      

  7.   

    PooledConnection   封装的是C3PO   C3PO他已经是JDBC规范了,我只不过是对提供了我自己的开闭方法,包装了一下
      

  8.   

     【要想进行事务管理,有一个概念必须要清楚,即:必须保证开始事务,和关闭事务是同一个数据库连接。】
    JTA规范是支持分布式数据库的事务提交的。很多中间件比如WebSphere和WebLogic也都实现了。
      

  9.   

    不错,不错,涉足java从来没搞过这方面呢,呵呵~~ 大胡子兄八错~~顶你~
      

  10.   

    bucuo等我 弄java的时候分享!
      

  11.   

    感觉c3p0和DPCP都不是很好用,你这个和c3p0写在一起,功能是实现了,但是又复杂了不少,有点像JDBC又实际是c3p0加了点东东,感觉很怪....不过最后采用cglib实现动态代理那里倒是个亮点