本文介绍 JDBC 连接池配置示例。
在使用 JDBC 进行数据库连接的时候,需要配置相关参数来获得数据库使用的最佳性能。这里推荐一些相关参数的配置。
JDBC 连接示例如下:
conn=jdbc:oceanbase://xxx.xxx.xxx.xxx:1521?rewriteBatchedStatements=TRUE&allowMultiQueries=TRUE&useLocalSessionState=TRUE&useUnicode=TRUE&characterEncoding=utf-8&socketTimeout=3000000&connectTimeout=60000
在此连接中,涉及到的配置参数如下:
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
,会自动连带设置useServerPrepStms=TRUE
。useServerPrepStms
:控制是否使用 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
对使用useServerPrepStms=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 将会被拆分。