diff --git a/fe/be-java-extensions/jdbc-scanner/src/main/java/org/apache/doris/jdbc/JdbcDataSource.java b/fe/be-java-extensions/jdbc-scanner/src/main/java/org/apache/doris/jdbc/JdbcDataSource.java index 95b3dac585a0f2..6a6a022d29c007 100644 --- a/fe/be-java-extensions/jdbc-scanner/src/main/java/org/apache/doris/jdbc/JdbcDataSource.java +++ b/fe/be-java-extensions/jdbc-scanner/src/main/java/org/apache/doris/jdbc/JdbcDataSource.java @@ -30,15 +30,20 @@ public static JdbcDataSource getDataSource() { return jdbcDataSource; } - public DruidDataSource getSource(String jdbcUrl) { - return sourcesMap.get(jdbcUrl); + public DruidDataSource getSource(String cacheKey) { + return sourcesMap.get(cacheKey); } - public void putSource(String jdbcUrl, DruidDataSource ds) { - sourcesMap.put(jdbcUrl, ds); + public void putSource(String cacheKey, DruidDataSource ds) { + sourcesMap.put(cacheKey, ds); } public Map getSourcesMap() { return sourcesMap; } + + public String createCacheKey(String jdbcUrl, String jdbcUser, String jdbcPassword, String jdbcDriverUrl, + String jdbcDriverClass) { + return jdbcUrl + jdbcUser + jdbcPassword + jdbcDriverUrl + jdbcDriverClass; + } } diff --git a/fe/be-java-extensions/jdbc-scanner/src/main/java/org/apache/doris/jdbc/JdbcExecutor.java b/fe/be-java-extensions/jdbc-scanner/src/main/java/org/apache/doris/jdbc/JdbcExecutor.java index 8864afa4938edb..9f98740aa61b3d 100644 --- a/fe/be-java-extensions/jdbc-scanner/src/main/java/org/apache/doris/jdbc/JdbcExecutor.java +++ b/fe/be-java-extensions/jdbc-scanner/src/main/java/org/apache/doris/jdbc/JdbcExecutor.java @@ -281,6 +281,8 @@ public boolean hasNext() throws UdfRuntimeException { private void init(String driverUrl, String sql, int batchSize, String driverClass, String jdbcUrl, String jdbcUser, String jdbcPassword, TJdbcOperation op, TOdbcTableType tableType) throws UdfRuntimeException { + String druidDataSourceKey = JdbcDataSource.getDataSource().createCacheKey(jdbcUrl, jdbcUser, jdbcPassword, + driverUrl, driverClass); try { if (isNebula()) { batchSizeNum = batchSize; @@ -290,10 +292,10 @@ private void init(String driverUrl, String sql, int batchSize, String driverClas } else { ClassLoader parent = getClass().getClassLoader(); ClassLoader classLoader = UdfUtils.getClassLoader(driverUrl, parent); - druidDataSource = JdbcDataSource.getDataSource().getSource(jdbcUrl + jdbcUser + jdbcPassword); + druidDataSource = JdbcDataSource.getDataSource().getSource(druidDataSourceKey); if (druidDataSource == null) { synchronized (druidDataSourceLock) { - druidDataSource = JdbcDataSource.getDataSource().getSource(jdbcUrl + jdbcUser + jdbcPassword); + druidDataSource = JdbcDataSource.getDataSource().getSource(druidDataSourceKey); if (druidDataSource == null) { long start = System.currentTimeMillis(); DruidDataSource ds = new DruidDataSource(); @@ -312,11 +314,9 @@ private void init(String driverUrl, String sql, int batchSize, String driverClas ds.setTimeBetweenEvictionRunsMillis(maxIdleTime / 5); ds.setMinEvictableIdleTimeMillis(maxIdleTime); druidDataSource = ds; - // here is a cache of datasource, which using the string(jdbcUrl + jdbcUser + - // jdbcPassword) as key. // and the default datasource init = 1, min = 1, max = 100, if one of connection idle // time greater than 10 minutes. then connection will be retrieved. - JdbcDataSource.getDataSource().putSource(jdbcUrl + jdbcUser + jdbcPassword, ds); + JdbcDataSource.getDataSource().putSource(druidDataSourceKey, ds); LOG.info("init datasource [" + (jdbcUrl + jdbcUser) + "] cost: " + ( System.currentTimeMillis() - start) + " ms"); }