更新时间:2024-08-20 GMT+08:00

连接数据库

在创建数据库连接之后,才能使用它来执行SQL语句操作数据。

函数原型

JDBC提供了三个方法,用于创建数据库连接。
  • DriverManager.getConnection(String url)。
  • DriverManager.getConnection(String url, Properties info)。
  • DriverManager.getConnection(String url, String user, String password)。

参数

表1 数据库连接参数

参数

描述

url

gaussdbjdbc.jar数据库连接描述符。

host为服务器名称或IPv4时,格式如下:

  • jdbc:gaussdb:(数据库名称缺省则与用户名一致)
  • jdbc:gaussdb:database
  • jdbc:gaussdb://host/database
  • jdbc:gaussdb://host:port/database
  • jdbc:gaussdb://host:port/database?param1=value1&param2=value2
  • jdbc:gaussdb://host1:port1,host2:port2/database?param1=value1&param2=value2

host为IPv6时,格式如下:

  • jdbc:gaussdb:(数据库名称缺省则与用户名一致)
  • jdbc:gaussdb:database
  • jdbc:gaussdb://host/database 或 jdbc:gaussdb://[host]/database
  • jdbc:gaussdb://[host]:port/database
  • jdbc:gaussdb://[host]:port/database?param1=value1&param2=value2
  • jdbc:gaussdb://[host1]:port1,[host2]:port2/database?param1=value1&param2=value2
说明:
  • database为要连接的数据库名称。
  • host为数据库服务器名称或IP地址,同时支持IPv4和IPv6。

    由于安全原因,数据库主节点禁止数据库内部其他节点无认证接入。如果要在数据库内部访问数据库主节点,请将JDBC程序部署在数据库主节点所在机器,host使用“127.0.0.1”。否则可能会出现“FATAL: Forbid remote connection with trust method!”错误。

    建议业务系统单独部署在数据库外部,否则可能会影响数据库运行性能。

    缺省情况下,连接服务器为localhost。

  • port为数据库服务器端口。

    缺省情况下,会尝试连接到5432端口的database。

  • 当host为IPv6且在url中指定port时,需要通过“[]”分隔IP,如:[IP]:port。
  • param为参数名称,即数据库连接属性。

    参数可以配置在URL中,以“?”开始配置,以“=”给参数赋值,以“&”作为不同参数的间隔。也可以采用info对象的属性方式进行配置,详情见示例

  • value为参数值,即数据库连接属性值。
  • 连接时需配置connectTimeout、socketTimeout,如果未配置,默认为0,即不会超时。在DN与客户端出现网络故障时,客户端一直未收到DN侧ACK确认报文,会启动超时重传机制,不断的进行重传。当超时时间达到系统默认的600s后才会报超时错误,这会导致RTO时间很高。
  • 建议使用JDBC标准接口建立连接时,确保url格式的合法性,不合法的url会导致异常,且异常中包含原始url字符串,可能造成敏感信息泄漏。

info

数据库连接属性(所有属性大小写敏感)。常用的属性如下:

  • PGDBNAME:String类型。表示数据库名称(URL中无需配置该参数,自动从URL中解析)。
  • PGHOST:String类型。主机IP地址,同时支持IPv4和IPv6。详情见示例
  • PGPORT:Integer类型。主机端口号。详情见示例
  • user:String类型。表示创建连接的数据库用户。
  • password:String类型。表示数据库用户的密码。
  • enable_ce:String类型。其中enable_ce=1表示JDBC支持密态等值查询基本能力,enable_ce=3表示在密态等值查询能力的基础上支持内存解密逃生通道。
  • key_info:String类型。与enable_ce一起使用,在密态数据库中,用于设置访问外部密钥管理者的参数。
  • refreshClientEncryption:String类型。缺省值为NULL。refreshClientEncryption=1表示密态数据库支持客户端缓存刷新(默认值为1)。
  • loggerLevel:String类型。缺省值为NULL,不启用。目前支持4种级别:OFF、INFO、DEBUG、TRACE。设置为OFF关闭日志。设置为INFO、DEBUG和TRACE记录的日志信息详细程度不同。
  • loggerFile:String类型。用于指定日志输出路径(目录和文件名)。需要明确指定日志目录和文件名,若未指定目录则会在客户端运行程序目录下生成日志文件。此参数已废弃,不再生效,仅在开启连接监控功能时用于指定输出监控日志路径,如需将JDBC日志输出到指定路径,可通过 java.util.logging 属性文件或系统属性进行配置。
  • logger:String类型。表示JDBC Driver要使用的日志输出框架。JDBC Driver支持对接用户应用程序使用的日志输出框架。目前支持的第三方日志输出框架只有基于Slf4j-API的日志框架。具体使用方式,请参见日志管理。如果缺省或设置为JDK LOGGER,则JDBC Driver使用JDK LOGGER。否则必须设置采用基于slf4j-API 第三方日志框架。
  • allowEncodingChanges:Boolean类型。缺省值为false。设置该参数值为true进行字符集类型更改,配合参数characterEncoding设置字符集,二者使用“&”分隔。characterEncoding取值范围为UTF8、GBK、LATIN1、GB18030、GB18030_2022、ZHS16GBK。例:allowEncodingChanges=true&characterEncoding=UTF8。
  • currentSchema:String类型。在search-path中指定要设置的schema。如果schema名包含除字母、数字、下划线之外的特殊字符,建议在schema名上加引号,注意schema名大小写敏感。如需配置多个schema,要用逗号(,)进行分隔,包含特殊字符的schema也需要加引号处理。

    例如:currentSchema=schema_a、"schema-b"、"schema/c"。

  • hostRecheckSeconds:Integer类型。JDBC尝试连接主机后会保存主机状态:连接成功或连接失败。在hostRecheckSeconds时间内保持可信,超过则状态失效。缺省值是10秒。
  • ssl:Boolean类型。以SSL方式连接。

    ssl=true可支持NonValidatingFactory通道和使用证书的方式:

    1、NonValidatingFactory通道需要配置用户名和密码,同时将SSL设置为true。

    2、配置客户端证书、密钥、根证书,将SSL设置为true。

  • sslmode:String类型。SSL认证方式。取值范围为:disable、allow、prefer、require、verify-ca、verify-full。
    • disable:不使用SSL安全连接。
    • allow:如果数据库服务器要求使用,则可以使用SSL安全加密连接,但不验证数据库服务器的真实性。
    • prefer:如果数据库支持,那么首选使用SSL连接,但不验证数据库服务器的真实性。
    • require只尝试SSL连接,如果存在CA文件,则应设置成verify-ca的方式验证。
    • verify-ca只尝试SSL连接,并且验证服务器是否具有由可信任的证书机构签发的证书。
    • verify-full只尝试SSL连接,并且验证服务器是否具有由可信任的证书机构签发的证书,以及验证服务器主机名是否与证书中的一致。
  • sslcert:String类型。提供证书文件的完整路径。客户端和服务端证书的类型为End Entity。
  • sslkey:String类型。提供密钥文件的完整路径。使用时将客户端证书转换为DER格式。
    openssl pkcs8 -topk8 -outform DER -in client.key -out client.key.pk8 -nocrypt
  • sslrootcert:String类型。SSL根证书的文件名。根证书的类型为CA。
  • sslpassword:String类型。提供给ConsoleCallbackHandler使用。
  • sslpasswordcallback:String类型。SSL密码提供者的类名。缺省值:com.huawei.gaussdb.jdbc.ssl.jdbc4.LibPQFactory.ConsoleCallbackHandler。
  • sslfactory:String类型。提供的值是SSLSocketFactory在建立SSL连接时用的类名。
  • sslprivatekeyfactory: String类型。提供的值是实现私钥解密方法的接口com.huawei.gaussdb.jdbc.ssl.PrivateKeyFactory的实现类的完整限定类名。如果不提供,首先尝试默认的jdk私钥解密算法,如果无法解密,则使用com.huawei.gaussdb.jdbc.ssl.BouncyCastlePrivateKeyFactory,用户需要提供bcpkix-jdk15on.jar包,版本建议:1.65以上。
  • sslfactoryarg:String类型。此值是sslfactory类的构造函数的可选参数(不推荐使用)。
  • sslhostnameverifier:String类型。主机名验证程序的类名。接口实现javax.net.ssl.HostnameVerifier,默认使用com.huawei.gaussdb.jdbc.ssl.PGjdbcHostnameVerifier。
  • loginTimeout:Integer类型。指建立数据库连接的等待时间。超时时间单位为秒。当url配置多IP时,若获取连接花费的时间超过此值,则连接失败,不再尝试后续IP。缺省值为0。
  • connectTimeout:Integer类型。用于连接服务器操作的超时值。如果连接到服务器花费的时间超过此值,则连接断开。超时时间单位为秒,值为0时表示已禁用,timeout不生效。当url配置多IP时,表示连接单个IP的超时时间。缺省值为0。
  • socketTimeout:Integer类型。用于socket读取操作的超时值。如果从服务器读取所花费的时间超过此值,则连接关闭。超时时间单位为秒,值为0时表示已禁用,timeout不生效。缺省值为0。如果不配置该参数,在数据库进程异常情况下,会导致客户端出现长时间等待,建议根据业务可接受的SQL执行时间进行配置。

    当JDBC侧触发超时且连接关闭时,其下发给数据库侧正在运行的业务会被强制终止。该能力受GUC参数check_disconnect_query控制,设置为on表示支持该能力,设置为off表示不支持该能力。

  • socketTimeoutInConnecting:Integer类型。用于控制建连阶段socket读取操作的超时值。如果建连时从服务器读取所花费的时间超过此值,则查找下一个节点建连。超时时间单位为秒,默认为5s。
  • statementTimeout:Integer类型。用于控制connection中statement执行时间的超时值。如果statement执行时间超过此值,则取消该statement执行。超时时间单位为毫秒,值为0表示已禁用,timeout不生效,缺省值为0。
  • cancelSignalTimeout:Integer类型。发送取消消息本身可能会阻塞,用于控制取消命令的“connect超时”和“socket超时”。如果取消命令超过指定时间未响应,会中断该连接,减少占用客户端资源。超时时间单位为秒,默认值为10秒。
  • tcpKeepAlive:Boolean类型。启用或禁用TCP保活探测功能。默认为false。
  • logUnclosedConnections:Boolean类型,缺省值为false。客户端可能由于未调用Connection对象的close()方法而泄漏Connection对象。最终这些对象将被垃圾回收,并且调用finalize()方法。设置为true之后,如果调用者忽略了此操作,该方法将关闭Connection。
  • assumeMinServerVersion(废弃):String类型。客户端会发送请求进行float精度设置。该参数设置要连接的服务器版本,如assumeMinServerVersion=9.0,可以在建立时减少相关包的发送。
  • ApplicationName:String类型。设置正在使用连接的JDBC驱动的名称。通过在数据库主节点上查询pg_stat_activity表可以看到正在连接的客户端信息,JDBC驱动名称显示在application_name列。缺省值为GaussDB JDBC Driver。
  • connectionExtraInfo:Boolean类型。表示驱动是否将当前驱动的部署路径、进程属主用户、url连接配置信息上报到数据库。

    取值范围:true或false,默认值为false。设置connectionExtraInfo为true,JDBC驱动会将当前驱动的部署路径、进程属主用户、url连接配置信息上报到数据库中,记录在connection_info参数里,同时可以在PG_STAT_ACTIVITY中查询到。

  • autosave:String类型。共有3种:"always"、 "never"、 "conservative",缺省值为never。如果查询失败,指定驱动程序应该执行的操作。在autosave=always模式下,JDBC驱动程序在每次查询之前设置一个保存点,并在失败时回滚到该保存点。在autosave=never模式(默认)下,无保存点。在autosave=conservative模式下,每次查询都会设置保存点,但是只会在“statement XXX无效”等情况下回滚并重试。
  • protocolVersion:Integer类型。连接协议版本号,目前仅支持1和3。设置1时仅代表连接的是V1服务端。设置3时将采用MD5加密方式,需要同步修改数据库的加密方式,将GUC参数password_encryption_type设置为1,重启数据库生效后需要创建用MD5方式加密口令的用户。同时修改gs_hba.conf,将客户端连接方式修改为MD5,用新建用户进行登录(因为设置该值后,只能使用低等级的加密方式(MD5),降低安全性,所以不推荐设置)。
    说明:

    MD5加密算法安全性低,存在安全风险,建议使用更安全的加密算法。

  • prepareThreshold:Integer类型。该值决定着PreparedStatement对象在执行多少次以后使用服务端已经准备好的statement。默认值是5,意味着在执行同一个PreparedStatement对象时,在第五次以及以上执行时不再向服务端发送parse消息对statement进行解析,而使用之前在服务端已经解析好的statement。
  • preparedStatementCacheQueries:Integer类型。确定每个连接中缓存的查询数,默认情况下是256。若在prepareStatement()调用中使用超过256个不同的查询,则最近最少使用的查询缓存将被丢弃。“0”表示禁用缓存。
  • preparedStatementCacheSizeMiB:Integer类型。该参数确定了每个连接的cache缓存Statement对象所生成query的最大值(以兆字节为单位),默认情况下是5。若缓存了超过5MB的query,则最近最少使用的查询缓存将被丢弃。“0”表示禁用缓存。
  • databaseMetadataCacheFields:Integer类型。默认值是65536。指定每个连接可缓存的最大字段的个数。“0”表示禁用缓存。
  • databaseMetadataCacheFieldsMiB:Integer类型。默认值是5。每个连接可缓存的字段的最大值,单位是MB。“0”表示禁用缓存。
  • stringtype:String类型。可选字段为:unspecified、varchar。设置通过setString()方法使用的PreparedStatement参数的类型,如果stringtype设置为VARCHAR(默认值),则这些参数将作为varchar参数发送给服务器。若stringtype设置为unspecified,则参数将作为untyped值发送到服务器,服务器将尝试推断适当的类型。
  • batchMode:String类型。用于确定是否使用batch模式连接。默认值为on,表示开启batch模式。设置batchMode=on执行成功的返回结果为[count, 0, 0...0],数组第一个元素为批量影响的总条数,设置batchMode=off执行成功的返回结果为[1, 1, 1...1],数组各元素对应单次修改的影响条数。注意:配置batchMode=on时,执行批量插入/批量修改操作,每一列的数据类型以第一条数据指定的类型为准,若数据类型混用可能会导致报错或者插入的数据异常。
  • fetchsize:Integer类型。用于设置数据库连接所创建statement的默认fetchsize。默认值为0,表示一次获取所有结果。与defaultRowFetchSize功能等价,如果同时设置,以fetchsize为准。
  • reWriteBatchedInserts:Boolean类型。缺省值为false。批量导入时,该参数设置为true,可将N条插入语句合并为一条:insert into TABLE_NAME values(values1, ..., valuesN), ..., (values1, ..., valuesN)。使用该参数时,需设置batchMode=off。
  • unknownLength:Integer类型。默认为Integer.MAX_VALUE。某些GaussDB类型(例如TEXT)没有明确定义的长度,当通过ResultSetMetaData.getColumnDisplaySize和ResultSetMetaData.getPrecision等函数返回关于这些类型的数据时,此参数指定未知长度类型的长度。
  • uppercaseAttributeName:Boolean类型。默认值为false不开启,为true时开启。该参数开启后会将获取元数据的接口的查询结果转为大写。适用场景为数据库中存储元数据全为小写,但要使用大写的元数据作为出参和入参。

    涉及到的接口请参见:java.sql.DatabaseMetaDatajava.sql.ResultSetMetaData

  • defaultRowFetchSize:Integer类型。确定一次fetch在ResultSet中读取的行数。限制每次访问数据库时读取的行数可以避免不必要的内存消耗,从而避免OutOfMemoryException。缺省值是0,意味着ResultSet中将一次获取所有行。本参数不允许设置为负值。
  • binaryTransfer:Boolean类型。使用二进制格式发送和接收数据,默认值为false。
  • binaryTransferEnable:String类型。启用二进制传输的类型列表,以逗号分隔。OID编号和名称二选一,例如:binaryTransferEnable=Integer4_ARRAY,Integer8_ARRAY。比如:OID名称为BLOB,编号为88,可以进行如下配置:binaryTransferEnable=BLOB 或 binaryTransferEnable=88。
  • binaryTransferDisable:String类型。禁用二进制传输的类型列表,以逗号分隔。OID编号和名称二选一。覆盖binaryTransferEnable的设置。
  • blobMode:String类型。用于设置setBinaryStream方法为不同类型的数据赋值,设置为on时表示为blob类型数据赋值,设置为off时表示为bytea类型数据赋值,默认为on。建议从Oracle数据库、Mysql数据库迁移的系统将该值设定为on,从Postgresql迁移的系统设定为off。
  • socketFactory:String类型。用于创建与服务器socket连接的类的名称。该类必须实现接口“javax.net.SocketFactory”,并定义无参或单String参数的构造函数。
  • socketFactoryArg:String类型。此值是上面提供的socketFactory类的构造函数的可选参数,不推荐使用。
  • receiveBufferSize:Integer类型。该值用于设置连接流上的SO_RCVBUF。
  • sendBufferSize:Integer类型。该值用于设置连接流上的SO_SNDBUF。
  • preferQueryMode:String类型。共有4种:"extended"、 "extendedForPrepared"、"extendedCacheEverything"、"simple"。用于指定执行查询的模式,simple模式会excute,不parse和bind;extended模式会bind和excute;extendedForPrepared模式为prepared statement扩展使用;extendedCacheEverything模式会缓存每个statement。
  • targetServerType:String类型。该参数识别主备数据节点是通过查询URL连接串中,数据节点是否允许写操作来实现的,默认为"any"。共有五种:"any"、"master"、"slave"、"preferSlave"、"clusterMainNode"。
    • master则尝试连接到URL连接串中的主节点,如果找不到将抛出异常。
    • slave则尝试连接到URL连接串中的备节点,如果找不到将抛出异常。
    • preferSlave则尝试连接到URL连接串中的备数据节点(如果有可用节点),否则连接到主数据节点。
    • any则尝试连接URL连接串中的任何一个数据节点。
    • clusterMainNode则尝试连接到URL串中的主节点或首备节点(容灾主节点),如果找不到将抛出异常。
  • priorityServers:Integer类型。此值用于指定url上配置的前n个节点作为主数据库实例被优先连接。默认值为NULL。该值为数字,大于0且小于url上配置的DN数量。用于流式容灾场景。

    例如:jdbc:gaussdb://host1:port1,host2:port2,host3:port3,host4:port4,/database?priorityServers=2。即表示host1与host2为主数据库实例节点,host3与host4为容灾数据库实例节点。

  • forceTargetServerSlave:Boolean类型。此值用于控制是否开启强制连接备机功能,并在数据库实例发生主备切换时,禁止已存在的连接在升主备机上继续使用。默认值为false,表示不开启强制连接备机功能。true,表示开启强制连接备机功能。
  • traceInterfaceClass:String类型。默认值为NULL,用于获取traceId的实现类。值是实现获取traceId方法接口com.huawei.gaussdb.jdbc.log.Tracer的实现类的完整限定类名。
  • use_boolean:Boolean类型。用于设置extended模式下setBoolean方法绑定的oid类型,默认为false,绑定int2类型。设置为true则绑定Boolean类型。
  • allowReadOnly:Boolean类型。用于设置是否允许连接开启只读模式,默认为true,允许设置只读模式。设置为false则禁用只读模式,此时调用connection.setReadOnly(true)不生效,仍可以修改数据。
  • TLSCiphersSupperted:String类型。用于设置支持的TLS加密套件,默认为TLS_DHE_RSA_WITH_AES_128_GCM_SHA256,TLS_DHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384。
  • stripTrailingZeros:Boolean类型。默认值为false,设置为true则去除numeric类型后的0,仅对ResultSet.getObject(int columnIndex)生效。
  • enableTimeZone:Boolean类型。默认值为true,用于指定是否启用服务端时区设置,true表示获取JVM时区指定数据库时区,false表示使用数据库时区。
  • loadBalanceHosts:Boolean类型。在默认模式下(禁用),默认顺序连接URL中指定的多个主机。如果启用,则使用洗牌算法从候选主机中随机选择一个主机建立连接。集中式环境下,如果使用此参数需要保证业务中没有写操作。
  • compatibilityTags:String类型。默认为NULL,用于将驱动的部分特性恢复到早期版本,以确保前向兼容。可配置一个或多个tag,每个tag代表开启对应的前向兼容性特性,不同tag之间用“,”隔开。一般不建议使用该参数,除非有明确的前向兼容问题。目前支持的tag如下:

    typeMapInitNull:使用该tag后,兼容驱动早期版本的行为,java.sql.Connection中typeMap的初始值为NULL,如果不使用该tag,初始值为空Map。

  • parseCandidatesByDomain:Boolean类型。默认值false,用于指定是否根据域名获得候选节点。true表示启用,false表示禁用。开启后需要将url中的host信息配置成域名+端口的形式,驱动会基于域名获得IP,生成备节点集合,并可以配合autoBalance参数做负载均衡,或者配合targetServerType参数做自动寻主。
  • primaryDomains:Integer类型。用于指定url上配置的前n个域名作为主数据库实例被优先连接。默认为0,表示关闭。需要将parseCandidatesByDomain参数设置为true时才能生效,大于0表示开启,且取值要小于url上配置的域名数量。将url中的域名拆分成两个分组,前一个分组为主数据库实例,后一个分组为备数据库实例。发生主备切换后,两个分组交换位置,前一个分组为备数据库实例,后一个分组为主数据库实例。适用于流式容灾和Dorado双数据库实例场景。

    例如:jdbc:gaussdb://domain1:port1,domain2:port2,domain3:port3,domain4:port4/database?parseCandidatesByDomain=true&primaryDomains=2,即表示domain1和domain2对应主数据库实例,优先连domain1和domain2对应的IP。如果发生主备切换,将domain3和domain4标记为主数据库实例,优先对domain3和domain4建立连接。

  • priorityDomains:Integer类型。用于指定url上配置的前n个域名作为优先连接的域名。默认为0,表示关闭,需要将parseCandidatesByDomain参数设置为true时才能生效,大于0表示开启,且取值要小于url上配置的域名数量,如果配置了primaryDomains,则需要小于primaryDomains配置的数值。

    例如:jdbc:gaussdb://domain1:port1,domain2:port2,domain3:port3,domain4:port4/database?parseCandidatesByDomain=true&primaryDomains=2&priorityDomains=1,即表示domain1和domain2对应主数据库实例,但是优先连domain1对应的IP,domain2是备用域名,只有domain1不可连后才尝试连domain2。如果发生主备切换,将domain3和domain4标记成主数据库实例,但是优先连domain3对应的IP,domain3不可以连后才尝试连domain4对应的IP。

  • refreshDomainResolveTime:Integer类型。默认为10,单位是秒,最小值为1,最大值为2147483647。代表域名解析结果的刷新周期,需要将parseCandidatesByDomain参数设置为true时才能生效,生效后会将url中涉及的域名解析刷新时间设置为指定的数值,并在异步线程中定时更新域名解析结果。注意驱动仅通过应用所在环境的DNS服务获取域名解析结果,为保障域名绑定的变更被驱动及时感知,需要应用所在环境的DNS服务保障域名绑定关系变更后能够及时生效。
  • oracleCompatible:String类型。默认为false。用户控制驱动接口的A兼容特性。有以下几种取值:
    1. 设置为true或on:表示开启驱动侧所有的A兼容特性。
    2. 设置为false或off:表示关闭驱动侧所有的A兼容特性。
    3. 设置为"tag1,tag2,tag3":配置一个或多个tag,tag之间用逗号隔开,表示开启驱动侧部分的A兼容特性,每个tag对应一个A兼容特性。

      当前支持的tag有:

      • getProcedureColumns:DatabaseMetaData#getProcedureColumns接口的行为兼容A行为。
      • getCallableStatementResults:开启后,调用CallableStatement的getLong、getInt、getShort、getByte四个接口时与A模式数据库保持一致。在注册出参类型为java.sql.Types#NUMERIC时,调用CallableStatement的getLong、getInt、getShort、getByte接口,能够正常接收out的值,只有out数值超过java数值,数据类型取值范围会提示SQLException异常。
      • batchInsertAffectedRows:reWriteBatchedInserts开启后,执行批量插入接口Statement#executeBatch的返回结果兼容A行为。
  • printSqlInLog:Boolean类型。默认值为true,用于指定异常信息中或日志中是否输出sql语句,true表示启用,false表示禁用。
  • useGsClobBlobClass:Boolean类型。默认为false,表示关闭。
    • 设置为true开启后,使用java.sql.ResultSet#getObject接口获取获取clob字段时会返回PGClob类型的对象,获取blob字段时会返回PGBlob类型的对象。通过元数据接口java.sql.ResultSetMetaData#getColumnClassName获取clob字段的类型名称会返回java.sql.Clob,获取blob字段的类型名称时会返回java.sql.Blob。
    • 设置为false关闭后,使用java.sql.ResultSet#getObject接口获取获取clob字段时会返回PGClob类型的对象,获取blob字段时会返回byte[]类型的对象。通过元数据接口java.sql.ResultSetMetaData#getColumnClassName获取clob字段的类型名称会返回java.sql.CLOB,获取blob字段的类型名称时会返回java.sql.BLOB。
  • executeUpdateQueryable:Boolean类型。默认值为false,用于指定executeUpdate方法是否开启执行DQL语句,true表示启用,false表示禁用。开启后,executeUpdate方法执行DQL语句的返回值为-1,能够得到结果集。不推荐开启此参数。
  • dbMonitor:Boolean类型。默认值为false,用于指定JDBC是否开启连接监控功能。true表示启用,false表示禁用。
    • 连接监控功能支持监控JDBC端以下指标:应用开启连接的次数、关闭连接的次数、连接异常断开的次数、数据库访问量、客户端机器CPU的使用率、内存的使用率、上下行传输速率、应用端到数据库链路之间的网络时延、抖动、丢包率。
    • 将dbMonitor设置为true,loggerLevel设置为debug,loggerFile设置为filePath,可将客户端的连接监控输出到日志文件filePath中,具体示例见示例4 数据库连接监控功能使用
  • enableStreamingQuery:Boolean类型,默认值为false,用于控制是否开启流式读功能。true表示开启,false表示关闭。将该参数值设置为true,同时使用statement.setFetchSize(Integer.MIN_VALUE)或者statement.enableStreamingResults(),表示开启流式读功能。

    流式读:读取数据时,一次获取全部,发送到客户端socket缓冲区中,缓冲区占满则暂停,有空余则继续向缓冲区中发送数据,同时JVM逐行从缓冲区中读取数据。优势是处理结果快,不会造成JVM内存溢出。劣势是只能向后遍历,数据处理完毕之前或者statement关闭之前,当前连接不能执行其他操作,具体示例见示例部分的示例2。

  • yearIsDateType:Boolean类型。默认值为true,表示开启。
    • 设置为true开启后,使用java.sql.ResultSet#getObject接口获取year数据类型字段时会返回Date类型的对象,使用java.sql.ResultSet#getString接口获取数据时会返回yyyy-mm-dd格式的日期字符串,使用java.sql.ResultSet#getInt/getLong/getShort接口获取数据会返回年份数值。
    • 设置为false关闭后,使用java.sql.ResultSet#getObject接口获取year数据类型字段时会返回Integer类型的对象,使用java.sql.ResultSet#getString接口获取数据时返回年份的字符串,使用java.sql.ResultSet#getInt/getLong/getShort接口获取数据会返回年份数值。
  • enableALT:Boolean类型。默认值为false,表示关闭。如果要开启ALT功能,需要同时配置enableALT和gns才可以生效。
    • 设置为true后,计划内ALT功能开启连接数据库时会先与GNS建立连接,这个数据库实例后续连接DN时不会再与GNS重新建立连接。在数据库实例状态发生变化时,GNS会向JDBC发送FAN消息。
    • 设置为false后,计划内ALT功能关闭,JDBC不会和GNS建立连接。
  • altLevel:Char类型。默认值为空,表示ALT只开启数据库实例状态通知功能。
    • 设置为C时,表示开启加速连接和快速断连功能,在与DN建立新连接时会根据数据库实例连接管理器中各节点的主备状态对DN列表进行排序,加速新连接建立的过程。在收到数据库实例节点DOWN的状态通知消息后,主动关闭数据库实例连接管理器中管理的连接。
    • 设置为P时,表示开启加速连接、快速断连以及计划内维护功能。在与DN建立新连接时会根据数据库实例连接管理器中各节点的主备状态对DN列表进行排序,加速新连接建立的过程。在收到数据库实例节点DOWN的状态通知消息后,主动关闭数据库实例连接管理器中管理的连接。在收到数据库实例节点进入计划内维护的消息后,会先将数据库实例连接管理器中所有连接进行事务排干,待数据库实例计划内维护完成后,重新连接DN,恢复连接的GUC参数,保证连接可用。
  • gns:String类型。默认值为空。表示GNS的IP地址和端口列表。在JDBC连接GNS时,会按照随机顺序对GNS列表依次进行连接,直到成功和某一个GNS建立连接、连接失败或超时。
  • setFloat:Boolean类型,表示调用setFloat或者setObject指定类型为float时,传递给内核的Oid是否为float4的Oid。true表示开启,传递给内核的Oid为float8,false表示关闭,传递给内核的Oid为float4,默认为false。

user

数据库用户。

password

数据库用户的密码。

uppercaseAttributeName参数开启后,如果数据库中有小写、大写和大小写混合的元数据,只能查询出小写部分的元数据,并以大写的形式输出,使用前请务必确认元数据的存储是否全为小写以避免数据出错。

示例

示例1:连接数据库

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
//以下代码将获取数据库连接操作封装为一个接口,可通过给定用户名和密码来连接数据库。
public static Connection getConnect(String username, String passwd)
    {
        //驱动类。
        String driver = "com.huawei.gaussdb.jdbc.Driver";
        //数据库连接描述符。
        String sourceURL = "jdbc:gaussdb://$ip:$port/database";
        Connection conn = null;
        
        try
        {
            //加载驱动。
            Class.forName(driver);
        }
        catch( Exception e )
        {
            e.printStackTrace();
            return null;
        }
        
        try
        {
             //创建连接。
            conn = DriverManager.getConnection(sourceURL, username, passwd);
            System.out.println("Connection succeed!");
        }
        catch(Exception e)
        {
            e.printStackTrace();
            return null;
        }
        
        return conn;
    }

示例2:使用Properties对象作为参数建立连接

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
// 以下代码将使用Properties对象作为参数建立连接。
public static Connection getConnectUseProp(String username, String passwd)
    {
        //驱动类。
        String driver = "com.huawei.gaussdb.jdbc.Driver";
        //数据库连接描述符。
        String sourceURL = "jdbc:gaussdb://$ip:$port/database?";
        Connection conn = null;
        Properties info = new Properties();
        
        try
        {
            //加载驱动。
            Class.forName(driver);
        }
        catch( Exception e )
        {
            e.printStackTrace();
            return null;
        }
        
        try
        {
             info.setProperty("user", username);
             info.setProperty("password", passwd);
             //创建连接。
             conn = DriverManager.getConnection(sourceURL, info);
             System.out.println("Connection succeed!");
        }
        catch(Exception e)
        {
            e.printStackTrace();
            return null;
        }
        
        return conn;
    }

常用参数详情请参见JDBC常用参数参考

示例3:使用流式读功能

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
// 认证用的用户名和密码直接写到代码中有很大的安全风险,建议在配置文件或者环境变量中存放(密码应密文存放,使用时解密),确保安全。
// 本示例以用户名和密码保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量(环境变量名称请根据自身情况进行设置)EXAMPLE_USERNAME_ENV和EXAMPLE_PASSWORD_ENV。
// 建立连接。
public static Connection getConnection(String username, String passwd) {
    String driver = "com.huawei.gaussdb.jdbc.Driver";
    String sourceURL = "jdbc:gaussdb://$ip:$port/database?enableStreamingQuery=true";
    Connection conn = null;
    try {
        //加载驱动。
        Class.forName(driver);
    } catch (Exception e) {
        e.printStackTrace();
        return null;
    }
    try {
        //创建连接。
        conn = DriverManager.getConnection(sourceURL, username, passwd);
        System.out.println("Connection succeed!");
    } catch (Exception e) {
        e.printStackTrace();
        return null;
    }
    return conn;
}

// 执行普通SQL语句,创建t_user表。
public static void CreateTable(Connection conn) {
    Statement stmt = null;
    try {
        stmt = conn.createStatement();

        //执行普通SQL语句。
        stmt.executeUpdate("DROP TABLE IF EXISTS t_user");
        stmt.executeUpdate("CREATE TABLE t_user(id int, name VARCHAR(20));");
        stmt.close();
    } catch (SQLException e) {
        if (stmt != null) {
            try {
                stmt.close();
            } catch (SQLException e1) {
                e1.printStackTrace();
            }
        }
        e.printStackTrace();
    }
}

//执行预处理语句,批量插入数据。
public static void BatchInsertData(Connection conn) {
    PreparedStatement pst = null;

    try {
        //生成预处理语句。
        pst = conn.prepareStatement("INSERT INTO t_user VALUES (?,?)");
        for (int i = 0; i < 20; i++) {
            //添加参数。
            pst.setInt(1, i + 1);
            pst.setString(2, "name " + (i + 1));
            pst.addBatch();
        }
        //执行批处理。
        pst.executeBatch();
        pst.close();
    } catch (SQLException e) {
        if (pst != null) {
            try {
                pst.close();
            } catch (SQLException e1) {
                e1.printStackTrace();
            }
        }
        e.printStackTrace();
    }
}

// 开启流式读,查询t_user表中内容。
public static void StreamingQuery(Connection conn) {
    PreparedStatement pst = null;
    ResultSet resultSet = null;

    try {
        // 查询表t_user中的所有值。
        pst = conn.prepareStatement("SELECT * FROM t_user");
        pst.setFetchSize(Integer.MIN_VALUE);// ((PgStatement)statement).enableStreamingResults(); 两者作用一致。
        resultSet = pst.executeQuery();
        while (resultSet.next()) {
            System.out.println(resultSet.getInt(1));
        }
    } catch (SQLException e) {
        throw new RuntimeException(e);
    } finally {
        if (resultSet != null) {
            try {
                resultSet.close();
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
        }

        if (pst != null) {
            try {
                pst.close();
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
        }
    }
}

public static void main(String[] args) throws Exception {
    String userName = System.getenv("EXAMPLE_USERNAME_ENV");
    String password = System.getenv("EXAMPLE_PASSWORD_ENV");

    Connection conn = getConnection(userName, password);

    CreateTable(conn);

    BatchInsertData(conn);

    StreamingQuery(conn);

    //关闭数据库连接。
    try {
        conn.close();
    } catch (SQLException e) {
        e.printStackTrace();
    }
}

使用流式读功能时,结果集使用完之后,需要执行resultSet.close()或者statement.close()操作,否则当前连接将不可用。