pgsql数据库默认配置事务类型_postgreSql最佳配置详解(connection 申请、回收策略)...

一、引子

合理配置一个应用的数据库参数,使其运行良好,这很重要。本文以某务中台的生产环境为例,从Apollo上拔下来一套配置,分析是否合理。

二、MybatisPlus配置

由于我们使用Apollo配置参数,所以分两部分:1.个体配置 2.全局配置

2.1 mybatisplus个体配置

mybatis-plus.mapper-locations = classpath*:/mapper/*Mapper.xml  mapper文件地址匹配

mybatis-plus.type-aliases-package =xx.po 映射的实体包路径,

mybatis-plus.tenant-config.ignoretable = table1,table2

mybatis-plus.auth-config = []

mybatis-plus.global-config.sql-parser-cache = true 缓存sql解析

2.2 mybatis-plus全局配置

mybatis-plus.mapper-locations = classpath:/mapper/*Mapper.xml  mapper文件地址匹配

mybatis-plus.configuration.map-underscore-to-camel-case = true    下划线转驼峰

mybatis-plus.global-config.logic-delete-value = true  逻辑已删除值

mybatis-plus.global-config.logic-not-delete-value = false  逻辑未删除值

mybatis-plus.max-query-records-size = 10000

三、Datasource配置

3.1 dataSource个体配置

=========数据库配置=========

spring.datasource.connectionProperties = druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000 通过connectProperties属性来打开mergeSql功能;慢SQL记录5秒

spring.datasource.type = com.alibaba.druid.pool.DruidDataSource 使用德鲁伊连接池

spring.datasource.driver-class-name = org.postgresql.Driver 驱动类名

spring.datasource.url = xx  数据库连接url

spring.datasource.username = ${dbUserName} 用户名

spring.datasource.password = ${dbPassword} 密码

spring.datasource.minIdle = 5 最小空闲连接数 5

spring.datasource.initialSize = 5 初始连接数 5

spring.datasource.maxActive = 100 最大连接数

spring.datasource.maxWait = 60000 获取连接等待超时的时间 60s=1分钟

spring.datasource.filters = stat,wall 监控统计拦截,用于监控界面sql统计

spring.datasource.poolPreparedStatements = false 是否启用缓存PreparedStatements

spring.datasource.maxPoolPreparedStatementPerConnectionSize = 20 指定每个连接上preStatement缓存数---》未生效!!!

=========健康检查=========

spring.datasource.validationQuery = SELECT 1 连接池的健康检查SQL

spring.datasource.testOnBorrow = false 申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。

spring.datasource.testOnReturn = false 归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能

spring.datasource.testWhileIdle = true 建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。

#每timeBetweenEvictionRunsMillis毫秒检查一次连接池中空闲的连接,把空闲时间超过minEvictableIdleTimeMillis毫秒的连接断开,直到连接池中的连接数到minIdle为止

spring.datasource.minEvictableIdleTimeMillis = 300000 最小可驱逐空闲时间,连接保持空闲而不被驱逐的最长时间,单位是毫秒 300s=5分钟

spring.datasource.timeBetweenEvictionRunsMillis = 60000 间隔多久才进行一次驱逐检测,单位是毫秒 60s=1分钟

=========连接超时=========

# 关闭abanded连接时输出错误日志,预生产/生产不建议开启,对性能影响

spring.datasource.logAbandoned = false

# 是否清除已经超过“removeAbandonedTimout”设置的无效连接。

spring.datasource.removeAbandoned = true

# 连接超过指定时间未关闭,就会被强行回收 180s=3分钟

spring.datasource.removeAbandonedTimeoutMillis = 180000

四、源码剖析

看完配置,大家心里还是懵逼对吧,参数如何生效,druid到底如何运行?

下面,带着问题,深入源码,直接剖析druid如何申请连接、释放连接、连接泄露检查。

4.1.申请连接

最终跟进到DruidDataSource的getConnectionDirect(long maxWaitMillis),获取得到连接后,validationQuery有效性检查,源码如下:

1.testOnBorrow =true,先直接校验,执行validationQuery,失败就关闭连接JdbcUtils.close(realConnection);

2.testWhileIdle=true,如果testOnBorrow =false, 测试空闲的连接,执行validationQuery,失败就关闭连接JdbcUtils.close(realConnection);

3.removeAbandoned=true,如果开启了泄露回收:把连接添加进Map activeConnections 。供泄露回收时使用。

分支1和2只会有一个执行。

4.2.释放连接

德鲁伊连接池在获取连接时,会调用一次DruidDataSource的init()。方法中createAndStartDestroyThread()开启了一个销毁线程。

销毁连接的线程包含了run(),如下:

在一个for空条件循环中,根据配置的timeBetweenEvictionRunsMillis连接检测间隔时间,执行一次DestroyTask.run()就休眠一次间隔时间。未设置默认60s。(实际源码中定义了60spublic static final long DEFAULT_TIME_BETWEEN_EVICTION_RUNS_MILLIS = 60 * 1000L;,所以用户未设置,默认60s,上图中else分支sleep1秒不会执行到)

追踪DestroyTask.run()如下:

2个步骤:

shrink()收缩校验

removeAbandoned()连接泄露移除

shrink()收缩校验

DruidDataSource内部定义了DruidConnectionHolder[] 类型的3个数组:

1.connections:可用连接数组。申请连接就从这里数组队尾拿连接。

2.evictConnections:待移除连接数组。

3.keepAliveConnections:待保活检测数组。

塞进数组

shrink()中计算出需要校验的数量checkCount,执行收缩校验核心逻辑:

校验物理连接的超时时间phyTimoutMills:超时放入evictConnections中,等待移除。

空余时间大于minEvictableIdleTimeMillis(受保最小空闲时间),并且索引(poolingCount)小于checkCount的连接则放入evictConnections;

空余时间大于minEvictableIdleTimeMillis(受保最小空闲时间),并且索引大于checkCount的连接,假若空余时间大于maxEvictableIdleTimeMillis则放入evictConnections,否则放入keepAliveConnections中进行keepAlive检测。

如下图:

数组处理

1.evictConnections:待移除连接数组。使用JdbcUtils.close()  关闭连接。

2.keepAliveConnections:待保活检测数组。根据配置的validationQuery查询SQL执行连接可用性校验。校验通过后再put(holder)塞进connections可用连接数组。

4.3.泄露连接移除

如果开启了removeAbandoned ,执行removeAbandoned()。移除泄露连接逻辑如下:

实际上,就是对可能的连接泄露(打开连接后长时间不关闭)兜底。

1)遍历活跃连接Map activeConnections。

2)跳过运行中的连接,running定义:执行SQL前赋值true ,执行完后置false。---》问题1得到答案,不会暴力关闭执行中的连接。

3)如果当前连接已连接时间>=removeAbandonedTimeoutMillis ,直接从activeConnections map 中移除。

这里消耗性能主要两步骤:

1.内存中记录+移除泄露连接

2.打印相关日志的IO---》logAbandoned=false 可关闭写日志

spring 的druid 连接池一般不会造成泄露。如果出现连接泄露,应该找到问题解决。---》问题2得到答案,目前关闭了写日志,就剩下了第一点“内存占用+过滤的性能”成本,要求不高的场景可以作为兜底方案使用。如果项目已稳定,推荐关闭。

五.分析&总结

本节为我们根据:申请、释放连接相关的参数配置,剖析策略是否合理。

5.1 配置分析

spring.datasource.testOnBorrow = false 申请连接时执行validationQuery检测连接是否有效

spring.datasource.testOnReturn = false 归还连接时执行validationQuery检测连接是否有效

spring.datasource.testWhileIdle = true testOnBorrow=false时才生效,申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。

spring.datasource.initialSize = 5 初始连接数 5

spring.datasource.maxActive = 100 最大连接数

spring.datasource.minIdle = 5 最小空闲连接数 5

timeBetweenEvictionRunsMillis= 60000 60s=1分钟检测一次

minEvictableIdleTimeMillis=300000 300s=5分钟 最小空闲不移除时间

maxEvictableIdleTimeMillis 未设置最大空闲移除时间,默认DEFAULT_MAX_EVICTABLE_IDLE_TIME_MILLIS = 1000L * 60L * 60L * 7 = 7小时。

keepAlive: 未设置保活开关,默认false关闭。不执行保活测试策略。

上述配置对应的策略:

1.初始策略

初始5个连接,最多可开启100个连接。

2.申请策略

申请连接的时候检测,如果连接空闲时间大于1分钟(检测间隔时间),执行validationQuery检测连接是否有效。---》这里可确保我们空闲时间超过1分钟的连接,校验后使用。

3.回收策略

每一分钟执行一次检测,策略如下:

1.连接空闲小于5分钟,不移除。

2.连接空闲大于5分钟,保留”minIdle设置的5个idle连接”,可移除(总数-5)个连接。

3.连接空闲大于7小时,可移除“minIdle设置的5个idle连接”。---》因为没有设置maxEvictableIdleTimeMillis ,默认空闲7小时后才会移除。不过一共就5个倒也没什么事。

4.连接空闲5分钟~7小时,由于没开启keepAlive保活开关,无法对“minIdle设置的5个idle连接”保活测试。-->minIdle设置的5个idle连接,这段时间一直不回收,也不做保活测试,连接是否有效无法保证。

5.2总结

1.现有项

removeAbandoned=true 开启连接泄露检测,要求不高的场景可以作为兜底方案使用。如果项目已稳定,推荐关闭。

2.可添加项

phyTimeoutMillis:看需要开启。物理超时时间。不管空闲时间,超时直接移除。---》这个是终极兜底方案,可以确保超时强制移除。

maxEvictableIdleTimeMillis:建议开启,实现精细化控制。

keepAlive: 建议开启。可针对“minIdle设置的空闲连接”,进行保活测试,从而提升连接的质量。

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

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

相关文章

android系统手势app,8种iOS手势规定和14种android手势规定详解

不知道大家对ios系统和android系统的规定的原生手势有哪些吗?看到这样的标题,你能够回答出几个呢?其实,APP设计师和h5开发工程师对移动设备的手势的了解和理解是非常有必要的。只有掌握了这些平台的手势规定才能设计出符合用户操作…

mPaas 运维流程介绍

简介: 金融级移动开发平台 mPaaS(Mobile PaaS)为 App 开发、测试、运营及运维提供云到端的一站式解决方案,能有效降低技术门槛、减少研发成本、提升开发效率,协助企业快速搭建稳定高质量的移动应用。在我们日常运维过程…

360借条通过CCRC权威认证,再获国家级认可

近日,中国网络安全审查技术与认证中心(CCRC)向360借条App颁发移动互联网应用程序(App)安全认证证书。通过该认证,表明360借条App在个人信息保护方面的工作再次取得了国家级肯定。 随着移动互联的蓬勃发展&…

在.NET环境中使用Python和TensorFlow进行深度学习入门篇

在.NET环境中使用Python和TensorFlow进行深度学习可能需要通过一些中介工具或者框架,因为TensorFlow原生支持的是Python、C等语言。以下是一种可能的入门步骤: 安装Python和TensorFlow: 首先,你需要在你的系统上安装Python&#x…

ElasticSearch IK 分词器快速上手

简介: ElasticSearch IK 分词器快速上手 一、安装 IK 分词器 1.分配伪终端 我的 ElasticSearch 是使用 Docker 安装的,所以先给容器分配一个伪终端.之后就可以像登录服务器一样直接操作docker 中的内容了docker exec -it 容器ID /bin/bash 2.使用 elasticsearch…

装完系统还要装什么_家里装了空调还要装空气净化系统吗?会不会太浪费了?...

微信搜一搜舒适11今天这篇文章,小壹就向大家科普一下空调和新风系统,告诉大家为什么装了空调还要装新风机。1、空调是什么? 对此大家都能够脱口而出:空调就是用来制冷或制热的机器,能够改变室内温度,让我们…

移动端性能优化系列—启动速度

简介: 移动端性能对用户体验、留存有着至关重要的影响,作为开发者是不是被这样吐槽过,“这个 APP 怎么这么大?”、“怎么一直在 APP 封面图转悠,点不进去”、“进入详情效果有些卡”、“用 4G 使用你们的 APP&#xff…

三重框架构建和威胁情报及时可达,山石网科发布StoneOS 5.5R9

升级的StoneOS 5.5R9版本,在预测与发现、防御与控制、检测与分析、响应与管理四个角度,通过云端运营中心的情报赋能和统筹运维,策略助手的访问链接发现,边界流量过滤的IP快速分类与阻断,精确边缘策略对用户与应用的精细…

html截取url字段,Html中截取url参数 实现HTML间的url传值

大家好:今天遇到一个问题,页面全是html,url传值,竟然获取不到参数值:A.html//登录按钮jQuery(function($) {$("#login").click(function() {$.ajax({//url:http://10.9.80.211:8090/iaf-platform-web/doLogi…

Apache Flink 在京东的实践与优化

简介: Flink 助力京东实时计算平台朝着批流一体的方向演进。 本文整理自京东高级技术专家付海涛在 Flink Forward Asia 2020 分享的议题《Apache Flink 在京东的实践与优化》,内容包括: 业务演进和规模容器化实践Flink 优化改进未来规划一、业…

云端攻防的最后战场,腾讯主机安全旗舰版发布

在刚刚过去的12月里,Apache Log4j 漏洞席卷全球,成为互联网安全领域暴热的话题。而Log4j的破坏力也十分惊人,全球数亿台设备都可能受到影响,攻击者仅需一段代码就可能远程控制服务器。而这场风波一直影响至今,几乎所有…

cad断点快捷键_CAD中打断于点的快捷键

展开全部Autocad部分快捷键绘图命令PO POINT 点L LINE 直线XL XLINE 构造线PL PLINE 多段线ML MLINE 多线SPL SPLINE 样条曲线POL POLYGON 正多边形REC RECTANGLE 矩形C CIRCLE 圆A ARC 圆弧DO DONUT 圆环EL ELLIPSE 椭圆REG REGION 面域T(MT) MTEXT 多行文本DT TEXT 单行文字3…

华为鸿蒙系统p40,华为鸿蒙OS系统正式亮剑!华为P40再次确认:双打孔+麒麟990+鸿蒙OS...

众所周知,华为Mate 系列、P系列产品一直都是华为高端旗舰机型,在整体外观设计、综合性能、拍照等方面,也都是华为最为顶尖的旗舰机型,但在售价方面却遭到了很多“性价比”用户的吐槽,纷纷吐槽华为Mate系列、P系列产品“…

Flink 在顺丰的应用实践

简介: 顺丰基于 Flink 建设实时数仓的思路,引入 Hudi On Flink 加速数仓宽表,以及实时数仓平台化建设的实践。 本⽂由社区志愿者苗文婷整理,内容源⾃顺丰科技大数据平台研发工程师龙逸尘在 Flink Forward Asia 2020 分享的《Flink…

搭建一个高可用的镜像仓库,这是我见过最详细、最简单的教程

作者 | 小碗汤来源 | 我的小碗汤今天分享一篇搭建一个高可用镜像仓库的教程。详细中夹杂着简单~。Harbor 部署架构图harbor 使用 helm 部署在 k8s 集群中,通过 ingress-nginx 代理。pgsql 采用 Pgpool-II 代理,做主从切换、通过同步流式复制进行数据复制…

onclick 源码_精读:手写React框架 解析Hooks源码

写在开头:去年发表过一篇手写React,带diff算法,异步setState队列的文章,有一位阿里的朋友在下面评论,让我可以用hooks实现一次,也很简单,我当时觉得,这人有病,现在回过头来看&#x…

EMR on ACK 全新发布,助力企业高效构建大数据平台

简介: 阿里云 EMR on ACK 为用户提供了全新的构建大数据平台的方式,用户可以将开源大数据服务部署在阿里云容器服务(ACK)上。利用 ACK 在服务部署和对高性能可伸缩的容器应用管理的能力优势,用户只需要专注在大数据作业…

华为120hz鸿蒙系统,华为亮剑,120Hz+鸿蒙系统+5500mAh,竟然如此销魂

原标题:华为亮剑,120Hz鸿蒙系统5500mAh,竟然如此销魂随着制造工艺的不断成熟,智能手机也迎来了前所未有的发展,同时这也导致了手机厂商们之间的竞争变得愈发的激烈了。众所周知,华为手机是一个深受普通老百…

云上应用系统数据存储架构演进

简介: 回顾过去二十年的技术发展,整个应用形态和技术架构发生了很大的升级换代,而任何技术的发展都与几个重要的变量相关。本文将会给大家分享应用系统数据架构的演进以及云上的架构最佳实践。 作者 | 木洛 来源 | 阿里技术公众号 一 前言 …

随时随地办公新常态 还需安全来相伴

随着网络防护边缘的不断扩展,企业为本已负载过重的内网环境又配置了更多的安全产品,并已成为常态。当下,平均每个企业需要部署和管理45种安全工具,周旋于19种不同的设备以检测和响应每一个网络事件,众多企业为此疲惫不…