跳到主要内容

数据库连接池配置

数据库连接池配置是确保系统与数据库高效、稳定连接的重要步骤。合理的连接池设置不仅可以有效管理数据库连接数量,避免由于高并发导致的连接耗尽问题,还可以通过合理的超时设置,及时清理无效连接,确保系统性能。

本文将介绍连接池的基本概念、不同连接池的比较、选择指南、连接池参数的建议设置以及 JDBC 配置的重要参数,以帮助开发者优化数据库访问。

连接池基本概念

数据库连接池是一种用于管理数据库连接的技术,它可以在应用程序和数据库之间建立一个连接池,预先创建一定数量的数据库连接,并将这些连接保存在内存中。当应用程序需要访问数据库时,可以直接从连接池中获取一个连接,使用完毕后将连接归还给连接池,而不是每次都创建新的连接。

连接池的主要优势包括:

  • 提高性能:避免频繁创建和销毁连接的开销。
  • 资源管理:控制数据库连接的数量,防止连接耗尽。
  • 连接复用:提高连接的利用率,减少资源浪费。
  • 连接监控:提供连接状态监控和统计信息。

连接池参数

连接池通常包含以下核心参数:

  • 初始连接数:连接池初始化时创建的连接数量。
  • 最小连接数:连接池中保持的最小连接数量。
  • 最大连接数:连接池中允许的最大连接数量。
  • 连接超时时间:获取连接的最大等待时间。
  • 空闲超时时间:连接在池中空闲的最大时间,超过此时间将被回收。
  • 检测间隔:检查空闲连接的间隔时间。
  • 检测查询:用于检测连接是否有效的 SQL 查询。

连接池设置建议

  • 管控台日常 min 保持两个连接即可,具体根据业务并发及事务时间来调整。

  • 设置连接空闲超时时间,推荐 30 分钟。

    MySQL 默认 8 小时连接主动断开,客户端无法感知,导致存在脏连接。连接池可以通过心跳、testOnBorrow 等机制来校验连接是否存活,当超过这个时间连接没有使用直接断开。

JDBC 配置参数

JDBC 是 Java 数据库连接的接口,OceanBase 提供了 JDBC 驱动,支持 Java 应用连接 seekdb。JDBC 驱动的下载地址为:OceanBase JDBC 驱动程序

JDBC 重要的几个参数,一定需要设置。均可以设置到连接池的 ConnectionProperties 中,或者 JdbcUrl 上。具体参数及其说明如下表所示。

参数说明
socketTimeout定义了网络 Socket 超时,以毫秒为单位。值为 0 时,表示没有超时限制。也可以通过设置系统变量 max_statement_time 来限制查询时间。默认值:0(标准配置)。
connectTimeout连接超时值,以毫秒为单位。值为 0 时,表示没有超时限制。默认值:30000。

JDBC 配置示例

本文介绍 JDBC 配置示例。

在使用 JDBC 进行数据库连接的时候,需要配置相关参数来获得数据库使用的最佳性能。这里推荐一些相关参数的配置。

JDBC 连接示例如下:

conn=jdbc:oceanbase://xxx.xxx.xxx.xxx:2881/test?rewriteBatchedStatements=TRUE&allowMultiQueries=TRUE&useLocalSessionState=TRUE&useUnicode=TRUE&characterEncoding=utf-8&socketTimeout=10000&connectTimeout=30000

在此连接中,涉及到的配置参数如下:

  • rewriteBatchedStatements:建议设置为 TRUE。

    • OceanBase 的 JDBC 驱动在默认情况下会无视 executeBatch() 语句,把批量执行的一组 SQL 语句拆散,一条一条地发给数据库,此时批量插入实际上是单条插入,直接造成较低的性能。要想实际执行批量插入,需要将该参数置为 TRUE, 驱动才会批量执行 SQL。即使用 addBatch 方法把同一张表上的多条 insert 语句合在一起,做成一条 insert 语句里的多个 values 值的形式,提高 batch insert 的性能。

    • 必须使用 prepareStatement 方式来把每条 insert 做 prepare,然后再 addBatch,否则不能合并执行。

  • allowMultiQueries:建议设置为 TRUE。

    JDBC 驱动允许应用代码把多个 SQL 用分号(;)拼接在一起,作为一个 SQL 发给 server 端。

  • useLocalSessionState:建议设置为 TRUE,避免交易频繁向 OB 数据库发送 session 变量查询 SQL。

    session变量主要为:autocommit,read_only 和 transaction isolation。

  • socketTimeout:执行 SQL 时,socket 等待 SQL 返回的时间。

  • connectTimeout:建立连接时,等待连接的时间。

  • useCursorFetch:建议设置为 TRUE

    对于大数据量的查询语句,数据库 Server 会建立 Cursor 并根据 FetchSize 的大小向 Client 分发数据。这个属性设为 TRUE,会自动连带设置 useServerPrepStmts=TRUE

  • useServerPrepStmts:控制是否使用 PS 协议来把 SQL 发送给数据库 server。

    设置为 TRUE 时,SQL 在数据库内会分为两步执行:

    • 把包含 的 SQL 文本发送到数据库 Server 做 Prepare(SQL_audit: request_type=5);

    • 用真实 Value 在数据库内做 Execute(SQL_audit: request_type=6)。

  • cachePrepStmts:控制 JDBC driver 是否开启 PS cache 来缓存 PreparedStatment,避免重复执行 prepare(client 端和 server 端)。cachePrepStmts=TRUE 对使用 useServerPrepStmts=TRUE 并重复对同一条 SQL 做 batch execute 的场景有帮助。每一次 batch excecute 都会包含 preare 和 executecachePrepStmts=TRUE 可以避免重复的 prepare 操作。

  • prepStmtCacheSQLLimit:可以放入 PS cache 的 SQL 的长度限制,超长 SQL 不可放入缓存。prepStmtCacheSize:PS cache 可以保存的SQL数量。

  • maxBatchTotalParamsNum:针对 batch 操作,一条 SQL 最多能支持多少个参数(即 batch 中 ? 的个数)。如果参数个数大于限制,batch SQL 将会被拆分。