[转帖]我们爱享----事务上下文_Tomcat, WebLogic及J2EE讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  Tomcat, WebLogic及J2EE讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 3315 | 回复: 0   主题: [转帖]我们爱享----事务上下文        下一篇 
liulin_2
注册用户
等级:少校
经验:1143
发帖:85
精华:5
注册:2012-12-10
状态:离线
发送短消息息给liulin_2 加好友    发送短消息息给liulin_2 发消息
发表于: IP:您无权察看 2012-12-10 15:50:07 | [全部帖] [楼主帖] 楼主

要想进行事务管理,有一个概念必须要清楚,即:必须保证开始事务,和关闭事务是同一个数据库连接。 事务上下文的主要实现,依赖于ThreadLocal,关于该类的作用,不多讲。不清楚的同学可以自己Google查一下。 以面以基于c3po数据源管理为例。

一、封装一个简单的连接池

Java code
/**

    * @author <a href="mailto:amoszhou@foxmail.com">大胡子</a>

    * @功能描述:连接池接口

    * @Since Mar 11, 2011

    * 

    */
public interface PooledConnection {
      /**

    * 

    * @author <a href="mailto:amoszhou@foxmail.com">大胡子</a>

    * @功能描述:初始化

    * @Since Mar 11, 2011

    */
      public void init();
      /**

    * 

    * @author <a href="mailto:amoszhou@foxmail.com">大胡子</a>

    * @功能描述:关闭连接池

    * @Since Mar 11, 2011

    */
      public void destory();
      /**

    * 

    * @author <a href="mailto:amoszhou@foxmail.com">大胡子</a>

    * @功能描述:获取连接

    * @Since Mar 11, 2011

    * @return

    * @throws SQLException

    */
      public Connection getConnection() throws SQLException;
      public void releaseConnection(Connection conn) throws SQLException;
}
Java code
/**

    * @author <a href="mailto:amoszhou@foxmail.com">大胡子</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数据源会自动初始化这些信息。

CSS code
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


    这样,我们第一部分的工作就做完了。

二、我们来对事务对象进行一个抽象。定义一个事务对象:

Java code
public class Transaction {
      private Connection connection;
      private Integer transCount;
      private Integer commitCount;
      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;
      }
}


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




赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论