首页 > 其他分享 >阿里Druid数据源:DruidDataSource配置属性全解

阿里Druid数据源:DruidDataSource配置属性全解

时间:2024-08-30 19:50:56浏览次数:13  
标签:数据源 数据库 配置 Druid DruidDataSource 超时 连接 属性

1. 前言

Druid是Java语言中最好的数据库连接池。Druid能够提供强大的监控和扩展功能。

Druid是一个开源项目,源码托管在github上,源代码仓库地址是:
 https://github.com/alibaba/druid

同时每次Druid发布正式版本和快照的时候,都会把源码打包,你可以从上面的下载地址中找到相关版本的源码

DruidDataSource配置兼容DBCP,但个别配置的语意有所区别。 以下配置说明基于druid 1.2.22 整理,请升级至1.2.22或更高版本,并参考以下属性进行相关配置

2. 配置项说明

配置项名称缺省值说明
connectProperties{}

map方式放入自定义的key和value,在Filter等地方可以获取该信息进行相应逻辑控制

connectionPropertiesnull字符串方式放入自定义的key和value,键值对用分号隔开,比如“a=b;c=d”,传入空白字符串表示清空属性,实际拆分字符串后赋值给connectProperties,在Filter等地方可以获取该信息进行相应逻辑控制
connectTimeout0新增的控制创建连接时的socket连接最大等待超时,单位是毫秒,默认0表示永远等待,工作原理是在创建连接时将该值设置到对应数据库驱动的属性信息中由其JDBC驱动进行控制
connectionInitSqls[]数组方式定义物理连接初始化的时候执行的1到多条sql语句,比如连接MySQL数据库使用低版本驱动的情况下,想使用utf8mb4,则可以配置sql为: set NAMES 'utf8mb4'
createSchedulernull可以使用定时线程池方式异步创建连接,比起默认的单线程创建连接方式,经实际验证这种更可靠
dbTypenull对于不是Druid自动适配支持的db类型,可以强制指定db类型,字符串值来自com.alibaba.druid.DbType的枚举名
destroySchedulernull可以使用定时线程池方式异步创建连接,比起默认的单线程创建连接方式,经实际验证这种更可靠
driverClassName根据url自动识别这一项可配可不配,如果不配置druid会根据url自动识别dbType,然后选择相应的driverClassName
exceptionSorternull当数据库抛出一些不可恢复的异常时,抛弃连接
failFastfalsenull
filters属性类型是逗号隔开的字符串,通过别名的方式配置扩展插件,插件别名列表请参考druid jar包中的 /META-INF/druid-filter.properties,常用的插件有:
监控统计用的filter:stat
日志用的filter:log4j
防御sql注入的filter:wall
防御sql注入的filter:wall
initialSize0初始化数据源时建立物理连接的个数。初始化发生在显示调用init方法,或者第一次getConnection时
keepAlivefalse连接池中的minIdle数量以内的连接,空闲时间超过minEvictableIdleTimeMillis,则会执行keepAlive操作。实际项目中建议配置成true
keepAliveBetweenTimeMillis120000null
logAbandonedfalse在开启removeAbandoned为true的情况,可以开启该设置,druid在销毁未及时关闭的连接时,则会输出日志信息,便于定位连接泄露问题
loginTimeout单位是秒,底层调用DriverManager全局静态方法
maxActive8连接池最大活跃连接数量,当连接数量达到该值时,再获取新连接时,将处于等待状态,直到有连接被释放,才能借用成功
maxEvictableIdleTimeMillis25200000null
maxIdle8已经彻底废弃,配置了也没效果,以maxActive为准
maxOpenPreparedStatements10null

maxPoolPreparedStatement

PerConnectionSize

10要启用PSCache,必须配置大于0,当大于0时,poolPreparedStatements自动触发修改为true。在Druid中,不会存在Oracle下PSCache占用内存过多的问题,可以把这个数值配置大一些,比如说100
maxWait-1获取连接时最大等待时间,单位毫秒。配置了maxWait之后,缺省启用公平锁,并发效率会有所下降,如果需要可以通过配置useUnfairLock属性为true使用非公平锁。
minEvictableIdleTimeMillis1800000连接保持空闲而不被驱逐的最小时间
minIdle0连接池最小空闲数量
nameDataSource-****配置这个属性的意义在于,如果存在多个数据源,监控的时候可以通过名字来区分开来。如果没有配置,将会生成一个名字,格式是:"DataSource-" + System.identityHashCode(this). 另外配置此属性至少在1.0.5版本中是不起作用的,强行设置name会出错。详情-点此处
numTestsPerEvictionRun3不再使用,已经彻底废弃,一个DruidDataSource只支持一个EvictionRun
passwordnull连接数据库的密码。如果你不希望密码直接写在配置文件中,可以使用passwordCallback进行配置,或者使用ConfigFilter。详细看这里
passwordCallbacknull可以自定义实现定制的PasswordCallback,然后实现定制的密码解密效果
phyTimeoutMillis-1强制回收物理连接的最大超时时长,大于0的情况下才生效,当物理创建之后存活的时长超过该值时,该连接会强制销毁,便于重新创建新连接,建议可以配置成7小时的毫秒值,比如25200000,这样可以规避MySQL的8小时连接断开问题
poolPreparedStatementsfalse是否缓存preparedStatement,也就是PSCache。PSCache对支持游标的数据库性能提升巨大,比如说oracle。在mysql下建议关闭。
proxyFilters类型是List<com.alibaba.druid.filter.Filter>,如果同时配置了filters和proxyFilters,是组合关系,并非替换关系
queryTimeout0控制查询结果的最大超时,单位是秒,大于0才生效,最终底层调用是java.sql.Statement.setQueryTimeout(int)
removeAbandonedfalse是否回收泄露的连接,默认不开启,建议只在测试环境设置未开启,利用测试环境发现业务代码中未正常关闭连接的情况
removeAbandonedTimeoutMillis300000开启回收泄露连接的最大超时,默认300秒表示连接被借出超过5分钟后,且removeAbandoned开启的情况下,强制关闭该泄露连接
socketTimeout0新增的控制创建连接时的socket最大读超时,单位是毫秒,默认0表示永远等待,配置成10000则表示db操作如果在10秒内未返回应答,将抛出异常,工作原理是在创建连接时将该值设置到对应数据库驱动的属性信息中由其JDBC驱动进行控制
testOnBorrowfalse申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能,其实一般情况下都可以开启,只有性能要求极其高且连接使用很频繁的情况下才有必要禁用。
testOnReturnfalse归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能,这个一般不需要开启。
testWhileIdletrue建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。
timeBetweenEvictionRunsMillis60000有两个含义:
1) Destroy线程会检测连接的间隔时间,如果连接空闲时间大于等于minEvictableIdleTimeMillis则关闭物理连接。
2) testWhileIdle的判断依据,详细看testWhileIdle属性的说明
transactionQueryTimeout0控制查询结果的最大超时,单位是秒,大于0才生效,最终是在开启事务的情况下底层调用java.sql.Statement.setQueryTimeout(int)
url连接数据库的url,不同数据库不一样。例如:
mysql : jdbc:mysql://10.20.153.104:3306/druid2
oracle : jdbc:oracle:thin:@10.20.149.85:1521:ocnauto
usernamenull连接数据库的用户名
validationQuerynull用来检测连接是否有效的sql,要求是一个查询语句,常用select 'x'。如果validationQuery为null,testOnBorrow、testOnReturn、testWhileIdle都不会起作用。
validationQueryTimeout-1单位:秒,检测连接是否有效的超时时间,大于0才生效。底层调用jdbc Statement对象的void setQueryTimeout(int seconds)方法

3.DruidDataSource 参考配置

3.1 通用配置

DruidDataSource大部分属性都是参考DBCP的,如果你原来就是使用DBCP,迁移是十分方便的。

 <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"> 
     <property name="url" value="${jdbc_url}" />
     <property name="username" value="${jdbc_user}" />
     <property name="password" value="${jdbc_password}" />

     <property name="filters" value="stat" />

     <property name="maxActive" value="20" />
     <property name="initialSize" value="1" />
     <property name="maxWait" value="6000" />
     <property name="minIdle" value="1" />

     <property name="timeBetweenEvictionRunsMillis" value="60000" />
     <property name="minEvictableIdleTimeMillis" value="300000" />

     <property name="testWhileIdle" value="true" />
     <property name="testOnBorrow" value="false" />
     <property name="testOnReturn" value="false" />

     <property name="poolPreparedStatements" value="true" />
     <property name="maxOpenPreparedStatements" value="20" />

     <property name="asyncInit" value="true" />
 </bean>

注释:

  • 在上面的配置中,通常你需要配置url、username、password,maxActive这四项。
  • Druid会自动跟url识别驱动类名,如果连接的数据库非常见数据库,配置属性driverClassName
  • asyncInit是1.1.4中新增加的配置,如果有initialSize数量较多时,打开会加快应用启动时间

3.2 连接阿里云AnalyticDB参考配置

使用Druid连接池连接阿里云AnalyticDB 建议配置keepAlive=true ,并使用1.1.16 之后的版本

  <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"> 
     <!-- 基本属性 url、user、password -->
     <property name="url" value="${jdbc_url}" />
     <property name="username" value="${jdbc_user}" />
     <property name="password" value="${jdbc_password}" />
       
     <!-- 配置初始化大小、最小、最大 -->
     <property name="initialSize" value="5" />
     <property name="minIdle" value="10" /> 
     <property name="maxActive" value="20" />
  
     <!-- 配置获取连接等待超时的时间 -->
     <property name="maxWait" value="6000" />
  
     <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
     <property name="timeBetweenEvictionRunsMillis" value="2000" />
  
     <!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
     <property name="minEvictableIdleTimeMillis" value="600000" />
     <property name="maxEvictableIdleTimeMillis" value="900000" />
   
     <property name="validationQuery" value="select 1" />
     <property name="testWhileIdle" value="true" />
     <property name="testOnBorrow" value="false" />
     <property name="testOnReturn" value="false" />
  
     <property name="keepAlive" value="true" />
     <property name="phyMaxUseCount" value="1000" />
  
     <!-- 配置监控统计拦截的filters -->
     <property name="filters" value="stat" /> 
 </bean>

3.3 连接阿里云Data Lake Analytics参考配置

使用Druid连接池连接阿里云Data Lake Analytics 建议配置keepAlive=true,并使用1.1.16 之后的版本

  <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"> 
     <!-- 基本属性 url、user、password -->
     <property name="url" value="${jdbc_url}" />
     <property name="username" value="${jdbc_user}" />
     <property name="password" value="${jdbc_password}" />
       
     <!-- 配置初始化大小、最小、最大 -->
     <property name="initialSize" value="1" />
     <property name="minIdle" value="1" /> 
     <property name="maxActive" value="10" />
  
     <!-- 配置获取连接等待超时的时间 -->
     <property name="maxWait" value="6000" />
  
     <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
     <property name="timeBetweenEvictionRunsMillis" value="2000" />
  
     <!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
     <property name="minEvictableIdleTimeMillis" value="600000" />
     <property name="maxEvictableIdleTimeMillis" value="900000" />
   
     <property name="validationQuery" value="select 1" />
     <property name="testWhileIdle" value="true" />
     <property name="testOnBorrow" value="false" />
     <property name="testOnReturn" value="false" />
  
     <property name="keepAlive" value="true" />
     <property name="phyMaxUseCount" value="500" />
  
     <!-- 配置监控统计拦截的filters -->
     <property name="filters" value="stat" /> 
 </bean>

4. Druid锁的公平模式问题

锁的公平和效率是一个需要平衡的问题。

如果配置了maxWait,在连接不够用争用时,unfair模式的ReentrantLock.tryLock方法存在严重不公的现象,个别线程会等到超时了还获取不到连接。

版本处理方式效果
0.2.3之前unfair并发性能很好。
maxWait>0的配置下,出现严重不公平现象
0.2.3 ~ 0.2.6fair公平,但是并发性能很差
0.2.7通过构造函数传入参数指定fair或者unfair,缺省fair按需要配置,但是比较麻烦
0.2.8缺省unfair,通过构造函数传入参数指定fair或者unfair;
如果DruidDataSource还没有初始化,修改maxWait大于0,自动转换为fair模式
智能配置,能够兼顾性能和公平性

可以手工配置

dataSouce.setUseUnfairLock(true)

标签:数据源,数据库,配置,Druid,DruidDataSource,超时,连接,属性
From: https://blog.csdn.net/lilinhai548/article/details/141714897

相关文章

  • NocoBase 1.3:REST API 数据源、移动端 V2 和更多功能
    从v1.3开始,NocoBase提供两个关键分支:main和next。main分支,beta版本,专注于缺陷修复,确保为用户提供一个稳定的版本;next分支,alpha版本,包含一些正式未发布的新特性,这个版本不稳定,适用于开发者或测试人员,用于提前体验新功能或进行兼容性测试。本次1.3beta的新特性包括......
  • 多数据源配置
    #数据源配置spring:datasource:#type:com.alibaba.druid.pool.DruidDataSourcetype:com.zaxxer.hikari.HikariDataSourcedriverClassName:com.microsoft.sqlserver.jdbc.SQLServerDriver#com.mysql.cj.jdbc.Driverdruid:#主库数据源master:......
  • SpringBoot配置动态数据源 原理+实战
    若没空探究原理可直接跳转到“实现方式:注解+切面”目录数据源切换方法Spring对数据源的管理类似于策略模式,不懂策略模式也没关系,其实就是有一个全局的键值对,类型是Map<String,DataSource>。当JDBC操作数据库之时,会根据不同的key值选择不同的数据源。而这个key值可以放到方法的......
  • 一个AI原生数据应用数据库开发框架,专为数据3.0时代设计,支持私域问答、多数据源交互、
    前言在数字化转型的浪潮中,企业在数据处理和分析方面面临着巨大的挑战。传统软件往往存在复杂的数据库交互、低效的数据整合流程以及缺乏智能化数据分析能力等痛点。这些问题不仅拖慢了企业决策的步伐,也限制了创新的发展。因此,急需一款能够简化数据库交互、智能化数据处理的软......
  • Gradle编译项目Druid找不到tools.jar和jconsole.jar
     原因:jdk11之后不支持druid的两个依赖方法一:<dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.2.5</version>方法二:<!--<exclusions><exclusion><gro......
  • DataSource 数据源
    目录什么是DataSource?DataSource有什么作用?如何创建DataSource?   1.使用基本的JDBCDataSource   2.使用SpringBoot自动配置总结   创建数据源(DataSource)对象是Java应用程序中与数据库交互的一个重要步骤。数据源对象通常用于管理与数据库的......
  • 记 Druid 连接池配置不当引发的服务卡慢宕机问题
    背景单体服务部署到Tomcat之后,运行一段时间,出现系统响应超时的情况。重启服务后正常,一段时间后重新出现。排查查看CPU信息发现正常,打开jvisualvm,发现线程数持续上升,且没有下降趋势,此时初步判断系统在某个地方卡住了,请求进来后处理任务的线程都处于等待状态。在jvisualvm......
  • 一个创新的国密前后分离快速开发平台,提供工作流、多租户、多数据源、Vue3表单设计器,高
    前言在当前的软件开发领域,尤其是企业级应用开发中,开发者面临着诸多挑战,如代码安-全、数据加密、国产化适配等。传统的开发平台往往难以满足这些日益增长的需求,特别是在国产化替代的大背景下,对于符合国家安-全标准的软件需求愈发迫切。这就需要一款能够解决上述痛点,同时提供高......
  • C# WindowForm界面初探,窗体访问,绑定数据源,重载构造函数
    今日份主要内容C#WindowForm界面初探Winform项目模板,目录解析窗体对象控件对象界面设计基础1.控件?控件的本质是类,控件是构建用户界面(UserInterface)的基础,通过控件组合设计出符合需求的界面效果。相当于html的标签。基本要求:界面效果,布局交互(事件,委托)2.学习控件......
  • Linux 设置零时proxy 安装数据源
    一、方法一设置临时HTTP代理您可以通过在命令行中临时设置环境变量来指定HTTP代理:exporthttp_proxy=http://proxy-server:portexporthttps_proxy=http://proxy-server:port二、方法二使用SOCKS代理的配置方法设置SOCKS5代理的环境变量:exportALL_PROXY=socks5:......