更新时间:2024-11-07 GMT+08:00
分享

JDBC常用参数参考

targetServerType

原理:值为master时会依次尝试连接串中配置的IP,直到能够连接到集群中的主机。

值为slave时会依次尝试连接串中配置的IP,直到能够连接到集群中的备机(查询语句为:select local_role, db_state from pg_stat_get_stream_replications();)。

建议:有写操作的业务建议配置master,以保证主备切换后能正常连接主机,但是要注意在主备倒换过程中备机没有完全升主的时候无法正常建连,导致业务语句无法正常执行。

hostRecheckSeconds

原理:JDBC内部存储的DN列表保持可信的时间,未超过此时间时会从中直接读取存储的主机地址,当超过此时间时或者在可信时间内连接主机失败时会通过更新DN列表中该节点状态,之后连接其他的IP。

建议:默认值10s,建议根据业务进行调整,配合参数targetServerType使用。

allowReadOnly

原理:是否允许调用setReadOnly()方法来修改事务访问模式。如果allowReadOnly为true,则允许调用setReadOnly()方法来修改,JDBC会下发SET SESSION CHARACTERISTICS AS TRANSACTION READ ONLY / READ WRITE给数据库,此时可以调用isReadOnly()方法来查看是只读或读写。如果allowReadOnly为false,则调用setReadOnly()方法将无法修改事务访问模式。

建议:保持默认值为true。

fetchsize

原理fetchsize在设置为n时,数据库服务器端在执行查询后,调用者在执行resultset.next()的时候,JDBC会先与服务器端进行通信,取n条数据到JDBC的客户端中,然后返回第一条给调用者。当调用者取到第n+1条数据的时候,会再次到数据库服务端取数据。

作用避免了数据库同时把所有结果全部传输到客户端,导致客户端的内存资源不足。

建议:建议根据自身的业务查询数据数量和客户端机器内存情况来配置此参数,设置fetchsize时要关闭自动提交(autocommit=false),否则会导致fetchsize无法生效。

defaultRowFetchSize

作用:fetchsize默认值为0,defaultRowFetchSize会修改fetchsize的默认值。

batchMode

作用:用于确定是否使用batch模式连接。默认值为on,开启后可以提升批量更新的性能,同时批量更新的返回值会发生改变。例如,批量插入三条数据,在开启时返回值为[3,0,0],在关闭后返回值为[1,1,1]。

建议:如果本身业务框架(例如hibernate)在批量更新时会检测返回值,可以通过调整此参数来解决。

loginTimeout

作用:控制与数据库建连时间,其中时间包括connectTimeout和socketTimeout,超过阈值则退出。计算方式为:loginTimeout=connectTimeout*节点数量+连接认证时间+初始化语句执行时间。

建议:配置后每次建连都会开启一个异步线程,在连接数较多的情况可能会导致客户端压力增大,如果业务确认需要设置此参数,需要注意在集中式下建议调整为n*connectTimeout(n为节点数量),防止在网络异常情况且第n个IP为主的情况下无法连接,缺省值为0。

  • 此参数设置后对于多IP而言,时间是尝试连接IP的时间,可能会出现因为设置的值较小导致后面的IP无法连接的问题,例如设置了三个IP,如果loginTimeout为5s,但前两个IP建连总共用了5s,第三个IP会无法进行连接。在集中式环境下,若此最后一个IP恰好为主机,可能会导致自动寻主失败。
  • 当CPU、内存、I/O负载中的任意一项接近100%时,会出现连接慢的现象,可能会导致连接时间超过阈值的问题,可通过以下方式进行问题排查:
    1. 登录连接慢的物理机或通过管理工具查询资源负载:可通过top命令等确认CPU使用率;通过free命令确认内存使用情况;通过iostat命令确认I/O负载;此外还可以通过cm_agent中的监控日志,以及数据库运维平台中的监测记录进行检查。
    2. 针对短时间内大量慢查询导致的峰值负载场景,可通过[数据库服务器的端口号+1]端口连接,查询pg_stat_activity视图;针对慢查询,可以使用系统函数pg_terminate_backend(pid...进行查杀会话。
    3. 针对业务量长期超负载情况(即无明显慢查询,或慢查询查杀后但新的查询依然会变成慢查询),应考虑降低业务负载、增加数据库资源的方式进行优化。

cancelSignalTimeout

作用:发送取消消息本身可能会阻塞,此属性控制用于取消命令的“connect超时”和“socket超时”。超时时间单位为秒。主要为了防止连接超时取消时本身执行超时检测。

建议:默认值为10秒,建议根据业务进行调整。

connectTimeout

作用:控制建立连接时套接字超时阈值(此时是JDBC通过socket连接到数据的时间,并不是返回connection对象的时间),超过阈值查找下一个IP。

建议:该参数决定了每个节点TCP连接建立的最大超时时间,如果某节点网络故障,与该节点建立连接时会等待connectTimeout超时,然后尝试连接下一个节点。考虑到网络抖动,时延等情况,建议设置为3s。

socketTimeout

作用:控制套接字操作超时阈值,如果业务语句执行或者从网络读取数据流超过此阈值,连接中断(即语句超过规定时间执行,没有数据返回的时候)。

建议:该参数限制单条SQL最长的执行时间,单语句执行超过该值则会超时报错退出,建议根据业务特征进行配置,如果未配置,默认为0,即不会超时。如果不配置该参数,在数据库进程异常情况下,会导致客户端出现长时间等待,建议根据业务可以接受的SQL执行时间进行配置。

socketTimeoutInConnecting

作用:控制建连阶段套接字操作超时值,在建连阶段,如果从网络中读取数据流超过此阈值,则尝试查找下一个节点建连。

建议:该参数仅影响建连阶段的socket超时时间,如果未配置,默认为5s。

autosave

作用:值为always时,可以在事务中每个语句前面设置一个savepoint点,在事务中语句执行报错时会返回到最近的上一个savepoint点,让事务中后续语句正常执行,最终正常提交。值为conservative时,每次查询都会设置保存点,但是只会在“statement XXX无效”等情况下回滚并重试。值为never时无保存点。

建议:不建议设置此参数,性能劣化严重。

currentSchema

作用:设置当前连接的Schema,如果未设置,则默认Schema为连接使用的用户名。

建议:建议配置此参数,业务数据所在的Schema。如果Schema名包含除字母、数字、下划线之外的特殊字符,建议在Schema名上加引号,注意加引号后Schema名大小写敏感。如需配置多个Schema,要用“,”进行分隔,包含特殊字符的Schema也需要加引号处理。

prepareThreshold

作用:默认值为5,如果一个会话连续多次执行同一个SQL,在达到prepareThreshold次数以上时,JDBC将不再对这个SQL发送parse命令,会将其缓存起来,提升执行速度。

建议:默认值为5,根据业务需要进行调整。

preparedStatementCacheQueries

作用:确定每个连接中缓存的查询数,默认情况下是256。若在prepareStatement()调用中使用超过256个不同的查询,则最近最少使用的查询缓存将被丢弃。

建议:默认值为256,根据业务需要进行调整。配合prepareThreshold使用。

blobMode

作用:setBinaryStream方法为不同类型的数据赋值,设置为on时表示为blob类型数据赋值,设置为off时表示为bytea类型数据赋值,默认为on。例如在preparestatement和callablestatement对象中对参数进行赋值操作。

建议:默认值为on。

setAutocommit方法

作用:值为true时,执行每个语句都会自动开启事务,在执行结束后自动提交事务,即每个语句都是一个事务。值为false时,会自动开启一个事务,事务需要通过执行SQL手动提交。

建议:根据业务特征进行调整,如果基于性能或者其它方面考虑,需要关闭autocommit时,需要应用程序自己来保证事务的提交。例如,在指定的业务SQL执行完之后做显式提交,特别是客户端退出之前务必保证所有的事务已经提交。

相关文档