action上加上@Before(Tx.class)事务,log4j 不打印 sql语句。

itartisan 发布于 2013/02/25 10:24
阅读 537
收藏 1

action上加上@Before(Tx.class)事务,log4j 不打印 sql语句。

action方法:

public void getContent() {
Article article = Article.dao.findById(getParaToInt(0, 1), "id,title,content,publishDate,readTimes");
int times = 0;
try{
times = article.getInt("readTimes");
}catch (Exception e) {
times = 0;
}
article.set("readTimes",  times+ 1);
article.update();
setAttr("article", article);
renderJsp("article.jsp");
}
打印:

2013-02-24 14:14:14
[INFO]-[Thread: qtp6864111-19]-[com.jfinal.plugin.activerecord.SqlReporter.invoke()]: Sql: select `id`, `title`, `content`, `publishDate`, `readTimes` from `article` where `id` = ?
2013-02-24 14:14:14
[INFO]-[Thread: qtp6864111-19]-[com.jfinal.plugin.activerecord.SqlReporter.invoke()]: Sql: update `article` set `readTimes` = ?  where `id` = ?

方法上加上@Before(Tx.class)

sql语句不打印


jfinal  DbKit类:122行

    /**
     * Get Connection. Support transaction if Connection in ThreadLocal
     */
    public static final Connection getConnection() throws SQLException {
        Connection conn = threadLocal.get();
        if (conn != null)
            return conn;
        return showSql ? new SqlReporter(dataSource.getConnection()).getConnection() : dataSource.getConnection();
    }

当加上事务时,直接从threadLocal中取connection,这时sqlReporter 动态代理  打印sql是不是不起作用了。


加载中
0
JFinal
JFinal

这的确是个问题,查看一下 com.jfinal.plugin.activerecrod.tx.Tx.java 文件的第42行有这样一句:

conn = DbKit.getDataSource().getConnection();

这句得到的Connection对象,没有走代理,所以不打印sql,回头我再想想如何处理,或许改成这样就可以:

conn = DbKit.getConnection();

由于 com.jfinal.plugin.activerecord.tx.Tx.java 第36 行有这样一句:


if (DbKit.isExistsThreadLocalConnection())
所以为了省点时空,而没有使用DbKit.getConnection();


返回顶部
顶部