entry : poolSetting.entrySet()) {
- keyStr = StrUtil.addPrefixIfNot(entry.getKey(), "druid.");
- druidProps.put(keyStr, entry.getValue());
+ // remarks等特殊配置,since 5.3.8
+ String connValue;
+ for (String key : KEY_CONN_PROPS) {
+ connValue = poolSetting.getAndRemoveStr(key);
+ if(StrUtil.isNotBlank(connValue)){
+ ds.addConnectionProperty(key, connValue);
+ }
}
- // 连接池信息
+
+ // Druid连接池配置信息,规范化属性名
+ final Props druidProps = new Props();
+ poolSetting.forEach((key, value)-> druidProps.put(StrUtil.addPrefixIfNot(key, "druid."), value));
ds.configFromPropety(druidProps);
// 检查关联配置,在用户未设置某项配置时,
diff --git a/hutool-db/src/main/java/cn/hutool/db/ds/hikari/HikariDSFactory.java b/hutool-db/src/main/java/cn/hutool/db/ds/hikari/HikariDSFactory.java
index 5d89c8b06..a1a046158 100644
--- a/hutool-db/src/main/java/cn/hutool/db/ds/hikari/HikariDSFactory.java
+++ b/hutool-db/src/main/java/cn/hutool/db/ds/hikari/HikariDSFactory.java
@@ -1,13 +1,14 @@
package cn.hutool.db.ds.hikari;
-import javax.sql.DataSource;
-
-import com.zaxxer.hikari.HikariConfig;
-import com.zaxxer.hikari.HikariDataSource;
-
+import cn.hutool.core.lang.Console;
+import cn.hutool.core.util.StrUtil;
import cn.hutool.db.ds.AbstractDSFactory;
import cn.hutool.setting.Setting;
import cn.hutool.setting.dialect.Props;
+import com.zaxxer.hikari.HikariConfig;
+import com.zaxxer.hikari.HikariDataSource;
+
+import javax.sql.DataSource;
/**
* HikariCP数据源工厂类
@@ -30,6 +31,16 @@ public class HikariDSFactory extends AbstractDSFactory {
@Override
protected DataSource createDataSource(String jdbcUrl, String driver, String user, String pass, Setting poolSetting) {
+ // remarks等特殊配置,since 5.3.8
+ final Props connProps = new Props();
+ String connValue;
+ for (String key : KEY_CONN_PROPS) {
+ connValue = poolSetting.getAndRemoveStr(key);
+ if(StrUtil.isNotBlank(connValue)){
+ connProps.setProperty(key, connValue);
+ }
+ }
+
final Props config = new Props();
config.putAll(poolSetting);
@@ -44,6 +55,9 @@ public class HikariDSFactory extends AbstractDSFactory {
config.put("password", pass);
}
- return new HikariDataSource(new HikariConfig(config));
+ final HikariConfig hikariConfig = new HikariConfig(config);
+ hikariConfig.setDataSourceProperties(connProps);
+
+ return new HikariDataSource(hikariConfig);
}
}
diff --git a/hutool-db/src/main/java/cn/hutool/db/ds/pooled/DbConfig.java b/hutool-db/src/main/java/cn/hutool/db/ds/pooled/DbConfig.java
index cf68510bd..064ea44e4 100644
--- a/hutool-db/src/main/java/cn/hutool/db/ds/pooled/DbConfig.java
+++ b/hutool-db/src/main/java/cn/hutool/db/ds/pooled/DbConfig.java
@@ -3,32 +3,38 @@ package cn.hutool.db.ds.pooled;
import cn.hutool.db.DbRuntimeException;
import cn.hutool.db.dialect.DriverUtil;
+import java.util.Properties;
+
/**
* 数据库配置
- * @author Looly
*
+ * @author Looly
*/
public class DbConfig {
-
+
//-------------------------------------------------------------------- Fields start
- private String driver; //数据库驱动
- private String url; //jdbc url
- private String user; //用户名
- private String pass; //密码
-
- private int initialSize; //初始连接数
- private int minIdle; //最小闲置连接数
- private int maxActive; //最大活跃连接数
- private long maxWait; //获取连接的超时等待
+ private String driver; //数据库驱动
+ private String url; //jdbc url
+ private String user; //用户名
+ private String pass; //密码
+
+ private int initialSize; //初始连接数
+ private int minIdle; //最小闲置连接数
+ private int maxActive; //最大活跃连接数
+ private long maxWait; //获取连接的超时等待
+
+ // 连接配置
+ private Properties connProps;
//-------------------------------------------------------------------- Fields end
-
+
//-------------------------------------------------------------------- Constructor start
public DbConfig() {
}
-
+
/**
* 构造
- * @param url jdbc url
+ *
+ * @param url jdbc url
* @param user 用户名
* @param pass 密码
*/
@@ -36,10 +42,11 @@ public class DbConfig {
init(url, user, pass);
}
//-------------------------------------------------------------------- Constructor end
-
+
/**
* 初始化
- * @param url jdbc url
+ *
+ * @param url jdbc url
* @param user 用户名
* @param pass 密码
*/
@@ -54,56 +61,85 @@ public class DbConfig {
throw new DbRuntimeException(e, "Get jdbc driver from [{}] error!", url);
}
}
-
+
//-------------------------------------------------------------------- Getters and Setters start
public String getDriver() {
return driver;
}
+
public void setDriver(String driver) {
this.driver = driver;
}
+
public String getUrl() {
return url;
}
+
public void setUrl(String url) {
this.url = url;
}
+
public String getUser() {
return user;
}
+
public void setUser(String user) {
this.user = user;
}
+
public String getPass() {
return pass;
}
+
public void setPass(String pass) {
this.pass = pass;
}
-
+
public int getInitialSize() {
return initialSize;
}
+
public void setInitialSize(int initialSize) {
this.initialSize = initialSize;
}
+
public int getMinIdle() {
return minIdle;
}
+
public void setMinIdle(int minIdle) {
this.minIdle = minIdle;
}
+
public int getMaxActive() {
return maxActive;
}
+
public void setMaxActive(int maxActive) {
this.maxActive = maxActive;
}
+
public long getMaxWait() {
return maxWait;
}
+
public void setMaxWait(long maxWait) {
this.maxWait = maxWait;
}
+
+ public Properties getConnProps() {
+ return connProps;
+ }
+
+ public void setConnProps(Properties connProps) {
+ this.connProps = connProps;
+ }
+
+ public void addConnProps(String key, String value){
+ if(null == this.connProps){
+ this.connProps = new Properties();
+ }
+ this.connProps.setProperty(key, value);
+ }
//-------------------------------------------------------------------- Getters and Setters end
}
\ No newline at end of file
diff --git a/hutool-db/src/main/java/cn/hutool/db/ds/pooled/DbSetting.java b/hutool-db/src/main/java/cn/hutool/db/ds/pooled/DbSetting.java
index 698bee06e..4fcd66497 100644
--- a/hutool-db/src/main/java/cn/hutool/db/ds/pooled/DbSetting.java
+++ b/hutool-db/src/main/java/cn/hutool/db/ds/pooled/DbSetting.java
@@ -71,6 +71,15 @@ public class DbSetting {
dbConfig.setMaxActive(setting.getInt("maxActive", group, 8));
dbConfig.setMaxWait(setting.getLong("maxWait", group, 6000L));
+ // remarks等特殊配置,since 5.3.8
+ String connValue;
+ for (String key : DSFactory.KEY_CONN_PROPS) {
+ connValue = config.get(key);
+ if(StrUtil.isNotBlank(connValue)){
+ dbConfig.addConnProps(key, connValue);
+ }
+ }
+
return dbConfig;
}
}
diff --git a/hutool-db/src/main/java/cn/hutool/db/ds/pooled/PooledConnection.java b/hutool-db/src/main/java/cn/hutool/db/ds/pooled/PooledConnection.java
index 2c72b6905..f943f9964 100644
--- a/hutool-db/src/main/java/cn/hutool/db/ds/pooled/PooledConnection.java
+++ b/hutool-db/src/main/java/cn/hutool/db/ds/pooled/PooledConnection.java
@@ -1,10 +1,13 @@
package cn.hutool.db.ds.pooled;
+import cn.hutool.core.map.MapUtil;
import cn.hutool.db.DbUtil;
+import cn.hutool.setting.dialect.Props;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
+import java.util.Properties;
/**
* 池化
@@ -15,11 +18,34 @@ public class PooledConnection extends ConnectionWraper{
private final PooledDataSource ds;
private boolean isClosed;
-
+
+ /**
+ * 构造
+ *
+ * @param ds 数据源
+ * @throws SQLException SQL异常
+ */
public PooledConnection(PooledDataSource ds) throws SQLException {
this.ds = ds;
- DbConfig config = ds.getConfig();
- this.raw = DriverManager.getConnection(config.getUrl(), config.getUser(), config.getPass());
+ final DbConfig config = ds.getConfig();
+
+ final Props info = new Props();
+ final String user = config.getUser();
+ if (user != null) {
+ info.setProperty("user", user);
+ }
+ final String password = config.getPass();
+ if (password != null) {
+ info.setProperty("password", password);
+ }
+
+ // 其它参数
+ final Properties connProps = config.getConnProps();
+ if(MapUtil.isNotEmpty(connProps)){
+ info.putAll(connProps);
+ }
+
+ this.raw = DriverManager.getConnection(config.getUrl(), info);
}
public PooledConnection(PooledDataSource ds, Connection conn) {
@@ -31,7 +57,7 @@ public class PooledConnection extends ConnectionWraper{
* 重写关闭连接,实际操作是归还到连接池中
*/
@Override
- public void close() throws SQLException {
+ public void close() {
this.ds.free(this);
this.isClosed = true;
}
diff --git a/hutool-db/src/main/java/cn/hutool/db/ds/pooled/PooledDSFactory.java b/hutool-db/src/main/java/cn/hutool/db/ds/pooled/PooledDSFactory.java
index db3c378b2..897b523ee 100644
--- a/hutool-db/src/main/java/cn/hutool/db/ds/pooled/PooledDSFactory.java
+++ b/hutool-db/src/main/java/cn/hutool/db/ds/pooled/PooledDSFactory.java
@@ -1,10 +1,11 @@
package cn.hutool.db.ds.pooled;
-import javax.sql.DataSource;
-
+import cn.hutool.core.util.StrUtil;
import cn.hutool.db.ds.AbstractDSFactory;
import cn.hutool.setting.Setting;
+import javax.sql.DataSource;
+
/**
* Hutool自身实现的池化数据源工厂类
*
@@ -38,6 +39,15 @@ public class PooledDSFactory extends AbstractDSFactory {
dbConfig.setMaxActive(poolSetting.getInt("maxActive", 8));
dbConfig.setMaxWait(poolSetting.getLong("maxWait", 6000L));
+ // remarks等特殊配置,since 5.3.8
+ String connValue;
+ for (String key : KEY_CONN_PROPS) {
+ connValue = poolSetting.get(key);
+ if(StrUtil.isNotBlank(connValue)){
+ dbConfig.addConnProps(key, connValue);
+ }
+ }
+
return new PooledDataSource(dbConfig);
}
}
diff --git a/hutool-db/src/main/java/cn/hutool/db/ds/simple/SimpleDSFactory.java b/hutool-db/src/main/java/cn/hutool/db/ds/simple/SimpleDSFactory.java
index d841e2d1a..e5937c4ae 100644
--- a/hutool-db/src/main/java/cn/hutool/db/ds/simple/SimpleDSFactory.java
+++ b/hutool-db/src/main/java/cn/hutool/db/ds/simple/SimpleDSFactory.java
@@ -1,10 +1,10 @@
package cn.hutool.db.ds.simple;
-import javax.sql.DataSource;
-
import cn.hutool.db.ds.AbstractDSFactory;
import cn.hutool.setting.Setting;
+import javax.sql.DataSource;
+
/**
* 简单数据源工厂类
*
@@ -26,12 +26,13 @@ public class SimpleDSFactory extends AbstractDSFactory {
@Override
protected DataSource createDataSource(String jdbcUrl, String driver, String user, String pass, Setting poolSetting) {
- return new SimpleDataSource(//
+ SimpleDataSource ds = new SimpleDataSource(//
jdbcUrl, //
user, //
pass, //
driver//
);
+ ds.setConnProps(poolSetting.getProps(Setting.DEFAULT_GROUP));
+ return ds;
}
-
}
diff --git a/hutool-db/src/main/java/cn/hutool/db/ds/simple/SimpleDataSource.java b/hutool-db/src/main/java/cn/hutool/db/ds/simple/SimpleDataSource.java
index 4e6dcdac8..859710987 100644
--- a/hutool-db/src/main/java/cn/hutool/db/ds/simple/SimpleDataSource.java
+++ b/hutool-db/src/main/java/cn/hutool/db/ds/simple/SimpleDataSource.java
@@ -1,16 +1,18 @@
package cn.hutool.db.ds.simple;
-import java.io.IOException;
-import java.sql.Connection;
-import java.sql.DriverManager;
-import java.sql.SQLException;
-
import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.db.DbRuntimeException;
import cn.hutool.db.dialect.DriverUtil;
import cn.hutool.db.ds.DSFactory;
import cn.hutool.setting.Setting;
+import cn.hutool.setting.dialect.Props;
+
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.SQLException;
+import java.util.Properties;
/***
* 简易数据源,没有使用连接池,仅供测试或打开关闭连接非常少的场合使用!
@@ -28,6 +30,9 @@ public class SimpleDataSource extends AbstractDataSource {
private String url; // jdbc url
private String user; // 用户名
private String pass; // 密码
+
+ // 连接配置
+ private Properties connProps;
// -------------------------------------------------------------------- Fields end
/**
@@ -87,6 +92,9 @@ public class SimpleDataSource extends AbstractDataSource {
config.getAndRemoveStr(DSFactory.KEY_ALIAS_PASSWORD), //
config.getAndRemoveStr(DSFactory.KEY_ALIAS_DRIVER)//
);
+
+ // 其它连接参数
+ this.connProps = config.getProps(Setting.DEFAULT_GROUP);
}
/**
@@ -178,11 +186,40 @@ public class SimpleDataSource extends AbstractDataSource {
public void setPass(String pass) {
this.pass = pass;
}
+
+ public Properties getConnProps() {
+ return connProps;
+ }
+
+ public void setConnProps(Properties connProps) {
+ this.connProps = connProps;
+ }
+
+ public void addConnProps(String key, String value){
+ if(null == this.connProps){
+ this.connProps = new Properties();
+ }
+ this.connProps.setProperty(key, value);
+ }
// -------------------------------------------------------------------- Getters and Setters end
@Override
public Connection getConnection() throws SQLException {
- return DriverManager.getConnection(this.url, this.user, this.pass);
+ final Props info = new Props();
+ if (this.user != null) {
+ info.setProperty("user", this.user);
+ }
+ if (this.pass != null) {
+ info.setProperty("password", this.pass);
+ }
+
+ // 其它参数
+ final Properties connProps = this.connProps;
+ if(MapUtil.isNotEmpty(connProps)){
+ info.putAll(connProps);
+ }
+
+ return DriverManager.getConnection(this.url, info);
}
@Override
@@ -191,7 +228,7 @@ public class SimpleDataSource extends AbstractDataSource {
}
@Override
- public void close() throws IOException {
+ public void close() {
// Not need to close;
}
}
diff --git a/hutool-db/src/main/java/cn/hutool/db/ds/tomcat/TomcatDSFactory.java b/hutool-db/src/main/java/cn/hutool/db/ds/tomcat/TomcatDSFactory.java
index 139874cb2..a0bf9310c 100644
--- a/hutool-db/src/main/java/cn/hutool/db/ds/tomcat/TomcatDSFactory.java
+++ b/hutool-db/src/main/java/cn/hutool/db/ds/tomcat/TomcatDSFactory.java
@@ -1,10 +1,11 @@
package cn.hutool.db.ds.tomcat;
-import org.apache.tomcat.jdbc.pool.DataSource;
-import org.apache.tomcat.jdbc.pool.PoolProperties;
-
+import cn.hutool.core.util.StrUtil;
import cn.hutool.db.ds.AbstractDSFactory;
import cn.hutool.setting.Setting;
+import cn.hutool.setting.dialect.Props;
+import org.apache.tomcat.jdbc.pool.DataSource;
+import org.apache.tomcat.jdbc.pool.PoolProperties;
/**
* Tomcat-Jdbc-Pool数据源工厂类
@@ -40,6 +41,20 @@ public class TomcatDSFactory extends AbstractDSFactory {
poolProps.setDriverClassName(driver);
poolProps.setUsername(user);
poolProps.setPassword(pass);
+
+ // remarks等特殊配置,since 5.3.8
+ final Props connProps = new Props();
+ String connValue;
+ for (String key : KEY_CONN_PROPS) {
+ connValue = poolSetting.getAndRemoveStr(key);
+ if(StrUtil.isNotBlank(connValue)){
+ connProps.setProperty(key, connValue);
+ }
+ }
+ poolProps.setDbProperties(connProps);
+
+ // 连接池相关参数
+ poolSetting.toBean(poolProps);
return new DataSource(poolProps);
}
diff --git a/hutool-db/src/main/java/cn/hutool/db/meta/MetaUtil.java b/hutool-db/src/main/java/cn/hutool/db/meta/MetaUtil.java
index f8e917ab9..414caac5d 100644
--- a/hutool-db/src/main/java/cn/hutool/db/meta/MetaUtil.java
+++ b/hutool-db/src/main/java/cn/hutool/db/meta/MetaUtil.java
@@ -18,6 +18,13 @@ import java.util.List;
/**
* 数据库元数据信息工具类
*
+ *
+ * 需要注意的是,此工具类在某些数据库(比如Oracle)下无效,此时需要手动在数据库配置中增加:
+ *
+ * remarks = true
+ * useInformationSchema = true
+ *
+ *
* @author looly
*/
public class MetaUtil {
diff --git a/hutool-db/src/test/resources/config/db.setting b/hutool-db/src/test/resources/config/db.setting
index b3ef7cc0f..61ee9fc91 100644
--- a/hutool-db/src/test/resources/config/db.setting
+++ b/hutool-db/src/test/resources/config/db.setting
@@ -18,45 +18,54 @@ sqlLevel = debug
# 默认数据源
url = jdbc:sqlite:test.db
+remarks = true
# 测试数据源
[test]
url = jdbc:sqlite:test.db
+remarks = true
# 测试用HSQLDB数据库
[hsqldb]
url = jdbc:hsqldb:mem:mem_hutool
user = SA
pass =
+remarks = true
# 测试用HSQLDB数据库
[h2]
url = jdbc:h2:mem:h2_hutool
user = sa
pass =
+remarks = true
# 测试用HSQLDB数据库
[derby]
url = jdbc:derby:.derby/test_db;create=true
+remarks = true
# 测试用Oracle数据库
[orcl]
url = jdbc:oracle:thin:@//looly.centos:1521/XE
user = looly
pass = 123456
+remarks = true
[mysql]
url = jdbc:mysql://looly.centos8:3306/hutool_test?useSSL=false
user = root
pass = 123456
+remarks = true
[postgre]
url = jdbc:postgresql://looly.centos:5432/test_hutool
user = postgres
pass = 123456
+remarks = true
[sqlserver]
url = jdbc:sqlserver://looly.database.chinacloudapi.cn:1433;database=test;encrypt=true;trustServerCertificate=false;hostNameInCertificate=*.database.chinacloudapi.cn;loginTimeout=30;
user = looly@looly
-pass = 123
\ No newline at end of file
+pass = 123
+remarks = true
\ No newline at end of file