云数据库 GAUSSDB-JDBC
JDBC
- 【规格】JDBC实例必须指定数据库,一旦实例创建,无法切换数据库。
- 【规格】单条SQL语句的长度不允许超过2G字节,业务应考虑通信成本,建议单条SQL语句不超过5K。
- 【规格】目前仅支持对CREATE/ALTER TABLE中列的DEFAULT值进行参数化设置,其他DDL使用Prepare Execute执行方式进行参数设置无效。
- 【规则】JDBC每条PreparedStatement语句中的参数不可超过32767个。
- 【规格】连接参数fetchsize必须要在autocommit关闭情况下使用,否则fetchsize配置无效。
- 【规则】使用默认GUC参数,避免通过JDBC发送SET请求修改GUC参数。参考GUC参数编程规范。
- 【建议】必须使用Prepare Execute方式执行查询语句,提高执行效率。
- 【规则】在同一个事务中,应逐条执行SQL语句,避免拼接多条SQL作为一条语句发送。
- 【规则】JDBC客户端所在主机时区、数据库所在主机时区和数据库配置过程中的时区,三者应保持一致。
- 【规则】如果在连接中创建了临时表,那么在将连接归还给连接池之前,必须将临时表删除,避免业务出错。
- 【关注】第三方工具通过JDBC连接 GaussDB 时,JDBC向GaussDB发起连接请求,会默认添加以下配置参数,详见JDBC代码ConnectionFactoryImpl类的实现。
params = { { "user", user }, { "database", database }, { "client_encoding", "UTF8" }, { "DateStyle", "ISO" }, { "extra_float_digits", "3" }, { "TimeZone", createPostgresTimeZone() }, };
这些参数可能会导致JDBC客户端的行为与gsql客户端的行为不一致,例如,Date数据显示方式、浮点数精度表示、timezone显示。
如果实际期望和这些配置不符,建议在java连接设置代码中显式设定这些参数。
通过JDBC连接数据库时,会设置extra_float_digits=3,gsql中设置为extra_float_digits=0,可能会使同一条数据在JDBC显示和gsql显示的精度不同。
对于精度敏感的场景,建议使用numeric类型。
- 【建议】通过JDBC连接数据库时,应该保证下面三个时区设置一致:
- JDBC客户端所在主机的时区。
- GaussDB数据库实例所在主机的时区。
- GaussDB数据库实例配置过程中时区。
时区设置相关的操作,请联系管理员。
- 【建议】在JDBC向GaussDB申请连接的代码中,建议显式开启autocommit。如果基于性能或者其它方面考虑,需要关闭autocommit时,需要应用程序保证事务的提交。例如,在指定的业务SQL执行完之后做显式提交,特别是客户端退出之前务必保证所有的事务已经提交。
- 【建议】推荐使用连接池限制应用程序的连接数。不建议每执行一条SQL就连接一次数据库。
- 【建议】在应用程序完成作业任务之后,应当及时断开和GaussDB的连接,释放资源。建议在任务中设置session超时时间参数。
- 【建议】使用JDBC连接池,在将连接释放给连接池前,需要执行以下操作,重置会话环境。否则,可能会因为历史会话信息导致对象冲突。
- 如果在连接中设置了GUC参数,那么在将连接归还连接池之前,必须使用“SET SESSION AUTHORIZATION DEFAULT;RESET ALL;”将连接的状态清空。
- 如果使用了临时表,那么在将连接归还连接池之前,必须将临时表删除。
- 【建议】在不使用ETL工具,数据入库实时性要求比较高的情况下,建议在开发应用程序时,使用GaussDB JDBC驱动的CopyManager接口进行微批导入。
- 【建议】合理设置prepareThreshold,如果query语句十分固定,建议设置为1。
- 【建议】建议设置连接参数batchMode=on,使用batch模式连接,提高执行性能。
- 【建议】应根据业务上层请求超时时间合理设置JDBC连接超时时间,避免作业完成或超长作业持续占用数据库资源。
超时参数包括loginTimeout、connectTimeout、socketTimeout等。
- loginTimeout:Integer类型。指建立数据库连接的等待时间。超时时间单位为秒。默认值为0,表示已禁用,timeout不发生。
- connectTimeout:Integer类型。用于连接服务器操作的超时值。如果连接到服务器花费的时间超过此值,则连接断开。超时时间单位为秒,默认值为0,表示已禁用,timeout不发生。
- socketTimeout:Integer类型。用于socket读取操作的超时值。如果从服务器读取所花费的时间超过此值,则连接关闭。超时时间单位为秒,默认值为0,表示已禁用,timeout不发生。
- cancelSignalTimeout:Integer类型。发送取消消息本身可能会阻塞,此属性控制用于取消命令的“connect超时”和“socket超时”。超时时间单位为秒,默认值为10秒。
- tcpKeepAlive:Boolean类型。启用或禁用TCP保活探测功能。默认值为false。