目前在类 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
考虑过这种,但是你忘了还有动态数据源,也就是datasource相同,实际连的数据库不同这种情况。
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。
可是我还是觉得每次都要获取连接的方式不好,不能再加点儿参数处理一下么?比如指定是针对 URL 缓存还是 DataSource 缓存。
因为即使是动态数据源,同一数据源下的不同连接分别属于不同种类数据库的场景也是不多的。。。
所以我觉得,为了比较少的应用而牺牲这么多的资源有点儿划不来。。。
登录 后才可以发表评论