网络
虚拟私有云 VPC
弹性公网IP EIP
弹性负载均衡 ELB
NAT网关 NAT
云专线 DC
虚拟专用网络 VPN
云连接 CC
VPC终端节点 VPCEP
企业路由器 ER
企业交换机 ESW
全球加速 GA
企业连接 EC
云原生应用网络 ANC
安全与合规
安全技术与应用
Web应用防火墙 WAF
企业主机安全 HSS
云防火墙 CFW
安全云脑 SecMaster
DDoS防护 AAD
数据加密服务 DEW
数据库安全服务 DBSS
云堡垒机 CBH
数据安全中心 DSC
云证书管理服务 CCM
威胁检测服务 MTD
态势感知 SA
认证测试中心 CTC
边缘安全 EdgeSec
应用中间件
微服务引擎 CSE
分布式消息服务Kafka版
分布式消息服务RabbitMQ版
分布式消息服务RocketMQ版
API网关 APIG
分布式缓存服务 DCS
多活高可用服务 MAS
事件网格 EG
管理与监管
统一身份认证服务 IAM
消息通知服务 SMN
云监控服务 CES
应用运维管理 AOM
应用性能管理 APM
云日志服务 LTS
云审计服务 CTS
标签管理服务 TMS
配置审计 Config
应用身份管理服务 OneAccess
资源访问管理 RAM
组织 Organizations
资源编排服务 RFS
优化顾问 OA
IAM 身份中心
云运维中心 COC
资源治理中心 RGC
解决方案
高性能计算 HPC
SAP
混合云灾备
开天工业工作台 MIW
Haydn解决方案工厂
数字化诊断治理专家服务
云生态
云商店
合作伙伴中心
华为云开发者学堂
华为云慧通差旅
开发与运维
软件开发生产线 CodeArts
需求管理 CodeArts Req
流水线 CodeArts Pipeline
代码检查 CodeArts Check
编译构建 CodeArts Build
部署 CodeArts Deploy
测试计划 CodeArts TestPlan
制品仓库 CodeArts Artifact
移动应用测试 MobileAPPTest
CodeArts IDE Online
开源镜像站 Mirrors
性能测试 CodeArts PerfTest
应用管理与运维平台 ServiceStage
云应用引擎 CAE
开源治理服务 CodeArts Governance
华为云Astro轻应用
CodeArts IDE
Astro工作流 AstroFlow
代码托管 CodeArts Repo
漏洞管理服务 CodeArts Inspector
联接 CodeArtsLink
软件建模 CodeArts Modeling
Astro企业应用 AstroPro
CodeArts 盘古助手
华为云Astro大屏应用
计算
弹性云服务器 ECS
Flexus云服务
裸金属服务器 BMS
云手机服务器 CPH
专属主机 DeH
弹性伸缩 AS
镜像服务 IMS
函数工作流 FunctionGraph
云耀云服务器(旧版)
VR云渲游平台 CVR
Huawei Cloud EulerOS
网络
虚拟私有云 VPC
弹性公网IP EIP
弹性负载均衡 ELB
NAT网关 NAT
云专线 DC
虚拟专用网络 VPN
云连接 CC
VPC终端节点 VPCEP
企业路由器 ER
企业交换机 ESW
全球加速 GA
企业连接 EC
云原生应用网络 ANC
CDN与智能边缘
内容分发网络 CDN
智能边缘云 IEC
智能边缘平台 IEF
CloudPond云服务
安全与合规
安全技术与应用
Web应用防火墙 WAF
企业主机安全 HSS
云防火墙 CFW
安全云脑 SecMaster
DDoS防护 AAD
数据加密服务 DEW
数据库安全服务 DBSS
云堡垒机 CBH
数据安全中心 DSC
云证书管理服务 CCM
威胁检测服务 MTD
态势感知 SA
认证测试中心 CTC
边缘安全 EdgeSec
大数据
MapReduce服务 MRS
数据湖探索 DLI
表格存储服务 CloudTable
可信智能计算服务 TICS
推荐系统 RES
云搜索服务 CSS
数据可视化 DLV
数据接入服务 DIS
数据仓库服务 GaussDB(DWS)
数据治理中心 DataArts Studio
湖仓构建 LakeFormation
智能数据洞察 DataArts Insight
应用中间件
微服务引擎 CSE
分布式消息服务Kafka版
分布式消息服务RabbitMQ版
分布式消息服务RocketMQ版
API网关 APIG
分布式缓存服务 DCS
多活高可用服务 MAS
事件网格 EG
开天aPaaS
应用平台 AppStage
开天企业工作台 MSSE
开天集成工作台 MSSI
API中心 API Hub
云消息服务 KooMessage
交换数据空间 EDS
云地图服务 KooMap
云手机服务 KooPhone
组织成员账号 OrgID
云空间服务 KooDrive
管理与监管
统一身份认证服务 IAM
消息通知服务 SMN
云监控服务 CES
应用运维管理 AOM
应用性能管理 APM
云日志服务 LTS
云审计服务 CTS
标签管理服务 TMS
配置审计 Config
应用身份管理服务 OneAccess
资源访问管理 RAM
组织 Organizations
资源编排服务 RFS
优化顾问 OA
IAM 身份中心
云运维中心 COC
资源治理中心 RGC
区块链
区块链服务 BCS
数字资产链 DAC
华为云区块链引擎服务 HBS
解决方案
高性能计算 HPC
SAP
混合云灾备
开天工业工作台 MIW
Haydn解决方案工厂
数字化诊断治理专家服务
价格
成本优化最佳实践
专属云商业逻辑
云生态
云商店
合作伙伴中心
华为云开发者学堂
华为云慧通差旅
其他
管理控制台
消息中心
产品价格详情
系统权限
客户关联华为云合作伙伴须知
公共问题
宽限期保留期
奖励推广计划
活动
云服务信任体系能力说明
开发与运维
软件开发生产线 CodeArts
需求管理 CodeArts Req
流水线 CodeArts Pipeline
代码检查 CodeArts Check
编译构建 CodeArts Build
部署 CodeArts Deploy
测试计划 CodeArts TestPlan
制品仓库 CodeArts Artifact
移动应用测试 MobileAPPTest
CodeArts IDE Online
开源镜像站 Mirrors
性能测试 CodeArts PerfTest
应用管理与运维平台 ServiceStage
云应用引擎 CAE
开源治理服务 CodeArts Governance
华为云Astro轻应用
CodeArts IDE
Astro工作流 AstroFlow
代码托管 CodeArts Repo
漏洞管理服务 CodeArts Inspector
联接 CodeArtsLink
软件建模 CodeArts Modeling
Astro企业应用 AstroPro
CodeArts 盘古助手
华为云Astro大屏应用
存储
对象存储服务 OBS
云硬盘 EVS
云备份 CBR
高性能弹性文件服务 SFS Turbo
弹性文件服务 SFS
存储容灾服务 SDRS
云硬盘备份 VBS
云服务器备份 CSBS
数据快递服务 DES
云存储网关 CSG
专属分布式存储服务 DSS
数据工坊 DWR
地图数据 MapDS
键值存储服务 KVS
容器
云容器引擎 CCE
云容器实例 CCI
容器镜像服务 SWR
云原生服务中心 OSC
应用服务网格 ASM
华为云UCS
数据库
云数据库 RDS
数据复制服务 DRS
文档数据库服务 DDS
分布式数据库中间件 DDM
云数据库 GaussDB
云数据库 GeminiDB
数据管理服务 DAS
数据库和应用迁移 UGO
云数据库 TaurusDB
人工智能
AI开发平台ModelArts
华为HiLens
图引擎服务 GES
图像识别 Image
文字识别 OCR
自然语言处理 NLP
内容审核 Moderation
图像搜索 ImageSearch
医疗智能体 EIHealth
企业级AI应用开发专业套件 ModelArts Pro
人脸识别服务 FRS
对话机器人服务 CBS
语音交互服务 SIS
人证核身服务 IVS
视频智能分析服务 VIAS
城市智能体
自动驾驶云服务 Octopus
盘古大模型 PanguLargeModels
IoT物联网
设备接入 IoTDA
全球SIM联接 GSL
IoT数据分析 IoTA
路网数字化服务 DRIS
IoT边缘 IoTEdge
设备发放 IoTDP
企业应用
域名注册服务 Domains
云解析服务 DNS
企业门户 EWP
ICP备案
商标注册
华为云WeLink
华为云会议 Meeting
隐私保护通话 PrivateNumber
语音通话 VoiceCall
消息&短信 MSGSMS
云管理网络
SD-WAN 云服务
边缘数据中心管理 EDCM
云桌面 Workspace
应用与数据集成平台 ROMA Connect
ROMA资产中心 ROMA Exchange
API全生命周期管理 ROMA API
政企自服务管理 ESM
视频
实时音视频 SparkRTC
视频直播 Live
视频点播 VOD
媒体处理 MPC
视频接入服务 VIS
数字内容生产线 MetaStudio
迁移
主机迁移服务 SMS
对象存储迁移服务 OMS
云数据迁移 CDM
迁移中心 MGC
专属云
专属计算集群 DCC
开发者工具
SDK开发指南
API签名指南
DevStar
华为云命令行工具服务 KooCLI
Huawei Cloud Toolkit
CodeArts API
云化转型
云架构中心
云采用框架
用户服务
账号中心
费用中心
成本中心
资源中心
企业管理
工单管理
客户运营能力
国际站常见问题
支持计划
专业服务
合作伙伴支持计划
我的凭证
华为云公共事业服务云平台
工业软件
工业数字模型驱动引擎
硬件开发工具链平台云服务
工业数据转换引擎云服务
更新时间:2025-01-24 GMT+08:00
分享

JDBC配置数据库第三方连接池

背景信息

由于GaussDB(DWS)当前没有自己的JDBC连接池,且继承于PG的连接池已下线,因此GaussDB(DWS)建议使用第三方的druid、Hikari CP、dbcp2等连接池。

  • JDBC继承于PG的连接池已下线,不推荐使用。
  • 下述JDBC和驱动下载哪个版本,连接池参数值如何配置,请根据业务实际情况决定。

dbcp2连接池配置

  1. 下载JDBC驱动包,请参见下载JDBC或ODBC驱动

  2. 将JDBC驱动包和commons-dbcp2、commons-logging、commons-pool2驱动包添加到工程中,配置数据库连接池相关参数。

    • 如果启用了removeAbandoned,则一个已遗弃的连接将会被连接池回收再利用,在“(getNumIdle() < 2) and (getNumActive() > getMaxTotal() - 3)”成立时,这个机制将被触发。
      • 例如maxTotal=20,这里有18个活跃连接,1个限制连接,则会触发“removeAbandoned”。
      • 只有在活动连接超过“removeAbandonedTimeout”所指定的秒数内未使用才会被删除(默认为300秒)。
      • 遍历一个结果集并不被统计为被使用,创建一个语句,预处理语句,可调用语句或使用它们其中的一个执行查询(使用执行方法中的某一个)会重新设置其父连接的“lastUsed”属性。
    • 如果在高负载的系统中将“maxIdle”的值设置的很低,可能会导致一个新的连接刚刚被创建的时候就立即被关闭了。这是因为活跃的线程及时关闭连接要比那些打开连接的线程要快,导致空闲的连接数大于“maxIdle”。高负载系统中“maxIdle”的最合适的配置值取决于应用场景,但是缺省值是一个好的开始点。
    表1 dbcp2连接池参数配置

    参数名

    默认值

    说明

    driverClassName

    填写org.postgresql.Driver

    数据库驱动名称。

    url

    -

    连接数据库的URL。

    username

    -

    用户名。

    password

    -

    密码。

    connectionProperties

    -

    连接参数是在建立一个新连接时发送给JDBC驱动的,字符串的格式必须是[参数名=参数值;]

    说明:

    用户名和密码属性是需要明确指出的,所以这两个参数不需要包含在这里。

    defaultAutoCommit

    -

    自动提交。通过当前连接池创建连接的默认为自动提交状态,如果不设置,则“setAutoCommit”方法将不被调用。

    defaultReadOnly

    -

    只读设置。通过当前连接池创建连接的默认为只读状态,如果不设置,则“setReadOnly”方法将不被调用。

    defaultTransactionIsolation

    -

    事务隔离级别。

    通过这个池创建连接的默认为事务隔离策略,设置值为下列中的某一个:

    • NONE:无。
    • READ_COMMITTED:读已提交。
    • READ_UNCOMMITTED:读未提交。
    • REPEATABLE_READ:可重复读。
    • SERIALIZABLE:可串行化。

    defaultCatalog

    -

    通过这个池创建连接的默认为缺省的catalog。

    cacheState

    true

    连接池缓存状态。

    设置为true,连接资源池后将在第一次读或写,以及随后写的时候缓存当前的只读状态和自动提交设置。这样就省去了对getter的任何进一步调用时对数据库的额外查询。

    如果直接访问底层连接,只读状态或自动提交设置改变缓存值将不会被反映到当前的状态,在这种情况下,应该将该属性设置为false以禁用缓存。

    defaultQueryTimeout

    null

    查询超时时间。

    • 设置为一个整数值,用于在创建Statement时,指定为查询超时时间。
    • 设置为null,则使用驱动程序默认设置。

    enableAutoCommitOnReturn

    true

    连接归还到池时,设置为自动提交。

    如果设置为true,则连接被归还到连接池时,会指定设置为“autoCommit = true”

    rollbackOnReturn

    true

    连接归还到池时,回滚所有操作。

    如果设置为true,则连接被归还到连接池时,会自动执行一次“rollback()”;前提是自动提交为true。

    initialSize

    0

    初始连接数。当前连接池被启动时初始化的创建的连接个数,起始生效版本为1.2版本。

    maxTotal

    8

    最大活动连接数。可以在当前连接池中同一时刻被分配的有效连接数的最大值,如果设置为负数,则不限制。

    maxIdle

    8

    最大空闲连接数。在连接池中,可以保持空闲状态的最大连接数,超出设置值之外的空闲连接在归还到连接池时将被释放,如设置为负数,则不限制。

    minIdle

    0

    最小空闲连接数。可以在池中保持空闲的最小连接数,低于设置值时,空闲连接将被创建,以确保最小空闲连接数大于等于minIdle值;如果设置为0,则不创建。

    说明:

    设置的数值生效的前提是:timeBetweenEvictionRunsMillis(空闲对象驱逐线程运行时的休眠毫秒数)被设置为正数。

    maxWaitMillis

    -

    从连接池获取一个连接时,最大的等待时间。

    • 设置为-1时,如果没有可用连接,连接池会一直无限期等待,直到获取到连接为止。
    • 设置为N(毫秒)时,则连接池会等待N毫秒,等待不到,抛出异常。

    validationQuery

    SELECT 1

    确认查询SQL。在连接池返回连接给调用者前用来进行连接校验的查询SQL。

    • 如果指定,则这个查询必须是至少返回一行数据的SELECT语句。
    • 如果没有指定,则连接将通过调用“isValid()”方法进行校验。

    validationQueryTimeout

    -

    确认连接有效SQL的执行查询超时时间(秒)。

    如果设置为正数,则传递给JDBC驱动的“setQueryTimeOut()”方法,这个设置对执行确认有效查询SQL起作用。

    testOnCreate

    false

    连接创建后,马上验证有效性。指明对象在创建后是否需要验证有效性,如果对象验证失败,则触发对象创建的租借尝试将失败。

    testOnBorrow

    true

    从连接池获取一个连接时,验证有效性。指明在从池中租借对象时是否要进行验证有效,如果对象验证失败,则对象将从连接池释放,可尝试租借另一个。

    testOnReturn

    false

    连接被归还到连接池时,验证有效性。指明在将对象归还给连接池前是否需要校验。

    testWhileIdle

    false

    连接空闲时,验证有效性。指明对象是否需要通过对象驱逐者进行校验(如果有的话),假如一个对象验证失败,该对象将从连接池中释放。

    timeBetweenEvictionRunsMillis

    -1

    空闲对象驱逐线程运行时的休眠毫秒数,如果设置为非正数,不运行空闲对象驱逐线程。

    numTestsPerEvictionRun

    3

    在每个空闲对象驱逐线程运行过程中进行检查的对象个数。

    minEvictableIdleTimeMillis

    1000 * 60 * 30

    符合对象驱逐条件的对象在池中最小空闲毫秒总数。空闲的连接最低需要N毫秒后被释放,单位:ms。

    softMinEvictableIdleTimeMillis

    -1

    符合对象驱逐条件的对象在池中最小空闲毫秒总数。

    空闲的连接最低需要N毫秒后被释放,但有额外条件,条件是池中至少保留有minIdle所指定的个数的连接。

    “miniEvictableIdleTimeMillis”被设置为正数时,空闲连接驱逐者首先检测miniEvictableIdleTimeMillis,当空闲连接被驱逐者访问时,首先与miniEvictableIdleTimeMillis所指定的值进行比较(不考虑当前池中的空闲连接数),然后比较softMinEvictableIdleTimeMillis所指定的连接数,包括minIdle条件。

    maxConnLifetimeMillis

    -1

    一个连接的最大存活毫秒数。如果超过这个时间,则连接在下次激活、钝化、校验时都将会失败。如果设置为0或小于0的值,则连接的存活时间是无限的。

    logExpiredConnections

    true

    一个过期的连接被连接池关闭时,写日志标识。如果连接存活时间超过maxConnLifetimeMillis,连接将被连接池回收,此时默认输出日志。如果设置为false,这不会写日志。

    connectionInitSqls

    -

    连接被第一次创建时,执行的初始化SQL。在第一次创建时用来初始化物理连接的SQL语句集合。这些语句只在配置的连接工厂创建连接时被执行一次。

    lifo

    true

    后进先出。

    • 设置为true表明连接池(如果池中有可用的空闲连接时)将返回最后一次使用的租借对象(最后进入)。
    • 设置为false则表明池将表现为FIFO队列(先进先出),将会按照它们被归还的顺序从空闲连接实例池中获取连接。

    poolPreparedStatements

    false

    设置该连接池的预处理语句池是否生效。

    maxOpenPreparedStatements

    -

    可以在语句池中同时分配的最大语句数。设置为负数则不限制。

    这个设置同时作用于预处理语句池。当一个可用的语句池被创建给每一个连接时,通过以下方法创建的预处理语句将被池化。

    public PreparedStatement prepareStatement(String sql)
    public PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency)
    说明:

    确保连接会留下一些资源给其他语句。池化预处理语句可能会在数据库中保持他们的游标,可能会引起连接的游标越界,尤其是maxOpenPreparedStatements的值被设置为默认值(无限的),且一个应用程序可能会为每个连接打开大量不同的预处理语句。为了避免这个问题,maxOpenPreparedStatements应该被设置为一个小于连接可以打开的最大游标数的值。

    accessToUnderlyingConnectionAllowed

    false

    控制PoolGuard是否可以访问底层连接。

    removeAbandonedOnMaintenance

    removeAbandonedOnBorrow

    false

    标记是否删除超过removeAbandonedTimout所指定时间的被遗弃的连接。

    如果设置为true,则一个连接在超过removeAbandonedTimeout所设定的时间未使用即被认为是应该被抛弃并应该被移除的。

    创建一个语句,预处理语句,可调用语句或使用它们的一个执行查询(使用执行方法中的某一个)会重新设置其父连接的lastUsed属性。

    在写操作较少的应用程序中将该参数设置为true,可以将数据库连接从连接关闭失败中恢复。

    removeAbandonedTimeout

    300

    一个被抛弃连接可以被移除的超时时间,单位:s。

    logAbandoned

    false

    标志是否为应用程序中遗弃语句或连接的代码开启日志堆栈追踪。因为一个堆栈跟踪已被创建,被抛弃的语句和连接相关的日志将被覆盖到打开每个连接或者创建一个Statement。

    abandonedUsageTracking

    false

    废弃使用跟踪。如果为true,则连接池将在每次在池化连接上调用方法时记录堆栈跟踪,并保留最新的堆栈跟踪以帮助调试已放弃的连接。

    说明:

    将其设置为true会增加大量开销,请谨慎操作。

    fastFailValidation

    false

    验证快速失败。如果发生致命的异常,验证语句会快速失败。而不会再执行“isValid()”,也不再去执行验证查询语句。致命的异常(SQL_STATE)指以下:

    • 57P01 (ADMIN SHUTDOWN)
    • 57P02 (CRASH SHUTDOWN)
    • 57P03 (CANNOT CONNECT NOW)
    • 01002 (SQL92 disconnect error)
    • JZ0C0 (Sybase disconnect error)
    • JZ0C1 (Sybase disconnect error)
    • Any SQL_STATE code that starts with “08”

    需要覆盖异常码,请参考disconnectionSqlCodes。

    disconnectionSqlCodes

    -

    异常码。以逗号分割的SQL_STATE码,“fastFailValidation”为“true”时生效。

    jmxName

    -

    以指定的名称将DataSource注册为JMX MBean。该名称必须符合JMX对象名称语法。

    registerConnectionMBean

    true

    注册连接JMX Mbean。

Hikari CP连接池配置

  1. 下载JDBC驱动包,请参见下载JDBC或ODBC驱动

  2. 将JDBC驱动包和HikariCP、slf4j驱动包添加到工程中,配置数据库连接池相关参数。

    表2 Hikari CP连接池参数配置

    参数名

    默认值

    说明

    driverClassName

    填写org.postgresql.Driver

    数据库驱动名称。

    jdbcUrl

    -

    连接数据库的URL。

    username

    -

    用户名。

    password

    -

    密码。

    autoCommit

    true

    连接返回连接池时,是否自动提交事务。

    connectionTimeout

    30000

    从连接池获取连接的最大超时时间。

    idleTimeout

    60000

    空闲连接存活的最大时间。只有当minimumIdle小于maximumPoolSize时,该设置才生效。

    • 空闲连接数大于minimumIdle且连接的空闲状态时间大于idleTimeout值时,将把该连接从连接池中删除。
    • 0表示永不超时。

    keepaliveTime

    0

    保持空闲连接可用的检测频率,单位:ms。0表示不检测。

    maxLifetime

    1800000

    连接存活的最大时间,单位:ms。0表示没有限制。

    connectionTestQuery

    -

    连接检测的查询语句。

    minimumIdle

    10

    最小空闲连接数。为了提高性能,建议不要设置此参数,使连接池为固定大小。

    maximumPoolSize

    10

    最大连接数。

    metricRegistry

    -

    该参数仅通过编程配置或IoC容器可用。

    该参数用于指定池使用的“Codahale/Dropwizard MetricRegistry”实例来记录各种指标。

    healthCheckRegistry

    -

    该参数仅通过编程配置或IoC容器可用。

    该参数用于指定池使用的“Codahale/Dropwizard HealthCheckRegistry”实例来记录健康信息。

    poolName

    -

    连接池名称。

    initializationFailTimeout

    1

    启动连接池时不能成功初始化连接,是否快速失败。

    • 大于0时,会尝试获取连接。如果获取时间超过指定时长(connectionTimeout + initializationFailTimeout),不会开启连接池,并抛出异常。
    • 等于0时,会尝试获取并验证连接。如果获取成功但验证失败则不开启池,但是如果获取失败还是会开启池。
    • 小于0时,直接启动连接池,不进行初始化连接尝试。

    isolateInternalQueries

    false

    是否在事务中隔离HikariCP自己的查询。“autoCommit”为“false”时,该设置生效。

    allowPoolSuspension

    false

    是否允许通过JMX挂起和恢复连接池。挂起时获取连接不会超时,直到连接池恢复。

    readOnly

    false

    连接是否只读。

    registerMbeans

    false

    是否开启JMX。

    catalog

    -

    默认的数据库catalog。

    connectionInitSql

    -

    连接池初始化后执行的SQL。

    transactionIsolation

    -

    默认的事务隔离级别。

    validationTimeout

    5000

    连接检测的超时时间。必须大于connectionTimeout,最小允许的值为250。

    leakDetectionThreshold

    0

    连接可以被借出多久。

    超过该时间将打印连接可能泄露的日志,最小允许的值为2000,单位:ms。

    schema

    -

    默认的数据库schema。

    threadFactory

    -

    指定连接池用于创建线程的 java.util.concurrent.ThreadFactory实例。此参数仅通过编程配置或IoC容器可用。

    scheduledExecutor

    -

    指定连接池用于执行定时任务的java.util.concurrent.ScheduledExecutorService实例。此参数仅通过编程配置或IoC容器可用。

Druid连接池配置

  1. 下载JDBC驱动包,请参见下载JDBC或ODBC驱动

    下载Druid驱动包,下载地址:https://druid.apache.org/downloads/

  2. 将JDBC驱动包和Druid驱动包添加到工程中,配置数据库连接池相关参数。

    表3 Druid连接池参数配置

    参数名

    默认值

    说明

    url

    -

    连接数据库的URL。

    username

    -

    用户名。

    password

    -

    密码。

    driverClassName

    填写org.postgresql.Driver

    数据库驱动名称。

    initialSize

    0

    初始化时建立物理连接的个数。初始化发生在显示调用init方法,或者第一次getConnection时。

    maxActive

    8

    线程池中最大的连接数。

    minIdle

    0

    线程池最小空闲数。Druid会定期扫描连接数情况,如果扫描的值大于该值就关闭多余的连接数,小于就创建符合要求的连接数;这个参数主要应用于突然有大量请求的时候,创建新的连接数,该操作比较耗时。

    connectTimeout

    -

    连接数据库超时时间,单位:ms。

    socketTimeout

    -

    socket连接数据库连接超时时间,单位:ms。

    maxWait

    -1

    连接池中连接用完时,新的请求等待时间,单位:ms。

    -1表示无限等待,直到超时为止。

    poolPreparedStatements

    false

    是否缓存preparedStatement,也就是PSCache。PSCache对支持游标的数据库性能提升较大。

    maxOpenPreparedStatements

    -

    启用PSCache,必须配置大于0。

    当大于0时,poolPreparedStatements自动触发修改为true。

    validationQuery

    SELECT 1

    用来检测连接是否有效的SQL。

    如果validationQuery为空,则testOnBorrow、testOnReturn、testWhileIdle这三个参数都不会起作用,因为这三个参数都是通过执行参数validationQuery指定的SQL来验证数据库连接的有效性。

    testOnBorrow

    -

    申请连接时执行validationQuery检测连接是否有效,这个配置可能会降低性能,请谨慎操作。

    testOnReturn

    -

    归还连接时执行validationQuery检测连接是否有效,这个配置可能会降低性能,请谨慎操作。

    testWhileIdle

    true

    申请连接的时候检测,建议配置为true,不影响性能,并且保证安全性 。如果空闲时间大于timeBetweenEvictionRunMills,执行validationQuery检测连接是否有效都不会起作用。

    timeBetweenEvictionRunsMillis

    60s

    执行validationQuery检测连接是否有效。判断连接池的连接空闲数是否大于minIdle,如果是则关闭多余的连接数,少则会补上(如果当前连接池中某个连接在空闲了timeBetweenEvictionRunsMillis时间后仍然没有使用,则会被物理性关闭掉)。

    有两个含义:

    1. Destroy线程会检测连接的间隔时间。
    2. testWhileIdle的判断依据,详细看testWhileIdle属性的说明。

    minEvictableIdleTimeMillis

    30min

    连接保持空闲而不被驱逐的最长存活时间。Destroy线程中如果检测到当前连接的最后活跃时间和当前时间的差值大于minEvictableIdleTimeMillis,则关闭当前连接。

    说明:

    这个参数和timeBetweenEvictionRunsMillis参数有点冲突,可默认不配置该参数。

    connectionInitSqls

    -

    物理连接初始化的时候执行SQL。

    exceptionSorter

    -

    当数据库抛出一些不可恢复的异常时,抛弃连接。

    filters

    -

    通过别名的方式配置扩展插件,属性类型是字符串。常用的插件有监控统计用的filter:

    • stat:监控统计。
    • log4j:日志记录。
    • wall:防御sql注入。

    proxyFilters

    -

    类型是List<com.alibaba.druid,filter.Filter>,可同时配置filter和proxyFilters,这两个是组合关系。

    removeAbandoned

    false

    如果连接泄露,是否需要回收泄露的连接。

    在getNumActive()快要到getMaxActive()的时候,系统会进行无效的连接回收,回收的连接为removeAbandonedTimeout(默认300秒)中设置的秒数后没有使用的连接; 对于建立时间超过removeAbandonedTimeout的连接强制关闭。

    removeAbandonedTimeout

    300s

    设置Druid强制回收连接的时限,单位:s。当程序从连接池中得到连接开始算起,指定连接建立多长时间druid将强制回收该连接。

    logAbandoned

    false

    如果回收泄露的连接,是否要打印一条log。

    指定发生removeabandoned的时候,是否记录当前线程的堆栈信息到日志中。

    removeAbandonedTimeoutMillis

    5min

    连接回收的超时时间。设置“removeAbandoned”为“true”,Druid会定期检查线程池溢出的情况,如果不是运行状态,且超过设置的时间就会被回收。

    maxEvictableIdleTimeMillis

    7hours

    最大空闲时间,默认为7小时。

    maxPoolPrepareStatementPerConnectionSize

    20

    每个连接最多缓存的SQL数。

    keepAlive

    false

    初始化连接池时会填充到minIdle的数量。

    连接池中的minIdle数量以内的连接,空闲时间超过minEvictableIdleTimeMillis时,则会执行keepAlive操作,打开会一直保持minIdle的数量值。

    notFullTimeoutRetryCount

    0

    连接池内借出的连接加上可用连接小于最大连接数时,则进行重试操作次数,默认为0。

    logSlowSql

    false

    是否打印慢SQL。

  3. Druid连接demo示例。

    resource目录下新建db.properties文件:
    # 数据库连接参数
    url=jdbc:postgresql://10.10.0.13:8000/gaussdb
    username=user
    password=pass
    validationQuery=select 1
    validationQueryTimeout=300
    #driverClassName=com.huawei.gauss200.jdbc.Driver
    driverClassName=org.postgresql.Driver
    # 初始化连接的数量
    initialSize=1
    # 最大连接的数量
    maxActive=20
    #核心线程数,大于该数会释放
    minIdle=10

    示例代码:

    import com.alibaba.druid.pool.DruidDataSource;
    import com.alibaba.druid.pool.DruidDataSourceFactory;
    import com.alibaba.druid.pool.DruidPooledConnection;
    import java.io.IOException;
    import java.io.InputStream;
    import java.sql.ResultSet;
    import java.sql.Statement;
    import java.util.Properties;
    
    public class TestDataSource {
        private static DruidDataSource dataSource;
    
    
        public static void main(String[] args) throws Exception {
            Properties properties = loadProperties();
            dataSource = (DruidDataSource) DruidDataSourceFactory.createDataSource(properties);
            dataSource.setTimeBetweenEvictionRunsMillis(50 * 1000);
            dataSource.setRemoveAbandoned(true);
            dataSource.setRemoveAbandonedTimeout(120);
            dataSource.setSocketTimeout(5000);
            dataSource.setConnectTimeout(5000);
            dataSource.setQueryTimeout(5);
            final DruidPooledConnection connection = dataSource.getConnection();
            final Statement statement = connection.createStatement();
            execute(statement);
        }
        public static void execute(Statement statement) {
            ResultSet resultSet = null;
            try {
                resultSet = statement.executeQuery("select 1");
                while (resultSet.next()) {
                    String str = resultSet.getString(1);
                    System.out.println("n1 :" + str);
                    return;
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        /**
         * 加载配置文件,从配置文件获取参数
         */
        public static Properties loadProperties() {
            InputStream inputStream = TestDataSource.class.getClassLoader().getResourceAsStream("db.properties");
            Properties ps = new Properties();
            try {
                ps.load(inputStream);
            } catch (IOException e) {
                e.printStackTrace();
            }
            return ps;
        }
    }

相关文档