
# 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显示的精度不同。
  M-Compatibility模式数据库下，extra_float_digits的默认值为0。
  
- 【规格】JDBC实例必须指定数据库，一旦实例创建，无法切换数据库。
- 【规格】单条SQL语句的长度不允许超过2G字节，业务应考虑通信成本，建议单条SQL语句不超过5K。
- 【规格】目前仅支持对CREATE/ALTER TABLE中列的DEFAULT值进行参数化设置，其他DDL使用Prepare Execute执行方式进行参数设置无效。
- 【规则】JDBC每条PreparedStatement语句中的参数不可超过32767个。
- 【规格】连接参数fetchsize必须要在autocommit关闭情况下使用，否则fetchsize配置无效。
- 【规则】使用默认GUC参数，避免通过JDBC发送SET请求修改GUC参数。 请参见[GUC参数编程规范](https://support.huaweicloud.com/centralized-devg-v3-gaussdb/gaussdb-45-0065.html#ZH-CN_TOPIC_0000002200578246)。
  
- 【建议】必须使用Prepare Execute方式执行查询语句，提高执行效率。
- 【规则】在同一个事务中，应逐条执行SQL语句，避免拼接多条SQL作为一条语句发送。 请参见[【规则】通过JDBC接入数据库时，避免拼接多条SQL为一条语句发送执行](https://support.huaweicloud.com/centralized-devg-v3-gaussdb/gaussdb-45-0122.html#ZH-CN_TOPIC_0000002200418458__zh-cn_topic_0000002200301392_li5319182517362)。
  
- 【规则】JDBC客户端所在主机时区、数据库所在主机时区和数据库配置过程中的时区，三者应保持一致。
- 【规则】如果在连接中创建了临时表，那么在将连接归还给连接池之前，必须将临时表删除，避免业务出错。
- 【建议】对于精度敏感的场景，建议使用numeric类型。
- 【建议】通过JDBC连接数据库时，应该保证以下三个时区设置一致：
  - JDBC客户端所在主机的时区。
  
  - GaussDB数据库实例所在主机的时区。
  
  - GaussDB数据库实例配置过程中时区。
    ![](https://support.huaweicloud.com/centralized-devg-v3-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
    时区设置相关的操作，请联系管理员。
    
   
- 【建议】在JDBC向GaussDB申请连接的代码中，建议显式开启autocommit。如果基于性能或者其它方面考虑，需要关闭autocommit时，需要应用程序保证事务的提交。例如，在指定的业务SQL执行完之后做显式提交，特别是客户端退出之前务必保证所有的事务已经提交。
- 【建议】推荐使用连接池限制应用程序的连接数。不建议每执行一条SQL就连接一次数据库。
- 【建议】在应用程序完成作业任务之后，应当及时断开和GaussDB的连接，释放资源。建议在任务中设置session超时时间参数。
- 【建议】使用JDBC连接池，在将连接释放给连接池前，需要执行以下操作，重置会话环境。否则，可能会因为历史会话信息导致对象冲突。
  - 如果在连接中设置了GUC参数，那么在将连接归还连接池之前，必须使用"SET SESSION AUTHORIZATION DEFAULT;RESET ALL;"将连接的状态清空。
  
  - 如果使用了临时表，那么在将连接归还连接池之前，必须将临时表删除。
   
- 【建议】在不使用ETL工具，数据入库实时性要求比较高的情况下，建议在开发应用程序时，使用GaussDB JDBC驱动的CopyManger接口进行微批导入。
- 【建议】合理设置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。
   
 
