Springboot_Tomcat数据库连接池配置

Springboot_Tomcat数据库连接池配置

    • 一、环境
    • 二、连接池使用的配置类
    • 三、Tomcat JDBC 连接池属性及默认值
    • 四、ymal配置tomcat数据库连接池示例
    • 五、验证配置的参数是否生效
    • 六、返回的验证结果
  • 总结

一、环境

  • jdk 1.8
  • springboot 1.56

二、连接池使用的配置类

  • 包名:tomcat-jdbc-8.5.16.jar
  • 类名:org.apache.tomcat.jdbc.pool.PoolProperties

配置在yaml中的内容将转换为该类型,类中的默认值即为连接池的默认配置。

三、Tomcat JDBC 连接池属性及默认值

属性描述默认值
defaultAutoCommit连接池中创建的连接默认是否自动提交事务驱动的缺省值
defaultReadOnly连接池中创建的连接默认是否为只读状态-
defaultCatalog连接池中创建的连接默认的 catalog-
driverClassName驱动类的名称-
username数据库账户-
password数据库密码-
maxActive连接池同一时间可分配的最大活跃连接数100
maxIdle始终保留在池中的最大连接数,如果启用,将定期检查限制连接,超出此属性设定的值且空闲时间超过minEvictableIdleTimeMillis的连接则释放与maxActive设定的值相同
minIdle始终保留在池中的最小连接数,池中的连接数量若低于此值则创建新的连接,如果连接验证失败将缩小至此值与initialSize设定的值相同
initialSize连接池启动时创建的初始连接数量10
maxWait最大等待时间(毫秒),如果在没有连接可用的情况下等待超过此时间,则抛出异常30000(30秒)
testOnBorrow当从连接池中取出一个连接时是否进行验证,若验证失败则从池中删除该连接并尝试取出另一个连接false
testOnConnect当一个连接首次被创建时是否进行验证,若验证失败则抛出 SQLException 异常false
testOnReturn当一个连接使用完归还到连接池时是否进行验证false
testWhileIdle对池中空闲的连接是否进行验证,验证失败则回收此连接false
validationQuery在连接池返回连接给调用者前用来对连接进行验证的查询 SQLnull
validationQueryTimeoutSQL 查询验证超时时间(秒),小于或等于 0 的数值表示禁用-1
timeBetweenEvictionRunsMillis在空闲连接回收器线程运行期间休眠时间(毫秒), 该值不应该小于 1 秒,它决定线程多久验证空闲连接或丢弃连接的频率5000(5秒)
minEvictableIdleTimeMillis连接在池中保持空闲而不被回收的最小时间(毫秒)60000(60秒)
removeAbandoned标记是否删除泄露的连接,如果连接超出removeAbandonedTimeout的限制,且该属性设置为 true,则连接被认为是被泄露并且可以被删除false
removeAbandonedTimeout泄露的连接可以被删除的超时时间(秒),该值应设置为应用程序查询可能执行的最长时间60

四、ymal配置tomcat数据库连接池示例

创建连接开销比较大,尤其是频繁创建和销毁连接对象时会带来性能损耗,使用连接池的可以有效利用资源避免开销,提升查询性能。
连接池参数设置尤为重要,其中maxActive为设置时需要考虑集群实例数去分配,一般数据库支持的连接数最大1500左右(也需要开看服务器的配置)。
由于网络不稳或者db服务器重启,导致的连接断开的情况,可以设置testOnReturn、testWhileIdle参数在连接出入池时进行有效性校验,无效连接将从池子中清理。

spring:datasource:url: jdbc:postgresql://localhost:12306/mydb?currentSchema=myschemausername: pguserpassword: ******#默认连接池initialSize: 1  #池启动时打开的连接数maxActive: 20    #打开的最大连接数maxIdle: 5      #最大空闲连接数minIdle: 5      #打开连接的最小数量maxWait: 60000  #获取连接时抛出SQLException之前等待的时间(以毫秒为单位)testOnBorrow: false   #如池中借出对象之前验证,如果对象验证失败,将其从池中清除,再接着去借下一个。testOnReturn: true    #连接返回池之前进行验证,则为TruetestWhileIdle: true   #连接空闲时进行验证,如果验证失败则将其从池中清除。timeBetweenEvictionRunsMillis: 60000  #间隔检测毫秒数minEvictableIdleTimeMillis: 300000  #连接最小生存毫秒数validationQueryTimeout: 30    #验证查询超时秒数validationQuery: select 1 AS count    #检测连接是否有效的SQL

五、验证配置的参数是否生效

配置完连接池完全是黑盒,配置的参数是否生效?连接池当前的状态怎样?我们怎么监控?
通过下面的方法可以获取到连接池的状态和参数,逻辑是通过注入的方式获得到SqlSessionFactory对象,
在org.apache.tomcat.jdbc.pool.DataSource对象中获取连接池的实时状态。

    @Autowiredprivate 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());   //连接返回池之前进行验证,则为Truem.put("conf.testWhileIdle",pConf.isTestWhileIdle()); //连接空闲时进行验证,如果验证失败则将其从池中清除。m.put("conf.timeBetweenEvictionRunsMillis",pConf.getTimeBetweenEvictionRunsMillis());//间隔毫秒m.put("conf.minEvictableIdleTimeMillis",pConf.getMinEvictableIdleTimeMillis());//最小空闲时间msm.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 对象监控。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/188649.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

代码随想录算法训练营第五十一天 | 309.最佳买卖股票时机含冷冻期,714.买卖股票的最佳时机含手续费,股票总结

目录 309.最佳买卖股票时机含冷冻期 714.买卖股票的最佳时机含手续费 股票问题总结 309.最佳买卖股票时机含冷冻期 题目链接&#xff1a;309. 买卖股票的最佳时机含冷冻期 分为四种状态&#xff1a; 0. 持有股票 1. 不持有股票——卖出状态 2. 不持有股票——今天卖出 3. 今天为…

第16届中国R会议暨2023X-AGI大会开幕,和鲸科技分享ModelOps在数据科学平台中的实践与应用

11月25日&#xff0c;第 16 届中国 R 会议暨 2023 X-AGI 大会在在中国人民大学逸夫会堂拉开帷幕&#xff0c;本次会议由中国人民大学统计学院、中国人民大学应用统计科学研究中心、统计之都、原灵科技和中国商业统计学会人工智能分会&#xff08;筹&#xff09;主办&#xff0c…

React项目使用NProgress作为加载进度条

React项目使用NProgress作为加载进度条 0、效果1、react安装依赖2、使用3.进度条颜色设置 文档参考&#xff1a;https://zhuanlan.zhihu.com/p/616245086?utm_id0 0、效果 如下&#xff0c;可全局在页面顶部有一条进度条 1、react安装依赖 yarn add nprogress通过以上安装…

pytest自动化框架之allure测试报告的用例描述设置

allure测试报告的用例描述相关方法&#xff1b;如下图 allure标记用例级别severity 在做自动化测试的过程中&#xff0c;测试用例越来越多的时候&#xff0c;如果执行一轮测试发现了几个测试不通过&#xff0c;我们也希望能快速统计出缺陷的等级。 pytest结合allure框架可以对…

YOLOv5项目实战(5)— 算法模型优化和服务器部署

前言:Hello大家好,我是小哥谈。近期,作者所负责项目中的算法模型检测存在很多误报情况,为了减少这种误报情况,作者一直在不断优化算法模型。鉴于此,本节课就给大家详细介绍一下实际工作场景中如何去优化算法模型和进行部署,另外为了方便大家进行模型训练,作者在文章中提…

oracle FUNCTION(任意两个时间 之间的工作小时)

写函数计算 任意两个时间 之间的工作小时 每天工作时间&#xff08;8:00 - 20:00 共12小时&#xff09;&#xff0c;没有休息日 CREATE OR REPLACE FUNCTION SC_YD_DESI.CALCULATE_WORK_HOURS_FUNC (p_current_time IN DATE,p_order_time IN DATE ) RETURN NUMBER ASp_work_hou…

AWS Remote Control ( Wi-Fi ) on i.MX RT1060 EVK - 1 “建立开发环境”

这个系列的文章将叙述如何借由 NXP 的“evkmimxrt1060_aws_remote_control_wifi_nxp”这支 Sample Code&#xff0c;达到 NXP RT1060EVK 经由 U-Blox EVK-JODY-W263 将资讯传到 AWS 上&#xff0c;并可借由手机对 RT1060 EVK 的 LED 进行远端控制。 整体架构如下图所示&#x…

道可云会展元宇宙平台全新升级,打造3D沉浸式展会新模式

随着VR虚拟现实、人工智能、虚拟数字人等元宇宙技术的快速发展&#xff0c;各个行业正试图通过元宇宙技术寻求新的发展突破口&#xff0c;会展行业也不例外。会展作为经贸领域的重要产业形态&#xff0c;越来越多的企业和组织开始寻求通过元宇宙技术为展会赋能&#xff0c;以满…

【EI会议征稿】第七届大数据与应用统计国际学术研讨会(ISBDAS 2024)

第七届大数据与应用统计国际学术研讨会&#xff08;ISBDAS 2024&#xff09; 2024 7th International Symposium on Big Data and Applied Statistics 第七届大数据与应用统计国际学术研讨会&#xff08;ISBDAS 2024&#xff09;定于2024年3月8-10日在中国上海举行。会议旨在…

最小化安装 Neokylin7.0 用于搭建 Hadoop 集群

文章目录 环境搭建背景虚拟机创建和环境配置安装过程注意事项虚拟机设置软件选择KOUMP系统分区网络和主机名打开以太网&#xff0c;并记录信息配置 IPv4修改主机名 创建用户 hadoop完全分布式搭建-CSDN博客 环境搭建背景 为什么不从hadoop100或者hadoop101开始&#xff0c;而是…

STM32CubeMx+MATLAB Simulink点灯程序

STM32CubeMxMATLAB点灯程序 ✨要想实现在MATLAB Simulink环境下使用STM32&#xff0c;前提是已经搭建好MATLAB环境并且安装了必要的Simulink插件&#xff0c;以及对应的STM32支持包。 &#x1f33f;需要准备一块所安装支持包支持的STM32开发板. &#x1f516;具体支持包详情页…

社区医院儿童疫苗接种管理系统设计与开发

社区医院儿童疫苗接种管理系统设计与开发 摘要 自建国以来我国一直注重于卫生健康的建设&#xff0c;而儿童的生命健康更得到重视。疫苗接种作为有效防御疾病的手段之一&#xff0c;一直被广泛应用在世界各地。目前&#xff0c;有相当一部分社区准备使用信息管理系统来进行优…

tensorflow-gpu1.15 + win11 + RTX 4050环境配置

组了一套&#xff0c;不知道行不行 windows11GPURTX 4050python3.7.12tensorflow-gpu1.15.0cudatoolkit10.0.130cudnn7.6.5Keras2.3.1

Java强制类型转换的所有规则都在这里了

&#x1f497;推荐阅读文章&#x1f497; &#x1f338;JavaSE系列&#x1f338;&#x1f449;1️⃣《JavaSE系列教程》&#x1f33a;MySQL系列&#x1f33a;&#x1f449;2️⃣《MySQL系列教程》&#x1f340;JavaWeb系列&#x1f340;&#x1f449;3️⃣《JavaWeb系列教程》…

VR全景对旅游业有什么帮助,如何助力旅游业实现新的旅游形式

引言&#xff1a; 旅游业是一个充满机遇的行业&#xff0c;而虚拟现实&#xff08;VR&#xff09;全景技术正逐渐改变着旅游业的面貌&#xff0c;通过提供身临其境的体验&#xff0c;VR全景成为了旅游业的新宠&#xff0c;将旅游带入了一个全新的数字化时代。 一、打破地域限制…

【C指针】深入理解指针(最终篇)数组指针指针运算题解析(一)

&#x1f308;write in front :&#x1f50d;个人主页 &#xff1a; 啊森要自信的主页 ✏️真正相信奇迹的家伙&#xff0c;本身和奇迹一样了不起啊&#xff01; 欢迎大家关注&#x1f50d;点赞&#x1f44d;收藏⭐️留言&#x1f4dd;>希望看完我的文章对你有小小的帮助&am…

Prometheus集群模式部署日记-主节点篇

Prometheus架构组件主节点masterPrometheus-master&#xff0c;Alertmanger&#xff0c;Grafana&#xff0c;PrometheusAlert子节点node(不同网络&#xff0c;混合云环境)Prometheus-node1 所有组件均采用docker-compose部署&#xff0c;docker 和 compose 请自行安装不再赘述…

基于AT89C51单片机的电子闹钟设计

1&#xff0e;设计任务 利用AT89C51单片机为核心控制元件,设计一个电子闹钟&#xff0c;设计的系统实用性强、操作简单&#xff0c;实现了智能化、数字化。 &#xff08;1&#xff09;按开始键自动进入时间显示&#xff0c;开始为0&#xff0c;按K1键进入更改时间&#xff0c…

11.30BST理解,AVL树操作,定义;快速幂,二分求矩阵幂(未完)

完全二叉树结点的度可能有1&#xff0c;满二叉树的度只能为0或2 BST构建 BST是左孩子都比根节点小&#xff0c;右孩子都比根节点大 二叉搜索树的插入&#xff0c;删除&#xff0c;调整 平衡树理解 任何一个平衡二叉树&#xff0c;它的中序遍历都是一样的&#xff0c;都是有…

LangChain的函数,工具和代理(三):LangChain中轻松实现OpenAI函数调用

在我之前写的两篇博客中:OpenAI的函数调用,LangChain的表达式语言(LCEL)中介绍了如何利用openai的api来实现函数调用功能&#xff0c;以及在langchain中如何实现openai的函数调用功能&#xff0c;在这两篇博客中&#xff0c;我们都需要手动去创建一个结构比较复杂的函数描述变量…