一、环境
- jdk 1.8
- springboot 1.56
二、连接池使用的配置类
配置在yaml中的内容将转换为该类型,类中的默认值即为连接池的默认配置。
三、Tomcat JDBC 连接池属性及默认值
四、ymal配置tomcat数据库连接池示例
创建连接开销比较大,尤其是频繁创建和销毁连接对象时会带来性能损耗,使用连接池的可以有效利用资源避免开销,提升查询性能。
连接池参数设置尤为重要,其中maxActive为设置时需要考虑集群实例数去分配,一般数据库支持的连接数最大1500左右(也需要开看服务器的配置)。
由于网络不稳或者db服务器重启,导致的连接断开的情况,可以设置testOnReturn、testWhileIdle参数在连接出入池时进行有效性校验,无效连接将从池子中清理。
spring:
datasource:
url: jdbc:postgresql://localhost:12306/mydb?currentSchema=myschema
username: pguser
password: ******
#默认连接池
initialSize: 1 #池启动时打开的连接数
maxActive: 20 #打开的最大连接数
maxIdle: 5 #最大空闲连接数
minIdle: 5 #打开连接的最小数量
maxWait: 60000 #获取连接时抛出SQLException之前等待的时间(以毫秒为单位)
testOnBorrow: false #如池中借出对象之前验证,如果对象验证失败,将其从池中清除,再接着去借下一个。
testOnReturn: true #连接返回池之前进行验证,则为True
testWhileIdle: true #连接空闲时进行验证,如果验证失败则将其从池中清除。
timeBetweenEvictionRunsMillis: 60000 #间隔检测毫秒数
minEvictableIdleTimeMillis: 300000 #连接最小生存毫秒数
validationQueryTimeout: 30 #验证查询超时秒数
validationQuery: select 1 AS count #检测连接是否有效的SQL
五、验证配置的参数是否生效
配置完连接池完全是黑盒,配置的参数是否生效?连接池当前的状态怎样?我们怎么监控?
通过下面的方法可以获取到连接池的状态和参数,逻辑是通过注入的方式获得到SqlSessionFactory对象,
在org.apache.tomcat.jdbc.pool.DataSource对象中获取连接池的实时状态。
@Autowired
private List<SqlSessionFactory> sqlSessionFactories;
public List<Map<String,Object>> tomcatConnectionPoolMonitor() {
List<Map<String,Object>> rst = new ArrayList<>();
sqlSessionFactories.forEach(factory->{
Map<String,Object> m = new HashMap<>();
Configuration config = factory.getConfiguration();
DataSource dataSource = config.getEnvironment().getDataSource();
if(dataSource instanceof org.apache.tomcat.jdbc.pool.DataSource){
org.apache.tomcat.jdbc.pool.DataSource poolDs
= (org.apache.tomcat.jdbc.pool.DataSource)dataSource;
ConnectionPool pool = poolDs.getPool();
PoolConfiguration pConf = poolDs.getPoolProperties();
Properties db = pConf.getDbProperties();
String srt = ToStringBuilder.reflectionToString(pConf);
//数据源
m.put("dataSource.type",poolDs.getClass().getName());
//连接池状态
m.put("pool.name",pool.getName());
m.put("pool.hashCode",pool.hashCode());
m.put("pool.ver",pool.getPoolVersion());
m.put("pool.size",pool.getSize());
m.put("pool.active",pool.getActive());
m.put("pool.idle",pool.getIdle());
m.put("pool.createdCount",pool.getCreatedCount());
m.put("pool.releasedCount",pool.getReleasedCount());
m.put("pool.returnedCount",pool.getReturnedCount());
m.put("pool.reconnectedCount",pool.getReconnectedCount());
m.put("pool.removeAbandonedCount",pool.getRemoveAbandonedCount());
m.put("pool.releasedIdleCount",pool.getReleasedIdleCount());
//连接池属性
m.put("conf.hashCode",pConf.hashCode());
m.put("conf.name",pConf.getName());
m.put("conf.user",pConf.getUsername());
m.put("conf.url",pConf.getUrl());
m.put("conf.initialSize",pConf.getInitialSize()); //池启动时打开的连接数
m.put("conf.maxActive",pConf.getMaxActive()); //打开的最大连接数
m.put("conf.maxIdle",pConf.getMaxIdle()); //最大空闲连接数
m.put("conf.minIdle",pConf.getMinIdle()); //打开连接的最小数量
m.put("conf.maxWait",pConf.getMaxWait()); //获取连接时抛出SQLException之前等待的时间(以毫秒为单位)
m.put("conf.testOnBorrow",pConf.isTestOnBorrow()); //获取连接之前验证,如果对象验证失败,则从池中清除
m.put("conf.testOnReturn",pConf.isTestOnReturn()); //连接返回池之前进行验证,则为True
m.put("conf.testWhileIdle",pConf.isTestWhileIdle()); //连接空闲时进行验证,如果验证失败则将其从池中清除。
m.put("conf.timeBetweenEvictionRunsMillis",pConf.getTimeBetweenEvictionRunsMillis());//间隔毫秒
m.put("conf.minEvictableIdleTimeMillis",pConf.getMinEvictableIdleTimeMillis());//最小空闲时间ms
m.put("conf.validationQueryTimeout",pConf.getValidationQueryTimeout());//超时时间(ms)
m.put("conf.validationQuery",pConf.getValidationQuery()); //检测连接是否有效的SQL
}else{
m.put("dataSource.type",dataSource.getClass().getName());
}
rst.add(m);
});
return rst;
}
六、返回的验证结果
[
{
"conf.hashCode": -107389976,
"conf.initialSize": 1,
"conf.maxActive": 20,
"conf.maxIdle": 5
"conf.maxWait": 60000,
"conf.minEvictableIdleTimeMillis": 300000,
"conf.minIdle": 5,
"conf.name": "Tomcat Connection Pool[1--586968016]",
"conf.testOnBorrow": false,
"conf.testOnReturn": true,
"conf.testWhileIdle": true,
"conf.timeBetweenEvictionRunsMillis": 60000,
"conf.url": "jdbc:postgresql://localhost:12306/mydb?currentSchema=myschema",
"conf.user": "pguser",
"conf.validationQuery": "select 1 AS count",
"conf.validationQueryTimeout": 30,
"dataSource.type": "org.apache.tomcat.jdbc.pool.DataSource",
"pool.active": 0,
"pool.createdCount": 1,
"pool.hashCode": 885141032,
"pool.idle": 1,
"pool.name": "Tomcat Connection Pool[1--586968016]",
"pool.reconnectedCount": 0,
"pool.releasedCount": 0,
"pool.releasedIdleCount": 0,
"pool.removeAbandonedCount": 0,
"pool.returnedCount": 13,
"pool.size": 1,
"pool.ver": -9223372036854775808,
}
]
总结
springboot 1.5x 默认使用 tomcat 连接池,配置后是否生效可以通过 org.apache.tomcat.jdbc.pool.DataSource 对象监控。
原文地址:https://blog.csdn.net/xxj_jing/article/details/134739204
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_43916.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。