From ea7c8514244d7752e98a18e51f3463718b940ed6 Mon Sep 17 00:00:00 2001 From: Looly Date: Thu, 22 Aug 2019 21:04:35 +0800 Subject: [PATCH] fix db bug --- CHANGELOG.md | 1 + .../cn/hutool/db/ThreadLocalConnection.java | 29 +++++++++++-------- 2 files changed, 18 insertions(+), 12 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 159ef4df3..919907fd5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ ### 新特性 ### Bug修复 +* 【db】 解决ThreadLocalConnection多数据源被移除问题(pr#66@Gitee) ------------------------------------------------------------------------------------------------------------- diff --git a/hutool-db/src/main/java/cn/hutool/db/ThreadLocalConnection.java b/hutool-db/src/main/java/cn/hutool/db/ThreadLocalConnection.java index d1499b32a..1c669804e 100644 --- a/hutool-db/src/main/java/cn/hutool/db/ThreadLocalConnection.java +++ b/hutool-db/src/main/java/cn/hutool/db/ThreadLocalConnection.java @@ -35,7 +35,7 @@ public enum ThreadLocalConnection { } return groupedConnection.get(ds); } - + /** * 关闭数据库,并从线程池中移除 * @@ -46,7 +46,8 @@ public enum ThreadLocalConnection { GroupedConnection groupedConnection = threadLocal.get(); if (null != groupedConnection) { groupedConnection.close(ds); - if(groupedConnection.removeAble()){ + if (groupedConnection.isEmpty()) { + // 当所有分组都没有持有的连接时,移除这个分组连接 threadLocal.remove(); } } @@ -54,6 +55,8 @@ public enum ThreadLocalConnection { /** * 分组连接,根据不同的分组获取对应的连接,用于多数据源情况 + * + * @author Looly */ public static class GroupedConnection { @@ -75,7 +78,7 @@ public enum ThreadLocalConnection { } return conn; } - + /** * 关闭并移除Connection
* 如果处于事务中,则不进行任何操作 @@ -85,27 +88,29 @@ public enum ThreadLocalConnection { */ public GroupedConnection close(DataSource ds) { final Connection conn = connMap.get(ds); - if(null != conn) { + if (null != conn) { try { - if(false == conn.getAutoCommit()) { - //非自动提交事务的连接,不做关闭(可能处于事务中) + if (false == conn.getAutoCommit()) { + // 非自动提交事务的连接,不做关闭(可能处于事务中) return this; } } catch (SQLException e) { - //ignore + // ignore } connMap.remove(ds); DbUtil.close(conn); } return this; } - + /** - * 多数据源情况情况下判断是否能从上下文中删除 - * @return + * 持有的连接是否为空 + * + * @return 持有的连接是否为空 + * @since 4.6.4 */ - public boolean removeAble(){ - return connMap.size()==0; + public boolean isEmpty() { + return connMap.isEmpty(); } } }