Closed baisui1981 closed 1 month ago
将连接池嵌入TisExceptionInterceptor ,通过以下方式实现线程级复用 TisExceptionInterceptor:
try (JDBCConnectionPool jdbcConnectionPool = JDBCConnectionPool.create()) {
JDBCConnection.connectionPool.set(jdbcConnectionPool);
// ...
} finally {
JDBCConnection.connectionPool.remove();
}
以下是 DataSourceFactory中通过对象池获取可用的JDBCConnection
实例执行逻辑
DataSourceFactory:
public final JDBCConnection getConnection(String jdbcUrl, boolean verify) throws SQLException {
JDBCConnectionPool connectionPool = JDBCConnection.connectionPool.get();
JDBCConnection conn = null;
if (connectionPool != null) {
conn = connectionPool.getConnection(jdbcUrl, verify);
if (conn == null) {
return connectionPool.getConnection(jdbcUrl, verify, (url) -> {
try {
return createConnection(jdbcUrl, verify);
} catch (SQLException e) {
throw new RuntimeException(e);
}
});
} else {
return conn;
}
} else {
return createConnection(jdbcUrl, verify);
}
}
现象
有同学反馈TIS增量启动速度比较慢,一百张表的增量执行管道需要将近20分钟。
以下是启动执行日志链接:https://github.com/qlangtech/plugins-commercial/issues/1
问题分析:
根据典型的日志:
下面那条通过表名获取对应的列元组信息,需要耗费5秒 时间,这个算比较耗费时间的,主要原因是:创建jdbc Connection对象费时,且没有使用dbcp的connection pool来缓存,所以当需要同步的表比较多时的确会比较耗时。
优化思路:
在整个启动过程中,引入Connection缓存机制,将对应构建jdbcURL->Connection的 映射关系作为缓存。启动过程只需要构对Connection实例进行一次初始化工作,将会大大缩减启动初始化时间。