EasyDBO-0.6.0中事务处理中的严重Bug

来源:互联网 发布:权限 角色 数据库设计 编辑:程序博客网 时间:2024/05/17 22:57

 1、在EasyDBO-0.6的事务处理中,默认在不使用事务的情况下并没有释放数据源,这样会造成数据源的浪费,导致系统死机。
   需要在EasyJDBEngine引擎中JDBC相关操作的finally子句中加入释放数据源的代码,修改大致如下:
   finally {
           try {
               dba.close();
               if(autoCommit)releaseConnection();
           } catch (Exception e) {
               logger.error("释放数据库资源错误:" + e);
           }
       }
   这种默认的情况下就像使用简单的JDBC一样,执行add,update,del等相关方法后,都会自动释放数据源。

  2、在事务处理的JDBCContext上下文中,由于EasyJDBEngine是一作为一个工具类供EasyJDB调用的,以前的代码如下:
  public EasyJDBEngine(){
       private JDBCContext jdbcContext;
   public Connection getConnection() {
       Connection conn = null;
       try {            
           conn =jdbcContext.getConnection();
       } catch (Exception e) {
           logger.error("无没取得数据源,请确认数据源配置是否正确!");
           return null;
       }
       return conn;
   }
   }
  
   在这个设计中,事务只能在单线程的情况下才起作用。在多线程中,将造成一个线程关闭另一个线程中的数据源,因此就会出错。

  为了能让事务处理在多线程环境中也能正常工作,需要引入ThreadLocal静态变量,修改后的getConnection()方法如下:
   public Connection getConnection() {
       Connection conn = null;
       try {            
           conn =JDBCContext.getJdbcContext(dataSource).getConnection();
       } catch (Exception e) {
           logger.error("无没取得数据源,请确认数据源配置是否正确!");
           return null;
       }
       return conn;
   }
  
  JDBCContext要作重大的调整,加入ThreadLocal,代码大致如下:

  public class JDBCContext{

   private DataSource ds;
   protected Connection connection;
   private boolean isValid = true;
   private static ThreadLocal jdbcContext;
   /**
    * @param ds
    */
   private JDBCContext(DataSource ds){
       this.ds = ds;
       createConnection();
       System.out.println("创建数据源访问上下文!");
   }
   public static JDBCContext getJdbcContext(javax.sql.DataSource ds)
   {        
       if(jdbcContext==null)jdbcContext=new JDBCContextThreadLocal(ds);
       JDBCContext context = (JDBCContext) jdbcContext.get();
       if (context == null) {
           context = new JDBCContext(ds);
       }
       return context;
   }
   ....

   }
  参与讨论>> 



Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1162142


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 罗麦的oa上经理喜报没截图怎么办 工行融e联登录密码忘了怎么办 融e借有额度秒拒怎么办 工行银行柜台办理融e借怎么办 地球末日生存破解版金币没了怎么办 手机被别人骗走了里面的微信怎么办 在微信里面被做微商的骗了钱怎么办 在qq上骗了人50怎么办 被3m多酶清洗液滴到皮肤怎么办 做3m赔了9万怎么办 在携程网上订的酒店发票怎么办 滴滴滴取消订单电话打不通怎么办 百度云容量2068g满了怎么办 淘宝电脑端描述图片间隔大怎么办 手机上下载游戏自动扣费怎么办 苹果手机下载游戏自动扣费怎么办 用手机账号登陆游戏换手机怎么办 在qq上被骗充q币怎么办 微信借钱后删了好友怎么办 财付通绑定了其它人的身份证怎么办 微信支付密码忘了没绑银行卡怎么办 微信没有绑银行卡忘记密码怎么办 威信解绑银行卡支付密码望了怎么办 买了个qq号绑定了财付通怎么办 淘宝买的东西下架了怎么办 微信红包充话费充错了怎么办 手机qq不能发红包或转账怎么办 qq给人发红包被骗了怎么办 qq发红包对方看不不到怎么办 手机浏览器支付页面弹不出来怎么办 新手机登录微信需要验证怎么办 手机淘宝注册账号换手机号后怎么办 冒充微信好友诈骗被骗了怎么办 刚刚激活的电信手机号码忘了怎么办 用手机充话费充错了怎么办 王者荣耀号丢了换成了别的号怎么办 微信给空号q币怎么办 qq密码被别人改了怎么办怎么登 qq刚改了密码忘了怎么办 qq密码忘了想改密码怎么办 qq账号和密码都忘了怎么办