746 Star 2.8K Fork 834

abel533 / Mybatis_PageHelper

 / 详情

建议在多数据源时的数据源方言缓存采用 DataSourceMap 替代 UrlMap

待办的
创建于  
2017-05-31 16:34

目前在类 PageAutoDialect 中,对多数据源的方言缓存采用的这个 Map<String, AbstractHelperDialect> urlDialectMap
这个 Map 的 key 是数据源的 JDBC URL。而每次分页查询时是使用下面这个方法从数据源中获取的:

    private String getUrl(DataSource dataSource) {
        Connection conn = null;
        try {
            conn = dataSource.getConnection();
            return conn.getMetaData().getURL();
        } catch (SQLException e) {
            throw new PageException(e);
        } finally {
            if (conn != null) {
                try {
                    if (closeConn) {
                        conn.close();
                    }
                } catch (SQLException e) {
                    //ignore
                }
            }
        }
    }

这个方法有一个非常大的问题在于,每个查询要多占用一个连接。这种情况很浪费资源。。。

我的建议是对多数据源的方言缓存采用这种类型

Map<DataSource, AbstractHelperDialect> dataSourceDialectMap =
        Collections.synchronizedMap(new IdentityHashMap<DataSource, AbstractHelperDialect>());

也就是将 Map 的 key 换成数据源的引用本身。这样在后续获取方言时,不需要重新获取数据库连接。
同时实际上在多数据源环境时,不同数据源的 JDBC URL 一般不同,所以在空间使用率上不会比 url 为 key 的 Map 差很多。

当然,如果能使用弱引用 IdentityHashMap 那就更好了。JRE 中没有弱引用的 IdentityHashMap 实现,可以参考下面这个的实现。
WeakIdentityHashMap

评论 (2)

MoonFruit 创建了任务
MoonFruit 更新了任务

考虑过这种,但是你忘了还有动态数据源,也就是datasource相同,实际连的数据库不同这种情况。

可是我还是觉得每次都要获取连接的方式不好,不能再加点儿参数处理一下么?比如指定是针对 URL 缓存还是 DataSource 缓存。
因为即使是动态数据源,同一数据源下的不同连接分别属于不同种类数据库的场景也是不多的。。。
所以我觉得,为了比较少的应用而牺牲这么多的资源有点儿划不来。。。

abel533 添加了标签enhancement

登录 后才可以发表评论

状态
负责人
里程碑
Pull Requests
关联的 Pull Requests 被合并后可能会关闭此 issue
分支
开始日期   -   截止日期
-
置顶选项
优先级
参与者(2)
8363 free 1578914558 602073 moonfruit 1578928871
Java
1
https://gitee.com/free/Mybatis_PageHelper.git
git@gitee.com:free/Mybatis_PageHelper.git
free
Mybatis_PageHelper
Mybatis_PageHelper

搜索帮助