针对NAYNHC大神的一段Java程序代码进行了优化,优化后的代码更加的简洁,并且还避免了JDBC链接池泄露的问题。java
优化点:mysql
1)在select操做的方法里面,出现异常的时候,我的以为是不须要执行session.rollback()操做的。sql
2)在全部数据库链接使用完成之后,我的以为须要执行下session.close()方法,将使用完成的链接从新返还到链接池,以免数据库链接的泄露。数据库
如下为优化后的代码:apache
package com.cy.mybatis.tools; import java.util.List; import org.apache.ibatis.session.SqlSession; import com.cy.mybatis.beans.UserBean; import com.cy.mybatis.mapper.UserMapper; import com.cy.mybatis.service.DBTools; public class UserService { public static void main(String[] args) { // insertUser(); // deleteUser(); // selectUserById(); selectAllUser(); } /** * 新增用户 */ private static void insertUser() { SqlSession session = DBTools.getSession(); UserMapper mapper = session.getMapper(UserMapper.class); UserBean user = new UserBean("lisi", "5432109876", 1100.0); try { mapper.insertUser(user); session.commit(); session.close(); } catch (Exception e) { e.printStackTrace(); session.rollback(); } } /** * 删除用户 */ private static void deleteUser(){ SqlSession session=DBTools.getSession(); UserMapper mapper=session.getMapper(UserMapper.class); try { mapper.deleteUser(1); // 增删改须要commit()会话; session.commit(); session.close(); } catch (Exception e) { e.printStackTrace(); session.rollback(); } } /** * 根据id查询用户 */ private static void selectUserById(){ SqlSession session=DBTools.getSession(); UserMapper mapper=session.getMapper(UserMapper.class); try { UserBean user = mapper.selectUserById(2);
session.commit(); session.close(); } catch (Exception e) { e.printStackTrace(); } } /** * 查询全部的用户 */ private static void selectAllUser(){ SqlSession session=DBTools.getSession(); UserMapper mapper=session.getMapper(UserMapper.class); try { List<UserBean> user=mapper.selectAllUser(); System.out.println("ResultSet has " + user.size() +" rows."); for(int i=0; i<user.size();i++){ System.out.println("ID="+user.get(i).getId()+" | " + "username="+user.get(i).getUsername()+" | " + "password="+user.get(i).getPassword()+" | " + "account="+user.get(i).getAccount()); }
session.commit(); session.close(); } catch (Exception e) { e.printStackTrace(); } } }
下面是增长session.close()方法后,在日志里面记录到的MyBatis将使用过的JDBC链接返还到链接池的记录。session
1
2 3 4 5 6 7 8 9 |
2019-2-15 15:38:55[DEBUG](JdbcTransaction.java:137) Opening JDBC Connection
2019-2-15 15:38:56[DEBUG](PooledDataSource.java:406) Created connection 372038137. 2019-2-15 15:38:56[DEBUG](JdbcTransaction.java:101) Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@162cd9f9] 2019-2-15 15:38:56[DEBUG](BaseJdbcLogger.java:159) == > Preparing: select * from t_user 2019-2-15 15:38:56[DEBUG](BaseJdbcLogger.java:159) == > Parameters: 2019-2-15 15:38:56[DEBUG](BaseJdbcLogger.java:159) < == Total: 3 2019-2-15 15:38:56[DEBUG](JdbcTransaction.java:123) Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.JDBC4Connection@162cd9f9] 2019-2-15 15:38:56[DEBUG](JdbcTransaction.java:91) Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@162cd9f9] 2019-2-15 15:38:56[DEBUG](PooledDataSource.java:363) Returned connection 372038137 to pool. |
关键字:MyBatis,JDBC,链接池泄露,链接回收mybatis