云数据库 GAUSSDB-JDBC

时间:2025-06-11 16:33:29

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接入数据库时,避免拼接多条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。
support.huaweicloud.com/centralized-devg-v2-gaussdb/gaussdb_42_1273.html