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

示例:不同场景下连接数据库参数配置

以下示例场景中node代表“host:port”,host为数据库服务器名称或IP地址,port为数据库服务器端口。

容灾场景

某客户有两套数据库集群,其中A集群为生产集群,B集群为容灾集群。当客户执行容灾切换时,A集群将降为容灾集群,B集群将升为生产集群。此时为了避免修改配置文件导致的应用重启或重新发版,客户可在初始配置文件时,即将A、B集群写入连接串中。此时在主集群不可连接时,驱动将尝试对容灾集群建连。例如A集群为{node1,node2,node3}。B集群为{node4,node5,node6}。

以Dorado双集群为例,url可参考如下配置进行设置,当主备切换后只会连接新的主集群。
jdbc:postgresql://node1,node2,node3,node4,node5,node6/database

负载均衡场景

某客户存在一套数据库集群,包含如下节点{node1,node2,node3,node4,node5,node6,node7,node8,node9,node10,node11,node12}。

  1. 客户在应用程序A中建立了120个长连接,并期望应用程序A上的连接可以均匀分布在当前集群各节点上,则url可参考如下配置。
    jdbc:postgresql://node1,node2,node3/database?autoBalance=true
  2. 客户新开发了两个应用程序B、C,希望当前这三个应用程序均匀分布在指定节点,如应用程序A的连接分布在{node1,node2,node3,node4};应用程序B的连接分布在{node5,node6,node7,node8};应用程序C的连接分布在{node9,node10,node11,node12};则url可参考如下配置。

    应用程序A:jdbc:postgresql://node1,node2,node3,node4,node5/database?autoBalance=priority4

    应用程序B:jdbc:postgresql://node5,node6,node7,node8,node9/database?autoBalance=priority4

    应用程序C:jdbc:postgresql://node9,node10,node11,node12,node1/database?autoBalance=priority4

  3. 客户开发了一些应用程序,并且使用相同的连接配置串,同时期望各应用连接能较均匀的分布在集群各节点上,则url可参考如下配置。
    jdbc:postgresql://node1,node2,node3,node4/database?autoBalance=shuffle
  4. 客户不想要使用负载均衡功能,则url可参考如下配置。
    jdbc:postgresql://node1/database

    或:

    jdbc:postgresql://node1/database?autoBalance=false

    在开启autoBalance参数时,JDBC刷新可用CN列表的周期默认为10S,可使用refreshCNIpListTime进行设置,示例如下:

    jdbc:postgresql://node1,node2,node3,node4/database?autoBalance=true&refreshCNIpListTime=3

日志诊断场景

某客户在使用为定位问题,可通过开启trace日志进行诊断,url可参考如下配置。

jdbc:postgresql://node1/database?loggerLevel=trace

大小写转换场景

在GaussDB中元数据默认存储为小写,所以在从默认存储为大写的数据库迁移到GaussDB后,原本大写的元数据会变为小写。如果原本业务中涉及到大写元数据的处理,可以开启此参数,但是不建议通过这种方式来解决问题,建议通过修改业务编码来解决。如果一定要使用,请务必确认当前数据库中的元数据是否全为小写,以避免出现问题。

jdbc:postgresql://node1,node2,node3/database?uppercaseAttributeName=true

对于DatabaseMetaData中涉及的接口,按照入参直接调用即可,对于ResultSetMetaData中涉及的接口使用方法如下所示:

Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("select * from test_supper");
ResultSetMetaData rsmd = rs.getMetaData();
for (int i = 1; i <= rsmd.getColumnCount(); i++) {
    System.out.println(rsmd.getColumnLabel(i) + "   " + rsmd.getColumnName(i));
}

高性能场景

某客户对于相同sql可能多次执行,仅是传参不同,为了提升执行效率,可开启prepareThreshold参数,避免重复生成执行计划,url可参考如下配置。

jdbc:postgresql://node1/database?prepareThreshold=5

某客户一次查询1000万数据,为避免同时返回造成内存溢出,可使用defaultRowFetchSize,url可参考如下配置。

jdbc:postgresql://node1/database?defaultRowFetchSize=50000

某客户需要批量插入1000万数据,为提升效率,可使用batchMode,url可参考如下配置。

jdbc:postgresql://node1/database?batchMode=on

相关文档