Bläddra i källkod

处理SqlRunner的sqlSession获取与释放.

聂秋秋 6 år sedan
förälder
incheckning
ee37c237ff

+ 52 - 12
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/toolkit/SqlRunner.java

@@ -19,9 +19,10 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
+import com.baomidou.mybatisplus.core.toolkit.GlobalConfigUtils;
 import org.apache.ibatis.session.SqlSession;
 import org.apache.ibatis.session.SqlSessionFactory;
-import org.mybatis.spring.SqlSessionTemplate;
+import org.mybatis.spring.SqlSessionUtils;
 import org.springframework.transaction.annotation.Transactional;
 
 import com.baomidou.mybatisplus.core.assist.ISqlRunner;
@@ -45,8 +46,6 @@ public class SqlRunner implements ISqlRunner {
 //    public static SqlSessionFactory FACTORY;
     private SqlSessionFactory sqlSessionFactory;
     
-    private SqlSession sqlSession;
-
     private Class<?> clazz;
 
     public SqlRunner() {
@@ -87,13 +86,23 @@ public class SqlRunner implements ISqlRunner {
     @Transactional
     @Override
     public boolean insert(String sql, Object... args) {
-        return SqlHelper.retBool(sqlSession().insert(INSERT, sqlMap(sql, args)));
+        SqlSession sqlSession = sqlSession();
+        try {
+            return SqlHelper.retBool(sqlSession.insert(INSERT, sqlMap(sql, args)));
+        }finally {
+            closeSqlSession(sqlSession);
+        }
     }
     
     @Transactional
     @Override
     public boolean delete(String sql, Object... args) {
-        return SqlHelper.retBool(sqlSession().delete(DELETE, sqlMap(sql, args)));
+        SqlSession sqlSession = sqlSession();
+        try {
+            return SqlHelper.retBool(sqlSession.delete(DELETE, sqlMap(sql, args)));
+        }finally {
+            closeSqlSession(sqlSession);
+        }
     }
 
     /**
@@ -112,7 +121,12 @@ public class SqlRunner implements ISqlRunner {
     @Transactional
     @Override
     public boolean update(String sql, Object... args) {
-        return SqlHelper.retBool(sqlSession().update(UPDATE, sqlMap(sql, args)));
+        SqlSession sqlSession = sqlSession();
+        try {
+            return SqlHelper.retBool(sqlSession.update(UPDATE, sqlMap(sql, args)));
+        }finally {
+            closeSqlSession(sqlSession);
+        }
     }
 
     /**
@@ -125,7 +139,12 @@ public class SqlRunner implements ISqlRunner {
      */
     @Override
     public List<Map<String, Object>> selectList(String sql, Object... args) {
-        return sqlSession().selectList(SELECT_LIST, sqlMap(sql, args));
+        SqlSession sqlSession = sqlSession();
+        try {
+            return sqlSession().selectList(SELECT_LIST, sqlMap(sql, args));
+        }finally {
+            closeSqlSession(sqlSession);
+        }
     }
 
     /**
@@ -138,7 +157,12 @@ public class SqlRunner implements ISqlRunner {
      */
     @Override
     public List<Object> selectObjs(String sql, Object... args) {
-        return sqlSession().selectList(SELECT_OBJS, sqlMap(sql, args));
+        SqlSession sqlSession = sqlSession();
+        try {
+            return sqlSession.selectList(SELECT_OBJS, sqlMap(sql, args));
+        }finally {
+            closeSqlSession(sqlSession);
+        }
     }
 
     /**
@@ -156,7 +180,12 @@ public class SqlRunner implements ISqlRunner {
     
     @Override
     public int selectCount(String sql, Object... args) {
-        return SqlHelper.retCount(sqlSession().<Integer>selectOne(COUNT, sqlMap(sql, args)));
+        SqlSession sqlSession = sqlSession();
+        try {
+            return SqlHelper.retCount(sqlSession.<Integer>selectOne(COUNT, sqlMap(sql, args)));
+        }finally {
+            closeSqlSession(sqlSession);
+        }
     }
 
     @Override
@@ -181,10 +210,21 @@ public class SqlRunner implements ISqlRunner {
      * <p/>
      */
     private SqlSession sqlSession() {
-        if(sqlSession == null){
-            this.sqlSession = new SqlSessionTemplate(DEFAULT.sqlSessionFactory);
+        return (clazz != null) ? SqlSessionUtils.getSqlSession(GlobalConfigUtils.currentSessionFactory(clazz)) : SqlSessionUtils.getSqlSession(sqlSessionFactory);
+    }
+    
+    /**
+     * 释放sqlSession
+     * @param sqlSession session
+     */
+    private void closeSqlSession(SqlSession sqlSession){
+        SqlSessionFactory sqlSessionFactory;
+        if(clazz!=null){
+            sqlSessionFactory = GlobalConfigUtils.currentSessionFactory(clazz);
+        }else {
+            sqlSessionFactory = DEFAULT.sqlSessionFactory;
         }
-        return (clazz != null) ? SqlHelper.sqlSession(clazz) : sqlSession;
+        SqlSessionUtils.closeSqlSession(sqlSession,sqlSessionFactory);
     }
 
 }