当前访客身份:游客 [ 登录 | 加入 OSCHINA ]

代码分享

当前位置:
代码分享 » Java  » Web编程
aqu

JFINAL手动事务

aqu 发布于 2015年09月17日 10时, 11评/1772阅
分享到: 
收藏 +0
4
一直在用JFINAL,感觉不错,前几天,需要用到一个功能:EXCEL导入,需要记录EXCEL导入日志,并需要记录成功或者失败,如果失败,是神马原因造成的,可是JFINAL的声名式事务,一但抛出异常,则整个事务回滚,于是我无法记录导入失败日志到数据表中。。。。Db.tx(new IAtom() 这样的方式,也挺复杂的,,无法访问外端的数据,,也许是我没找到方法吧,,但时间不允许了,只好自己写了一个用,,,分享出来大家帮着看看,会不会有什么问题!
使用方法:
xxModel xm = new xxModel();
xm.set...
xm.set..
xm.save();
JfinalKit.beginTran();
try{
    update1....
    update2...
   JfinalKit.commit();
}catch(Exception e){
     JfinalKit.rollback();
}
2016-09-12更新:
看了一下JFINAL的事务事现机制,在commit 和 rollback时自动关闭connection并清空本地线程,以前的代码因为未自动CLOSE,所以会导至一些很严重的问题。
另外,如果您使用了本代码,开启了手动事务,那么,请不要使用@Befor(Tx.class)拦截器,有可能冲突哦!!!
标签: JFinal

代码片段(1) [全屏查看所有代码]

1. [代码][Java]代码     跳至 [1] [全屏预览]

package com.v246.commonWebFramework.utils;

import com.jfinal.plugin.activerecord.DbKit;

/**
 * Created by aquaq on 2015/9/14.
 */
public class JfinalKit {
    public static void beginTran() {
        try {
            DbKit.getConfig().setThreadLocalConnection(DbKit.getConfig().getConnection());
            DbKit.getConfig().getThreadLocalConnection().setAutoCommit(false);
        } catch (Exception e) {
            throw (new RuntimeException(e));
        }
    }
    public static void beginTran(int level) {
        try {
            DbKit.getConfig().setThreadLocalConnection(DbKit.getConfig().getConnection());
            DbKit.getConfig().getThreadLocalConnection().setAutoCommit(false);
            DbKit.getConfig().getThreadLocalConnection().setTransactionIsolation(level);
        } catch (Exception e) {
            throw (new RuntimeException(e));
        }
    }
    public static void commit() throws RuntimeException{
        try {
            DbKit.getConfig().getThreadLocalConnection().commit();
            DbKit.getConfig().getThreadLocalConnection().setAutoCommit(true);
            DbKit.getConfig().close(DbKit.getConfig().getThreadLocalConnection());
            DbKit.getConfig().setThreadLocalConnection(null);
        } catch (Exception e) {
            throw (new RuntimeException(e));
        }
    }
    public static void beginTran(String configName) {
        try {
            DbKit.getConfig(configName).setThreadLocalConnection(DbKit.getConfig(configName).getConnection());
            DbKit.getConfig(configName).getThreadLocalConnection().setAutoCommit(false);
        } catch (Exception e) {
            throw (new RuntimeException(e));
        }
    }
    public static void commit(String configName) {
        try {
            DbKit.getConfig(configName).getThreadLocalConnection().commit();
            DbKit.getConfig(configName).getThreadLocalConnection().setAutoCommit(true);
            DbKit.getConfig(configName).close(DbKit.getConfig().getThreadLocalConnection());
            DbKit.getConfig(configName).setThreadLocalConnection(null);
        } catch (Exception e) {
            throw (new RuntimeException(e));
        }
    }
    public static void rollback(){
        try {
            DbKit.getConfig().getThreadLocalConnection().rollback();
            DbKit.getConfig().getThreadLocalConnection().setAutoCommit(true);
            DbKit.getConfig().close(DbKit.getConfig().getThreadLocalConnection());
            DbKit.getConfig().setThreadLocalConnection(null);

        } catch (Exception e) {
            throw (new RuntimeException(e));
        }
    }
    public static void rollback(String configName){
        try {
            DbKit.getConfig(configName).getThreadLocalConnection().rollback();
            DbKit.getConfig(configName).getThreadLocalConnection().setAutoCommit(true);
            DbKit.getConfig(configName).close(DbKit.getConfig().getThreadLocalConnection());
            DbKit.getConfig(configName).setThreadLocalConnection(null);
        } catch (Exception e) {
            throw (new RuntimeException(e));
        }
    }
}


开源中国-程序员在线工具:Git代码托管 API文档大全(120+) JS在线编辑演示 二维码 更多»

发表评论 回到顶部 网友评论(11)

  • 1楼:修改性别 发表于 2015-09-17 10:14 回复此评论
    great
  • 2楼:JFinal 发表于 2015-11-03 22:36 回复此评论
    想法很好,代码建议做类似的改进:
    private static void beginTran(Config config) {
     try {
      Connection conn = config.getConnection();
      config.setThreadLocalConnection(conn);
      conn.setAutoCommit(false);
     } catch (Exception e) {
     throw (new RuntimeException(e));
     }
    }
    
    public static void beginTran(String configName) {
      beginTran(DbKit.getConfig(configName));
    }
    
    public static void beginTran() {
      beginTran(DbKit.getConfig());
    }

        以上可以消除重复代码,另外, commit() 与 rollback() 中没有关闭连接,会造成资源泄漏。

  • 3楼:aqu 发表于 2015-11-05 20:12 回复此评论
    哈,谢谢波总,你不说,我还真不知道代码有这么大的问题,马上改进!
  • 4楼:狂热大猩猩 发表于 2016-09-09 10:29 回复此评论

    引用来自“aqu”的评论

    哈,谢谢波总,你不说,我还真不知道代码有这么大的问题,马上改进!
    楼主,关闭连接在哪里进行设置啊,我参考您的代码之后,将程序部署到Linux服务器上,不定时报connection is closed异常,求助
  • 5楼:aqu 发表于 2016-09-09 16:37 回复此评论

    引用来自“aqu”的评论

    哈,谢谢波总,你不说,我还真不知道代码有这么大的问题,马上改进!

    引用来自“狂热大猩猩”的评论

    楼主,关闭连接在哪里进行设置啊,我参考您的代码之后,将程序部署到Linux服务器上,不定时报connection is closed异常,求助
    @JFinal 我这个代码,需不需要手动调用CLOSE方法? 也就是说,我这个方法里获取到的CONNECTION还受不受JFINAL的统一管理?
  • 6楼:JFinal 发表于 2016-09-09 16:48 回复此评论

    引用来自“aqu”的评论

    哈,谢谢波总,你不说,我还真不知道代码有这么大的问题,马上改进!

    引用来自“狂热大猩猩”的评论

    楼主,关闭连接在哪里进行设置啊,我参考您的代码之后,将程序部署到Linux服务器上,不定时报connection is closed异常,求助

    引用来自“aqu”的评论

    @JFinal 我这个代码,需不需要手动调用CLOSE方法? 也就是说,我这个方法里获取到的CONNECTION还受不受JFINAL的统一管理?
    需要手动 close,因为你是自行获取的 connection。建议调试确定一下,如果你这个事务的开启与提交、回滚都是在 jfinal arp 已有的事务管理范围之内是可以不用自己关的
  • 7楼:圣杰是也 发表于 2016-09-09 17:42 回复此评论
    期待整好之后分享出来。感谢
  • 8楼:aqu 发表于 2016-09-12 16:25 回复此评论
    代码已修复,汗颜啊,,JFinal老大在最开始的时候就已经指出问题了,,
  • 9楼:dbrose 发表于 2017-03-30 15:58 回复此评论
    aqu,请分享你 修改后的代码,谢谢1
  • 10楼:aqu 发表于 2017-03-31 19:32 回复此评论

    引用来自“dbrose”的评论

    aqu,请分享你 修改后的代码,谢谢1
    现在的代码就是最新的代码,旧代码我直接编辑掉了
  • 11楼:wxiaolong 发表于 2018-10-10 15:34 回复此评论
    public final void close(Connection conn) { if (threadLocal.get() == null) // in transaction if conn in threadlocal  if (conn != null) try {conn.close();} catch (SQLException e) {throw new ActiveRecordException(e);}
    }

    调用close时, threadLocal.get()还不是null,是在下一句执行,那么就不会执行conn.close() 这个是怎么处理的呢?是还需要改善吗?
开源从代码分享开始 分享代码
aqu的其它代码 全部(3)...