不同场景下配置连接参数
以下示例场景中node代表“host:port”,host为数据库服务器名称或IP地址,port为数据库服务器端口。
容灾场景
某客户有两套数据库实例,其中A数据库实例为生产数据库实例,B数据库实例为容灾数据库实例。当客户执行容灾切换时,A数据库实例将降为容灾数据库实例,B数据库实例将升为生产数据库实例。此时为了避免修改配置文件导致的应用重启或重新发版,客户可在初始配置文件时,即将A、B数据库实例写入连接串中。此时在主数据库实例不可连接时,驱动将尝试对容灾数据库实例建立连接。例如A数据库实例为{node1,node2,node3}。B数据库实例为{node4,node5,node6}。(对于基于流式复制的主数据库实例连接多层级多个灾备数据库实例的异地容灾解决方案,当前仍只能配置两个数据库实例的信息,即{node1,node2,node3}为A数据库实例,其余为B数据库实例。)
jdbc:gaussdb://node1,node2,node3,node4,node5,node6/database?priorityServers=3
jdbc:gaussdb://node1,node2,node3,node4,node5,node6/database?priorityServers=3&targetServerType=master
jdbc:gaussdb://node1,node2,node3/database?targetServerType=master jdbc:gaussdb://node4,node5,node6/database?targetServerType=master
基于流式复制的异地容灾场景使用容灾读业务推荐方案:
主数据库实例的url可参考如下命令进行配置:
jdbc:gaussdb://node1,node2,node3/database?targetServerType=master
灾备数据库实例的url可参考如下命令进行配置:
jdbc:gaussdb://node4,node5,node6/database?targetServerType=master
主数据库实例和灾备数据库实例应各配置一套读写业务与只读业务。读写应用A(A城)、只读应用B(A城)和只读应用B(B城)正常启用,读写应用A(B城)关闭业务流量。请参见图1。
当switchover发生时,数据库与应用分别进行容灾切换,读写应用A(A城)需先关闭业务流量,数据库switchover成功后,读写应用A(B城)、只读应用B(B城)和只读应用B(A城)正常启用。请参见图2。
当failover场景发生时,A城数据库实例不可用,需先将读写应用A(A城)和只读应用B(A城)关闭业务流量以防止数据不一致问题,B城数据库实例再执行升主failover操作。当B城集群Normal后,读写应用A(B城)和只读应用B(B城)正常启用,读写应用A(A城)和只读应用B(A城)关闭业务流量。请参见图3。
负载均衡场景
某客户存在一套集中式数据库实例,包含1主2备三个节点{node1,node2,node3},其中node1为主节点,node2、node3为备节点。
jdbc:gaussdb://node1,node2,node3/database?loadBalanceHosts=true
loadBalanceHosts配置为true时,若连接建立在备DN上,将无法执行写操作。如果业务需要执行写操作,请勿将该参数配置为true。
自动寻主场景
某客户存在一套集中式数据库实例,包含1主2备三个节点{node1,node2,node3},其中node1为主节点,node2、node3为备节点。
jdbc:gaussdb://node1,node2,node3/database?targetServerType=master
以arm64架构、EulerOS 2.0SP10操作系统、4.19.90-vhulk2211.3.0.h1579内核版本为例,在集中式多节点部署场景下,客户端与服务端运行在同一个物理机中。当部分节点不可用且连接串中可用节点位于末尾,在首次建立连接并完成主机状态记录后,后续2000次连接的平均耗时在50ms以内。
日志诊断场景
某客户在使用中出现数据导入慢或出现一些难以分析的异常报错时,可通过开启trace日志进行诊断,url可参考如下命令进行配置:
jdbc:gaussdb://node1/database?loggerLevel=trace
高性能场景
某客户对于相同SQL可能多次执行,仅是输入参数不同的情况,为了提升执行效率,可配置prepareThreshold参数,避免重复生成执行计划,url可参考如下命令进行配置:
jdbc:gaussdb://node1/database?prepareThreshold=5
某客户一次查询1000万行数据,为避免同时返回造成内存溢出,可使用defaultRowFetchSize,url可参考如下命令进行配置:
jdbc:gaussdb://node1/database?defaultRowFetchSize=50000
某客户需要批量插入1000万行数据,为提升效率,可使用batchMode,url可参考如下命令进行配置:
jdbc:gaussdb://node1/database?batchMode=on
大小写转换场景
在GaussDB中元数据默认存储为小写,如果从元数据默认存储为大写的数据库迁移至GaussDB,大写的元数据会变为小写。如果原业务中涉及到大写元数据的处理,可以开启uppercaseAttributeName参数,但是不建议通过这种方式来解决问题,建议通过修改业务代码来解决。如果一定要使用,请务必确认当前数据库中的元数据是否全为小写,以避免出现问题。url可参考如下命令进行配置:
jdbc:gaussdb://node1/database?uppercaseAttributeName=true
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));
}


