云服务器内容精选

  • 以UDS方式连接 Unix domain socket用于同一主机上不同进程间的数据交换,通过添加junixsocket获取套接字工厂使用。 前置条件:引用junixsocket-core-XXX.jar、junixsocket-common-XXX.jar、junixsocket-native-common-XXX.jar,XXX为版本号,引用的这些jar包版本号需要一致。 以下以opengaussjdbc.jar为例,以UDS方式连接数据库的步骤如下: 导入java.sql.Connection、java.sql.DriverManager、java.util.Properties。 此外,用户需要根据实际的应用场景,再导入其他的接口和类,详见JDBC接口参考。 import java.sql.Connection; import java.sql.DriverManager; import java.util.Properties; 指定数据库的用户名和密码。 用户名和密码直接写到代码中有很大的安全风险,建议在环境变量中存放。并将用户名和密码设置为Properties对象的属性值。 String userName = System.getenv("EXAMPLE_USERNAME_ENV"); String password = System.getenv("EXAMPLE_PASSWORD_ENV"); Properties properties = new Properties(); properties.setProperty("user", userName); properties.setProperty("password", password); 加载驱动。 在代码运行工具(如IDE)中添加opengaussjdbc.jar包。 执行以下命令加载数据库驱动程序“com.huawei.opengauss.jdbc.Driver”。 String driver = "com.huawei.opengauss.jdbc.Driver"; Class.forName(driver); 指定数据库的$ip、$port、database、socketFactory和socketFactoryArg。 $ip和$port需要用户自行修改,连接主机名database必须设置为“localhost”,socketFactory设置为org.newsclub.net.unix.AFUNIXSocketFactory$FactoryArg,socketFactoryArg设置为[path-to-the-unix-socket],实现以UDS方式连接数据库。socketFactory和socketFactoryArg参数的具体说明,详见socketFactory和socketFactoryArg。 Connection conn = DriverManager.getConnection("jdbc:opengauss://$ip:$port/localhost?socketFactory=org.newsclub.net.unix" + ".AFUNIXSocketFactory$FactoryArg&socketFactoryArg=[path-to-the-unix-socket]",properties); System.out.println("Connection Successful!"); socketFactoryArg参数配置根据真实路径进行配置,与GUC参数unix_socket_directory的值保持一致。 父主题: 连接数据库
  • 常见问题处理 [UnixODBC][Driver Manager]Can't open lib 'xxx/xxx/psqlodbcw.so' : file not found. 此问题的可能原因: odbcinst.ini文件中配置的路径不正确 确认方法:执行ls命令查询错误信息中的路径,以确保该psqlodbcw.so文件存在,同时具有执行权限。 psqlodbcw.so的依赖库不存在,或者不在系统环境变量中 确认方法:执行ldd查询误信息中的路径,如果是缺少libodbc.so.1等UnixODBC的库,那么按照“操作步骤”中的方法重新配置UnixODBC,并确保它的安装路径下的lib目录添加到了LD_LIBRARY_PATH中;如果是缺少其他库,请将ODBC驱动包中的lib目录添加到LD_LIBRARY_PATH中。如果缺少其他标准库,请自行安装。 [UnixODBC]connect to server failed: no such file or directory 此问题可能的原因: 配置了错误的/不可达的数据库地址,或者端口 请检查数据源配置中的Servername及Port配置项。 服务器侦听不正确 如果确认Servername及Port配置正确,请根据“操作步骤”中数据库服务器的相关配置,确保数据库侦听了合适的网卡及端口。 防火墙及网闸设备 请确认防火墙设置,将数据库的通信端口添加到可信端口中。 如果有网闸设备,请确认相关的设置。 [unixODBC]The password-stored method is not supported. 此问题可能原因: 数据源中未配置sslmode配置项。 解决办法: 请配置该选项至allow或以上选项。此配置的更多信息,请参见表3。 Server common name "xxxx" does not match host name "xxxxx" 此问题的原因: 使用了SSL加密的“verify-full”选项,驱动程序会验证证书中的主机名与实际部署数据库的主机名是否一致。 解决办法: 碰到此问题可以使用“verify-ca”选项,不再校验主机名;或者重新生成一套与数据库所在主机名相同的CA证书。 Driver's SQLAllocHandle on SQL_HANDLE_DBC failed 此问题的可能原因: 可执行文件(比如UnixODBC的isql,以下都以isql为例)与数据库驱动(psqlodbcw.so)依赖于不同的odbc的库版本:libodbc.so.1或者libodbc.so.2。此问题可以通过如下方式确认: ldd `which isql` | grep odbc ldd psqlodbcw.so | grep odbc 这时,如果输出的libodbc.so最后的后缀数字不同或者指向不同的磁盘物理文件,那么基本就可以断定是此问题。isql与psqlodbcw.so都会要求加载libodbc.so,这时如果它们加载的是不同的物理文件,便会导致两套完全同名的函数列表,同时出现在同一个可见域里(UnixODBC的libodbc.so.*的函数导出列表完全一致),产生冲突,无法加载数据库驱动。 解决办法: 确定一个要使用的UnixODBC,然后卸载另外一个(比如卸载库版本号为.so.2的UnixODBC),然后将剩下的.so.1的库,新建一个同名但是后缀为.so.2的软链接,便可解决此问题。 FATAL: Forbid remote connection with trust method! 由于安全原因,数据库主节点禁止数据库内部其他节点无认证接入。 如果要在数据库内部访问数据库主节点,请将ODBC程序部署在数据库主节点所在机器,服务器地址使用"127.0.0.1"。建议业务系统单独部署在数据库外部,否则可能会影响数据库运行性能。 [unixODBC][Driver Manager]Invalid attribute value 有可能是unixODBC的版本并非推荐版本,建议通过“odbcinst --version”命令排查环境中的unixODBC版本。 authentication method 10 not supported. 使用开源客户端碰到此问题,可能原因: 数据库中存储的口令校验只存储了SHA256格式哈希,而开源客户端只识别MD5校验,双方校验方法不匹配报错。 数据库并不存储用户口令,只存储用户口令的哈希码。 当用户更新用户口令或者新建用户时,数据库会同时存储两种格式的哈希码,这时将兼容开源的认证协议。 但是当旧版本升级到新版本时,由于哈希的不可逆性,所以数据库无法还原用户口令,进而生成新格式的哈希,所以仍然只保留了SHA256格式的哈希,导致仍然无法使用MD5做口令认证。 MD5加密算法安全性低,存在安全风险,建议使用更安全的加密算法。 要解决该问题,可以更新用户口令(参见ALTER USER);或者新建一个用户(参见CREATE USER),赋予同等权限,使用新用户连接数据库。 unsupported frontend protocol 3.51: server supports 1.0 to 3.0 目标数据库版本过低,或者目标数据库为开源数据库。 请使用对应版本的数据库驱动连接目标数据库。 FATAL: GSS authentication method is not allowed because XXXX user password is not disabled. 目标数据库主节点的pg_hba.conf里配置了当前客户端IP使用"gss"方式来做认证,该认证算法不支持用作客户端的身份认证,请修改到"sha256"后再试。 isql:error while loading shared libraries:xxx 环境缺少该动态库,需要自行安装对应的库。
  • 操作步骤 安装unixODBC(默认unixODBC源码包已在环境准备中获取)。如果机器上已经安装了其他版本的unixODBC,可以直接覆盖安装。 以unixODBC-2.3.7版本为例,在客户端执行如下命令安装unixODBC。 tar zxvf unixODBC-2.3.7.tar.gz cd unixODBC-2.3.7 ./configure --enable-gui=no #如果要在ARM服务器上编译,请追加一个configure参数: --build=aarch64-unknown-linux-gnu make #安装可能需要root权限 make install 目前不支持unixODBC-2.2.1版本。 默认安装到“/usr/local”目录下,生成数据源文件到 “/usr/local/etc”目录下,库文件生成在“/usr/local/lib”目录。 通过编译带有--enable-fastvalidate=yes选项的unixODBC来获得更高性能。但此选项可能会导致向ODBC API传递无效句柄的应用程序发生故障,而不是返回SQL_INVALID_HANDLE错误。 替换客户端 GaussDB 驱动程序。 将GaussDB-Kernel-数据库版本号-操作系统版本号-64bit-Odbc.tar.gz解压。解压后会得到两个文件夹:lib与odbc,在odbc文件夹中还会有一个lib文件夹。将解压后得到的/lib文件夹与/odbc/lib文件夹中的所有动态库都复制到“/usr/local/lib”目录下。 配置数据源。 配置ODBC驱动文件。 在“/usr/local/etc/odbcinst.ini”文件中追加以下内容。 [GaussMPP] Driver64=/usr/local/lib/psqlodbcw.so setup=/usr/local/lib/psqlodbcw.so odbcinst.ini文件中的配置参数说明如表1所示。 表1 odbcinst.ini文件配置参数 参数 描述 示例 [DriverName] 驱动器名称,对应数据源DSN中的驱动名。 [GaussMPP] Driver64 驱动动态库的路径。 Driver64=/usr/local/lib/psqlodbcw.so setup 驱动安装路径,与Driver64中动态库的路径一致。 setup=/usr/local/lib/psqlodbcw.so 配置数据源文件。 在“/usr/local/etc/odbc.ini”文件中追加以下内容。 [gaussdb] Driver=GaussMPP Servername=127.0.0.1 #数据库Server IP Database=postgres #数据库名 Username=omm #数据库用户名 Password= #数据库用户密码 Port=8000 #数据库侦听端口 Sslmode=allow odbc.ini文件配置参数说明如表2所示。 表2 odbc.ini文件配置参数 参数 描述 示例 [DSN] 数据源的名称。 [gaussdb] Driver 驱动名,对应odbcinst.ini中的DriverName。 Driver=GaussMPP Servername 服务器的IP地址。可配置多个IP地址。 Servername=127.0.0.1 Database 要连接的数据库的名称。 Database=postgres Username 数据库用户名称。 Username=omm Password 数据库用户密码。 说明: ODBC驱动本身已经对内存密码进行过清理,以保证用户密码在连接后不会再在内存中保留。 但是如果配置了此参数,由于UnixODBC对数据源文件等进行缓存,可能导致密码长期保留在内存中。 推荐在应用程序连接时,将密码传递给相应API,而非写在数据源配置文件中。同时连接成功后,应当及时清理保存密码的内存段。 须知: 配置文件中填写密码时,需要遵循http规则: 字符应当采用URL编码规范,如"!"应写作"%21","%"应写作"%25",因此应当注意特殊处理%。 "+"会被替换为空格" "。 Password=******** Port 服务器的端口号。 Port=8000 Sslmode 开启SSL模式 说明: 关于Sslmode的选项的允许值,具体信息如表3所示。 Sslmode=allow Debug 是否启用调试模式。 取值范围:0 ~ INT_MAX 设置为0时表示不开启。 设置为大于0时表示将会打印psqlodbc驱动的mylog,日志生成目录为/tmp/。 默认值为0。 Debug=1 UseServerSidePrepare 是否开启数据库端扩展查询协议。 取值范围:0,1 取值为0表示不开启。 取值为1表示开启。 默认值为1。 UseServerSidePrepare=1 UseBatchProtocol 是否开启批量查询协议(打开可提高DML性能)。 取值范围:0,1 取值为0时,不使用批量查询协议(主要用于与早期数据库版本通信兼容)。 取值为1,并且数据库support_batch_bind参数存在且为on时,将打开批量查询协议。 默认值为1。 UseBatchProtocol=1 ForExtensionConnector 此开关控制着savepoint是否发送,savepoint相关问题可以注意此开关, 取值范围:0,1 取值为0时表示发送savepoint。 取值为1时表示不发送savepoint。 默认值为1。 ForExtensionConnector=1 ConnectionExtraInfo GUC参数connection_info中显示驱动部署路径和进程属主用户的开关。 取值范围:0,1 取值为0时表示不打开此开关。 取值为1时表示打开此开关。 默认值为0。 说明: 默认值为0。当设置为1时,ODBC驱动会将当前驱动的部署路径、进程属主用户上报到数据库中,记录在connection_info参数里;同时可以在PG_STAT_ACTIVITY中查询到。 ConnectionExtraInfo=1 BoolAsChar 是否将布尔值作为字符处理。 取值范围:0,1 取值为0时表示Bools值将会映射为SQL_BIT。 取值为1时表示Bools值将会映射为SQL_CHAR。 默认值为1。 BoolsAsChar = 1 RowVersioning 是否在更新一行数据时,允许应用检测数据有没有被其他用户进行修改。 取值范围:0,1 取值为0时表示不允许应用检测。 取值为1时表示允许应用检测。 默认值为0。 RowVersioning=1 ShowSystemTables 是否将默认系统表格视为普通SQL表格。 取值范围:0,1 取值为0时驱动不会将默认系统表格视为普通SQL表格。 取值为1时驱动将默认系统表格视为普通SQL表格。 默认值为0。 ShowSystemTables=1 TcpUserTimeout 在支持TCP_USER_TIMEOUT套接字选项的操作系统上,指定传输的数据在TCP连接被强制关闭之前可以保持未确认状态的最大时长。 取值范围:0 ~ INT_MAX 默认值为0。 说明: 0表示使用系统缺省。通过Unix域套接字做的连接忽略这个参数。单位为毫秒。 TcpUserTimeout=5000 其中关于Sslmode的选项的允许值,具体信息见下表: 表3 Sslmode的可选项及其描述 Sslmode 是否会启用SSL加密 描述 disable 否 不使用SSL安全连接。 allow 可能 如果数据库服务器要求使用,则可以使用SSL安全加密连接,但不验证数据库服务器的真实性。 prefer 可能 如果数据库支持,那么建议使用SSL安全加密连接,但不验证数据库服务器的真实性。 require 是 必须使用SSL安全连接,但是只做了 数据加密 ,而并不验证数据库服务器的真实性。 verify-ca 是 必须使用SSL安全连接,并且验证数据库是否具有可信证书机构签发的证书。 verify-full 是 必须使用SSL安全连接,在verify-ca的验证范围之外,同时验证数据库所在主机的主机名是否与证书内容一致。GaussDB不支持此模式。 用户通过ODBC连接GaussDB服务器时,可以通过开启SSL加密客户端和服务器之间的通讯。在使用SSL时,默认用户已经获取了服务端和客户端所需要的证书和私钥文件,关于证书等文件的获取请参考Openssl相关文档和命令。 在客户端配置环境变量。 vim ~/.bashrc 在配置文件中追加以下内容。 export LD_LIBRARY_PATH=/usr/local/lib/:$LD_LIBRARY_PATH export OD BCS YSINI=/usr/local/etc export ODBCINI=/usr/local/etc/odbc.ini 执行如下命令使设置生效。 source ~/.bashrc 测试连接。 安装后/usr/bin下面会存放生成的二进制,可执行isql -v gaussdb(数据源名称)命令。 如果显示如下信息,表明配置正确,连接成功。 +---------------------------------------+ | Connected! | | | | sql-statement | | help [tablename] | | quit | | | +---------------------------------------+ 若显示ERROR信息,则表明配置错误。请检查上述配置步骤是否正确执行。 目前通过ODBC连接数据库时,会如下设置内核参数: SET extra_float_digits = 2; SET DateStyle = 'ISO'; 这些参数可能会导致ODBC客户端的行为与gsql客户端的行为不一致,例如,Date数据显示方式、浮点数精度表示。如果实际期望和这些配置不符,建议在ODBC应用代码中显式设定这些参数。
  • 连接参数参考 info参数连接的所有属性名称对大小写敏感。常用的属性如表1所示。 表1 info参数的连接属性 属性名称 属性说明 属性值 PGDBNAME 表示数据库名称(URL中无需配置该参数,自动从Properties文件中解析)。 属性类型:String PGHOST 主机IP地址。 属性类型:String PGPORT 主机端口号。 属性类型:Integer user 表示创建连接的数据库用户。 属性类型:String password 表示数据库用户的密码。 属性类型:String driverInfoMode 控制驱动描述信息的输出模式。 属性类型:String 取值范围:postgresql、gaussdb。 postgresql表示输出postgresql相关的驱动描述信息。 gaussdb表示输出gaussdb相关的驱动描述信息。 默认值:postgresql loggerLevel 指定日志记录级别。 属性类型:String 取值范围:目前支持4种级别:OFF、INFO、DEBUG、TRACE。 OFF表示关闭日志。 INFO、DEBUG和TRACE表示记录的日志信息详细程度不同。 默认值:该属性不设置则为空,与设置为INFO等效。 loggerFile 用于指定日志输出路径(目录和文件名)。此参数已废弃,不再生效。 如需指定日志输出路径可通过 java.util.logging 属性文件或系统属性进行配置。 属性类型:String logger 表示JDBC Driver要使用的日志输出框架。JDBC Driver支持对接用户应用程序使用的日志输出框架。 属性类型:String 取值范围:Slf4JLogger 如果缺省,则JDBC Driver使用JDK LOG GER。 目前支持的第三方日志输出框架只有基于Slf4j-API的日志框架。具体使用方式,请参见日志管理。 allowEncodingChanges 设置该参数值为true进行字符集类型更改,配合参数characterEncoding设置字符集,二者使用“&”分隔。characterEncoding取值范围为UTF8、GBK、LATIN1、GB18030。例:allowEncodingChanges=true&characterEncoding=UTF8。 属性类型:Boolean 取值范围: true表示更改字符集类型。 false表示不更改字符集类型。 默认值:false currentSchema 设置当前连接的schema,在search-path中指定要设置的schema。如果schema名包含除字母、数字、下划线之外的特殊字符,建议在schema名上加引号,注意schema名大小写敏感。如需配置多个schema,要用逗号(,)进行分隔,包含特殊字符的schema也需要加引号处理。 例如:currentSchema=schema_a,"schema-b","schema/c" 属性类型:String 缺省:如果未设置,则默认schema为连接使用的用户名。 hostRecheckSeconds JDBC尝试连接主机后会保存主机状态:连接成功或连接失败。在hostRecheckSeconds时间内保持可信,超过则状态失效。 属性类型:Integer 属性单位:s 取值范围:0 ~ 2147483647 默认值:10 ssl 表示以SSL方式连接数据库。 ssl=true可支持NonValidatingFactory通道和使用证书的方式: 1、NonValidatingFactory通道需要配置用户名和密码,同时将SSL设置为true。 2、配置客户端证书、密钥、根证书,将SSL设置为true。 属性类型:Boolean 取值范围: true表示以SSL方式连接数据库。 false表示不以SSL方式连接数据库。 默认值:该属性不设置则为空,与false等效。 sslmode SSL认证方式。 属性类型:String 取值范围: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连接,并且验证服务器是否具有由可信任的证书机构签发的证书,以及验证服务器主机名是否与证书中的一致。 默认值:该属性不设置则为空,与require等效。 sslcert 提供客户端证书文件的完整路径。证书类型为End Entity。 属性类型:String 默认值:该属性不设置则为空,读取用户根目录。 sslkey 提供密钥文件的完整路径,使用时需将该密钥转换为DER格式。 openssl pkcs8 -topk8 -outform DER -in client.key -out client.key.pk8 -nocrypt 属性类型:String 默认值:该属性不设置则为空,读取用户根目录。 sslrootcert SSL根证书的文件名。根证书的类型为CA。 属性类型:String 默认值:该属性不设置则为空,读取用户根目录。 sslpassword SSL密码,提供给ConsoleCallbackHandler使用。 属性类型:String sslpasswordcallback SSL密码提供者的类名。 属性类型:String 默认值:该属性不设置则为空。 sslfactory 指定SSLSocketFactory在建立SSL连接时用的类名。 属性类型:String 默认值:该属性不设置则为空。 sslprivatekeyfactory 提供的值是实现私钥解密方法的接口org.postgresql.ssl.PrivateKeyFactory的实现类的完整限定类名。如果不提供,首先尝试默认的jdk私钥解密算法,如果无法解密,则使用org.postgresql.ssl.BouncyCastlePrivateKeyFactory,用户需要自己提供bcpkix-jdk15on.jar包,版本建议:1.65以上。 属性类型:String 默认值:该属性不设置则为空。 sslfactoryarg 此值是sslfactory类的构造函数的可选参数(不推荐使用)。 属性类型:String 默认值:该属性不设置则为空。 sslhostnameverifier 主机名验证程序的类名。接口实现javax.net.ssl.HostnameVerifier,默认使用com.huawei.opengauss.jdbc.ssl.PGjdbcHostnameVerifier。 属性类型:String 默认值:该属性不设置则为空,默认使用com.huawei.opengauss.jdbc.ssl.PGjdbcHostnameVerifier。 loginTimeout 指建立数据库连接的等待时间。当url配置多IP时,若获取连接花费的时间超过此值,则连接失败,不再尝试后续IP。 loginTimeout时间包括connectTimeout和socketTimeoutInConnecting,计算方式为:loginTimeout=(connectTimeout+连接认证时间+初始化语句执行时间)*节点数量。 须知: 此参数设置后对于多IP而言,时间是尝试连接IP的时间,可能会出现因为设置的值较小导致后面的IP无法连接的问题。例如设置了三个IP,如果loginTimeout为5s,但前两个IP建连总共用了5s,第三个IP会无法进行连接。在集中式环境下,此最后一个IP恰好为主机,可能会导致自动寻主失败。 当CPU、内存、I/O负载中的任意一项接近100%时,会出现连接慢的现象,可能会导致连接时间超过阈值的问题,可通过以下方式进行问题排查: 登录连接慢的物理机或通过管理工具查询资源负载:可通过top命令等确认CPU使用率;通过free命令确认内存使用情况;通过iostat命令确认I/O负载;此外还可以通过cm_agent中的监控日志,以及数据库运维平台中的监测记录进行检查。 针对短时间内大量慢查询导致的峰值负载场景,可通过[数据库服务器的端口号+1]端口连接,查询pg_stat_activity视图;针对慢查询,可以使用系统函数pg_terminate_backend(pid int)进行查杀会话。 针对业务量长期超负载情况(即无明显慢查询,或慢查询查杀后但新的查询依然会变成慢查询),应考虑降低业务负载、增加数据库资源的方式进行优化。 属性类型:Integer 属性单位:s(秒) 取值范围:0 ~ 2147483647。0表示已禁用,timeout不生效。 默认值:0 建议:配置后每次建连都会开启一个异步线程,在连接数较多的情况可能会导致客户端压力增大,如果业务确认需要设置此参数,在集中式环境下建议调整为max(connectTimeout, socketTimeoutInConnecting) * 节点数,防止在网络异常情况且第n个IP为主的情况下,无法连接。 connectTimeout 用于连接服务器操作系统的超时值。如果连接到服务器操作系统花费的时间超过此值,则连接断开。当url配置多IP时,表示连接单个IP的超时时间。 属性类型:Integer 属性单位:s(秒) 取值范围:0 ~ 2147483647。0表示已禁用,timeout不生效。 默认值:0 socketTimeout 用于socket读取操作的超时值。如果从服务器读取数据流所花费的时间超过此值,则连接关闭。如果不配置该参数,在数据库进程异常情况下,会导致客户端出现长时间等待,建议根据业务可以接受的SQL执行时间进行配置。 说明: 当JDBC侧触发超时且连接关闭时,其下发给数据库侧正在运行的业务会被强制终止。业务强制终止的能力受GUC参数check_disconnect_query控制,设置为on表示支持该能力,设置为off表示不支持该能力。 属性类型:Integer 属性单位:s(秒) 取值范围:0 ~ 2147483647。0表示已禁用,timeout不生效。 默认值:0 socketTimeoutInConnecting 用于控制建连阶段socket读取操作的超时值。在建连阶段,如果从服务器读取数据流超过此阈值,则尝试查找下一个节点建连。 属性类型:Integer 属性单位:s(秒) 取值范围:0 ~ 2147483647 默认值:5 cancelSignalTimeout 发送取消命令的消息本身可能会阻塞,用于控制取消命令的“connect超时”和“socket超时”。如果取消命令超过指定时间未响应,会中断该连接,减少占用客户端资源。 属性类型:Integer 属性单位:s(秒) 取值范围:0 ~ 2147483647 默认值:10 tcpKeepAlive TCP保活探测功能的控制开关。 属性类型:Boolean 取值范围: true表示启用TCP保活探测功能。 false表示禁用TCP保活探测功能。 默认值:false logUnclosedConnections 客户端可能由于未调用Connection对象的close()方法而泄漏Connection对象。最终这些对象将被回收,并且调用finalize()方法。 属性类型:Boolean 取值范围: true表示如果用户没有调用close()方法,finalize()方法将关闭Connection对象。 false表示如果用户没有调用close()方法,将不会关闭Connection对象。 默认值:false assumeMinServerVersion(废弃) 该参数设置要连接的服务器版本。 如assumeMinServerVersion高于或者等于9.0,可以在建立连接时减少相关包的发送,客户端不会发送请求将float精度设置为3(即维持原来设置的float精度2)。 属性类型:String 默认值:该属性不设置则为空。 ApplicationName 设置正在使用连接的JDBC驱动的名称。通过在数据库主节点上查询pg_stat_activity表可以看到正在连接的客户端信息,JDBC驱动名称显示在application_name列。 属性类型:String 默认值:PostgreSQL JDBC Driver connectionExtraInfo 表示驱动是否将当前驱动的部署路径、进程属主用户、url连接配置信息上报到数据库。 属性类型:Boolean 取值范围: true表示JDBC驱动会将当前驱动的部署路径、进程属主用户、url连接配置信息上报到数据库中,记录在connection_info参数里,同时可以在PG_STAT_ACTIVITY中查询到。 false表示JDBC驱动不会将当前驱动的部署路径、进程属主用户、url连接配置信息上报到数据库中。 默认值:false autosave 如果查询失败,指定驱动程序应该执行的操作。 属性类型:String 取值范围:always、never、conservative。 always表示JDBC驱动程序在每次查询之前设置一个保存点,并在失败时回滚到该保存点。 never表示无保存点。 conservative表示每次查询都会设置保存点,但是只会在“statement XXX无效”等情况下回滚并重试。 默认值:never protocolVersion 连接协议版本号。 属性类型:Integer 取值范围:目前仅支持1和3。 设置1时代表连接的是V1服务端。 设置3时代表连接的是V5服务端。 默认值:该属性不设置则为空,与设置为3等效。 prepareThreshold 该值决定PreparedStatement对象在执行多少次以后使用服务端已经解析好的statement。 说明: 不建议通过JDBC,并且使用prepareStatement的方式执行涉及密码的语句(例如:CREATE USER user_name WITH PASSWORD '********';),原因是执行达到prepareThreshold指定次数时,数据库将SQL语句进行缓存,基于安全因素不会将密码进行缓存,该prepareStatement再次执行时会报错(Password must contain at least 8 characters.)。 属性类型:Integer 取值范围:0 ~ 2147483647 默认值:5。意味着在执行同一个PreparedStatement对象时,在第五次及以上执行时不再向服务端发送parse消息对statement进行解析,而使用之前在服务端已经解析好的statement。 preparedStatementCacheQueries 确定每个连接中缓存preparedStatement对象所生成query的最大数量。 属性类型:Integer 取值范围:0 ~ 2147483647。0表示禁用缓存。 默认值:256。若在prepareStatement()调用中使用超过256个不同的查询,则最近最少使用的查询缓存将被丢弃。 建议:根据业务需要进行调整。配合prepareThreshold使用。 preparedStatementCacheSizeMiB 确定每个连接中缓存preparedStatement对象所生成query的最大值。 属性类型:Integer 属性单位:MB 取值范围:0 ~ 2147483647。0表示禁用缓存。 默认值:5。若缓存了超过5MB的query,则最近最少使用的查询缓存将被丢弃。 databaseMetadataCacheFields 指定每个连接可缓存的字段的最大个数。 属性类型:Integer 取值范围:0 ~ 2147483647。0表示禁用缓存。 默认值:65536 databaseMetadataCacheFieldsMiB 指定每个连接可缓存的字段的最大值。 属性类型:Integer 属性单位:MB 取值范围:0 ~ 2147483647。0表示禁用缓存。 默认值:5 stringtype 指定调用java.sql.PreparedStatement#setString方法时传给数据库的参数类型。 属性类型:String 取值范围:unspecified、varchar。 varchar表示参数将作为varchar类型发送给服务器。 unspecified表示参数将不指定类型发送到服务器,服务器将尝试推断适当的类型。 默认值:varchar batchMode 表示是否使用batch模式连接。 说明: 配置batchMode=on时,执行批量插入/批量修改操作,每一列的数据类型以第一条数据指定的类型为准,若数据类型混用可能会导致报错或者插入的数据异常。 属性类型:String 取值范围: on表示开启batch模式,可以提升批量更新的性能。设置batchMode=on执行成功的返回结果为[count, 0, 0...0],数组第一个元素为批量影响的总条数。 off表示关闭batch模式。设置batchMode=off执行成功的返回结果为[1, 1, 1...1],数组各元素对应单次修改的影响条数。 默认值:on fetchsize 用于设置数据库连接所创建statement的默认fetchsize。 确定一次fetch在ResultSet中读取的行数,与defaultRowFetchSize功能等价。如果fetchsize和defaultRowFetchSize同时设置,以fetchsize为准。 属性类型:Integer 取值范围:0 ~ 2147483647 默认值:0。表示一次从数据库获取所有结果。 建议:用户根据自身的业务查询数据数量和客户端机器内存情况来配置此参数,设置fetchsize时要关闭自动提交(autocommit=false)模式,否则会导致fetchsize无法生效。 defaultRowFetchSize 确定一次fetch在ResultSet中读取的行数。限制每次访问数据库时读取的行数可以避免不必要的内存消耗,从而避免OutOfMemoryException。 属性类型:Integer 取值范围:0 ~ 2147483647 默认值:0。表示一次从数据库获取所有结果。 reWriteBatchedInserts 表示批量插入时,是否重写SQL语句。使用该参数时,要求设置batchMode=off。 属性类型:Boolean 取值范围: true表示批量插入时,可将N条插入语句合并为一条:insert into TABLE_NAME values(values1, ..., valuesN), ..., (values1, ..., valuesN)。 false表示批量插入时,不重写SQL语句。 默认值:false unknownLength 某些GaussDB类型(例如TEXT)没有明确定义的长度,当通过ResultSetMetaData.getColumnDisplaySize和ResultSetMetaData.getPrecision等函数返回关于这些类型的数据时,此参数指定未知长度类型的长度。 属性类型:Integer 取值范围:0 ~ 2147483647 默认值:Integer.MAX_VALUE uppercaseAttributeName 该属性开启后会将获取元数据的接口的查询结果转为大写。主要适用场景为数据库中存储元数据全为小写,但要使用大写的元数据作为出参和入参。 涉及到的接口请参见:java.sql.DatabaseMetaData、java.sql.ResultSetMetaData。 说明: uppercaseAttributeName参数开启后,如果数据库中有小写、大写和大小写混合的元数据,只能查询出小写部分的元数据,并以大写的形式输出,使用前请务必确认元数据的存储是否全为小写以避免数据出错。 属性类型:String 取值范围: true表示将元数据转为大写。 false表示以内核GUC参数配置为准。 默认值:false binaryTransfer 是否启用二进制格式发送和接收数据。 属性类型:Boolean 取值范围: true表示启用。 false表示不启用。 默认值:false binaryTransferEnable 启用二进制传输的类型列表。以逗号分隔,例如:binaryTransferEnable=Integer4_ARRAY,Integer8_ARRAY。 OID编号和名称二选一。比如:OID名称为BLOB,编号为88,可以进行如下配置:binaryTransferEnable=BLOB 或 binaryTransferEnable=88。 属性类型:String 默认值:该属性不设置则为空。 binaryTransferDisable 禁用二进制传输的类型列表。以逗号分隔,OID编号和名称二选一。如果binaryTransferDisable与binaryTransferEnable有相同的value,则会禁用。 属性类型:String 默认值:该属性不设置则为空。 blobMode 用于设置setBinaryStream()方法为不同类型的数据赋值。建议从A、B迁移的系统将该值设定为on,从PG迁移的系统设定为off。 属性类型:String 取值范围: on表示为blob类型数据赋值。 off表示为bytea类型数据赋值。 默认值:on socketFactory 用于创建与服务器socket连接的类的名称。该类必须实现接口“javax.net.SocketFactory”,并定义无参或单String参数的构造函数。 属性类型:String socketFactoryArg 此值是上面提供的socketFactory类的构造函数的可选参数,不推荐使用。 属性类型:String receiveBufferSize 该值用于设置连接流上的SO_RCVBUF。 属性类型:Integer 属性单位:字节 取值范围:-1 ~ 2147483647 默认值:-1。表示不设置缓冲区大小。 sendBufferSize 该值用于设置连接流上的SO_SNDBUF。 属性类型:Integer 属性单位:字节 取值范围:-1 ~ 2147483647 默认值:-1。表示不设置缓冲区大小。 preferQueryMode 用于指定执行查询的模式。 属性类型:String 取值范围:simple、extended、 extendedForPrepared、extendedCacheEverything。 simple模式会excute,不parse和bind; extended模式会bind和excute; extendedForPrepared模式为prepared statement扩展使用; extendedCacheEverything模式会缓存每个statement。 默认值:extended targetServerType 该参数识别主备数据节点是通过查询URL连接串中,数据节点是否允许写操作来实现的。 属性类型:String 取值范围:any、master、slave、preferSlave、clusterMainNode。 master表示依次尝试连接URL连接串中配置的IP,直到能够连接到数据库实例中的主节点,如果找不到将抛出异常。 slave表示依次尝试连接URL连接串中配置的IP,直到能够连接到数据库实例中的备节点,如果找不到将抛出异常。 preferSlave表示尝试连接到URL连接串中的备数据节点(如果有可用节点),否则连接到主数据节点。 any表示尝试连接到URL连接串中的任何一个数据节点。 clusterMainNode表示尝试连接到URL串中的主节点或首备节点(容灾主节点),如果找不到将抛出异常。 默认值:any 查询语句:select local_role, db_state from pg_stat_get_stream_replications(); 建议:有写操作的业务建议配置master,以保证主备切换后能正常连接主节点,但是要注意在主备倒换过程中备机没有完全升主的时候无法正常建连,导致业务语句无法正常执行。 priorityServers 此值用于指定url上配置的前n个节点作为主数据库实例被优先连接。应用于流式容灾场景。 例如:jdbc:opengauss://host1:port1,host2:port2,host3:port3,host4:port4/database?priorityServers=2。即表示host1与host2为主数据库实例节点,host3与host4为容灾数据库实例节点。 属性类型:Integer 取值范围:大于0且小于url上配置的DN数量。 默认值:NULL forceTargetServerSlave 此值用于控制是否开启强制连接备机功能,并在数据库实例发生主备切换时,禁止已存在的连接在升主备机上继续使用。 属性类型:Boolean 取值范围: false表示不开启强制连接备机功能。 true表示开启强制连接备机功能。 默认值:false traceInterfaceClass 获取traceId方法接口com.huawei.opengauss.jdbc.log.Tracer的实现类的完整限定类名。 属性类型:String 默认值:NULL use_boolean 设置extended模式下setBoolean()方法绑定的oid类型。 属性类型:Boolean 取值范围: false表示绑定int2类型。 true表示绑定bool类型。 默认值:false allowReadOnly 设置是否允许连接开启只读模式。 属性类型:Boolean 取值范围: true允许设置只读模式。 false不允许设置只读模式,此时调用connection.setReadOnly(true)不生效,仍可以修改数据。 默认值:true TLSCiphersSupperted 设置支持的TLS加密套件。 属性类型:String 默认值: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 设置是否去除numeric类型后的0,仅对ResultSet.getObject(int columnIndex)生效。 属性类型:Boolean 取值范围: true表示去除numeric类型后的0。 false表示不去除numeric类型后的0。 默认值:false enableTimeZone 用于指定是否启用客户端时区设置。 属性类型:Boolean 取值范围: true表示启用客户端时区设置(获取JVM时区指定数据库时区)。 false表示不启用客户端时区设置(使用数据库时区)。 默认值:true loadBalanceHosts 指定是否使用负载均衡功能。集中式环境下,如果使用此参数需要保证业务中没有写操作。 属性类型:Boolean 取值范围: true表示使用洗牌算法从候选主机中随机选择一个主机建立连接。 false表示顺序连接URL中指定的多个主机。 默认值:false 父主题: 连接数据库
  • 方式二:使用证书认证 前置条件:用户已经获取服务端所需要的证书和私钥文件,并完成服务端配置;同时已经获取客户端所需要的client.crt客户端证书、cacert.pem根证书、client.key.pk8客户端私钥文件,以下3介绍如何将证书和私钥文件配置在客户端。关于证书生成和获取、服务端配置的具体操作,请联系管理员或参见Openssl相关文档和命令。 使用客户端配置证书的方式连接数据库的命令如下: 导入java.sql.Connection、java.sql.DriverManager、java.util.Properties。 此外,用户需要根据实际的应用场景,再导入其他的接口和类,具体请参见JDBC接口参考。 import java.sql.Connection; import java.sql.DriverManager; import java.util.Properties; 指定数据库sourceURL($ip、$port、database需要用户自行修改)、用户名和密码。 用户名和密码直接写到代码中有很大的安全风险,建议在环境变量中存放。 String sourceURL = "jdbc:opengauss://$ip:$port/database"; Properties urlProps = new Properties(); urlProps.setProperty("user", System.getenv("EXAMPLE_USERNAME_ENV")); urlProps.setProperty("password", System.getenv("EXAMPLE_PASSWORD_ENV")); 设置SSL属性为true,在客户端配置client.crt客户端证书、cacert.pem根证书、client.key.pk8客户端私钥。 urlProps.setProperty("ssl", "true"); urlProps.setProperty("sslcert", "client.crt"); urlProps.setProperty("sslrootcert", "cacert.pem"); urlProps.setProperty("sslkey", "client.key.pk8"); 客户端私钥文件使用前,需要将client.key转化为client.key.pk8格式: /** * openssl pkcs8 -topk8 -outform DER -in client.key -out client.key.pk8 -nocrypt * openssl pkcs8 -topk8 -inform PEM -in client.key -outform DER -out client.key.der -v1 PBE-MD5-DES * openssl pkcs8 -topk8 -inform PEM -in client.key -outform DER -out client.key.der -v1 PBE-SHA1-3DES * 以上算法由于安全级别较低,不推荐使用。 * 如果客户需要采用更高级别的私钥加密算法,启用bouncycastle或者其他第三方私钥解密密码包后可以使用的私钥加密算法如下: * openssl pkcs8 -in client.key -topk8 -outform DER -out client.key.der -v2 AES128 * openssl pkcs8 -in client.key -topk8 -outform DER -out client.key.der -v2 aes-256-cbc -iter 1000000 * openssl pkcs8 -in client.key -topk8 -out client.key.der -outform Der -v2 aes-256-cbc -v2prf hmacWithSHA512 * 启用bouncycastle:使用jdbc的项目引入依赖:bcpkix-jdk15on.jar包,版本建议:1.65以上。 */ 配置sslmode。 sslmode设置值:require、verify-ca、verify-full,参数介绍详见sslmode。客户根据应用场景选择一种即可。 /* 设置sslmode为require */ urlProps.setProperty("sslmode", "require"); /* 设置sslmode为verify-ca */ urlProps.setProperty("sslmode", "verify-ca"); /* 设置sslmode为verify-full(Linux下验证) */ urlProps.setProperty("sslmode", "verify-full"); 加载驱动。 在代码运行工具(如IDE)中添加opengaussjdbc.jar包。 执行以下命令加载数据库驱动程序“com.huawei.opengauss.jdbc.Driver”。 Class.forName("com.huawei.opengauss.jdbc.Driver"); 创建数据库连接。 调用DriverManager.getConnection(String url, Properties info),进行数据库连接。 Connection conn = DriverManager.getConnection(sourceURL,urlProps);
  • 方式一:使用NonValidatingFactory通道 前置条件:用户已经获取服务端所需要的证书和私钥文件,并完成服务端配置。关于证书生成和获取、服务端配置的具体操作,请联系管理员或参见Openssl相关文档和命令。 使用NonValidatingFactory通道的方式连接数据库的命令如下: 导入java.sql.Connection、java.sql.DriverManager、java.util.Properties。 此外,用户需要根据实际的应用场景,再导入其他的接口和类,具体请参见JDBC接口参考。 import java.sql.Connection; import java.sql.DriverManager; import java.util.Properties; 指定数据库sourceURL($ip、$port、database需要用户自行修改)、用户名和密码。 用户名和密码直接写到代码中有很大的安全风险,建议在环境变量中存放。 String sourceURL = "jdbc:opengauss://$ip:$port/database"; Properties urlProps = new Properties(); urlProps.setProperty("user", System.getenv("EXAMPLE_USERNAME_ENV")); urlProps.setProperty("password", System.getenv("EXAMPLE_PASSWORD_ENV")); 设置SSL属性为true,使用NonValidatingFactory通道。 urlProps.setProperty("ssl", "true"); urlProps.setProperty("sslfactory","com.huawei.opengauss.jdbc.ssl.NonValidatingFactory"); 加载驱动。 在代码运行工具(如IDE)中添加opengaussjdbc.jar包。 执行以下命令加载数据库驱动程序“com.huawei.opengauss.jdbc.Driver”。 Class.forName("com.huawei.opengauss.jdbc.Driver"); 创建数据库连接。 调用DriverManager.getConnection(String url, Properties info),进行数据库连接。 Connection conn = DriverManager.getConnection(sourceURL,urlProps);
  • 连接数据库涉及的API 在测试连接数据库成功后,ODBC API提供了一组函数来连接数据库,如表1所示。 表1 相关API说明 功能 API 申请句柄资源 SQLAllocHandle:申请句柄资源,可替代如下函数: SQLAllocEnv:申请环境句柄 SQLAllocConnect:申请连接句柄 SQLAllocStmt:申请语句句柄 设置环境属性 SQLSetEnvAttr 设置连接属性 SQLSetConnectAttr 连接数据库 SQLConnect 以开发源程序DBtest.c为例(完整示例请参考获取和处理数据库中的数据): 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 // DBtest.c (compile with: libodbc.so) // 程序头文件和全局变量请参考完整示例 // 申请环境句柄。 V_OD_erg = SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE,&V_OD_Env); if ((V_OD_erg != SQL_SUC CES S) && (V_OD_erg != SQL_SUCCESS_WITH_INFO)) { printf("Error AllocHandle\n"); exit(0); } // 设置版本信息(环境属性)。 SQLSetEnvAttr(V_OD_Env, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0); // 申请连接句柄 。 V_OD_erg = SQLAllocHandle(SQL_HANDLE_DBC, V_OD_Env, &V_OD_hdbc); if ((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO)) { SQLFreeHandle(SQL_HANDLE_ENV, V_OD_Env); exit(0); } // 获取用户名和用户密码。 char *userName; userName = getenv("EXAMPLE_USERNAME_ENV"); char *password; password = getenv("EXAMPLE_PASSWORD_ENV"); // 设置连接属性。 SQLSetConnectAttr(V_OD_hdbc, SQL_ATTR_AUTOCOMMIT,(SQLPOINTER *)SQL_AUTOCOMMIT_ON, 0); // 连接数据库,这里的userName与password分别表示连接数据库的用户名和用户密码。 // 如果odbc.ini文件中已经配置了用户名密码,那么这里可以留空("");但是不建议这么做,因为一旦odbc.ini权限管理不善,将导致数据库用户密码泄露。 V_OD_erg = SQLConnect(V_OD_hdbc, (SQLCHAR*) "gaussdb", SQL_NTS, (SQLCHAR*) userName, SQL_NTS, (SQLCHAR*) password, SQL_NTS); if ((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO)) { printf("Error SQLConnect %d\n",V_OD_erg); SQLFreeHandle(SQL_HANDLE_ENV, V_OD_Env); exit(0); } printf("Connected !\n"); 父主题: 连接数据库
  • 常见问题处理 connect to server failed: no such file or directory 此问题可能的原因: 配置了错误的/不可达的数据库地址,或者端口 请检查数据源配置中的Server及Port配置项。 服务器侦听不正确 如果确认Server及Port配置正确,请根据“操作步骤”中数据库服务器的相关配置,确保数据库侦听了合适的网卡及端口。 防火墙及网闸设备 请确认防火墙设置,将数据库的通信端口添加到可信端口中。 如果有网闸设备,请确认相关的设置。 The password-stored method is not supported. 此问题可能原因: 数据源中未配置sslmode配置项,请调整此项至allow或以上级别,允许SSL连接,此选项的更多说明,请参见表1。 authentication method 10 not supported. 使用开源客户端碰到此问题,可能原因: 数据库中存储的口令校验只存储了SHA256格式哈希,而开源客户端只识别MD5校验,双方校验方法不匹配报错。 数据库并不存储用户口令,只存储用户口令的哈希码。 当用户更新用户口令或者新建用户时,数据库会同时存储两种格式的哈希码,这时将兼容开源的认证协议。 但是当旧版本升级到新版本时,由于哈希的不可逆性,所以数据库无法还原用户口令,进而生成新格式的哈希,所以仍然只保留了SHA256格式的哈希,导致仍然无法使用MD5做口令认证。 MD5加密算法安全性低,存在安全风险,建议使用更安全的加密算法。 要解决该问题,可以更新用户口令(参见ALTER USER);或者新建一个用户(参见CREATE USER),赋予同等权限,使用新用户连接数据库。 unsupported frontend protocol 3.51: server supports 1.0 to 3.0 目标数据库版本过低,或者目标数据库为开源数据库。请使用对应版本的数据库驱动连接目标数据库。 FATAL: GSS authentication method is not allowed because XXXX user password is not disabled. 目标DN的pg_hba.conf里配置了当前客户端IP使用"gss"方式来做认证,该认证算法不支持用作客户端的身份认证,请修改到"sha256"后再试。
  • 远程连接数据库 完成远程连接配置,请联系管理员处理。 在客户端机器上,上传客户端工具包并配置gsql的执行环境变量。 登录客户端机器。 创建“/tmp/tools”目录。 mkdir /tmp/tools 获取软件安装包中的“GaussDB-Kernel_VxxxRxxxCxx-xxxxx-64bit-gsql.tar.gz”上传到“/tmp/tools”路径下。 软件包相对位置为安装时所放位置,根据实际情况填写。 不同的操作系统,工具包文件名称会有差异。请根据实际的操作系统类型选择对应的工具包。 解压文件。 cd /tmp/tools tar -zxvf GaussDB-Kernel_VxxxRxxxCxx-XXXXX-64bit-gsql.tar.gz 设置环境变量。 打开“~/.bashrc”文件。 vi ~/.bashrc 在其中输入如下内容后,使用“:wq!”命令保存并退出。 export PATH=/tmp/tools/bin:$PATH export LD_LIBRARY_PATH=/tmp/tools/lib:$LD_LIBRARY_PATH 使环境变量配置生效。 source ~/.bashrc 连接数据库。 数据库安装完成后,会默认生成名称为postgres的数据库。 gsql -d postgres -h 10.10.0.11 -U jack -p 8000 Password for user jack: postgres为需要连接的数据库名称,10.10.0.11为CN所在的服务器IP地址,jack为登录数据库的用户名,8000为CN的端口号,上述示例中,连接的服务器的IP和端口也可以替换成DN服务器IP和端口。 上述示例中,jack用户为数据库初始化用户创建的普通用户。 默认禁止使用数据库初始化用户进行远程连接数据库,开启集群内部kerberos认证时,允许初始化用户在集群内部进行远程连接。
  • 创建数据库连接的接口介绍 JDBC提供了三种接口,用于创建数据库连接。url、info、user、password参数描述,请参见表1。 接口一:DriverManager.getConnection(String url)。该方式需要把数据库用户名、密码写在url中,有一定的安全风险,因此不推荐使用。 接口二:DriverManager.getConnection(String url, String user, String password)。具体请参见采用接口二连接数据库。 接口三:DriverManager.getConnection(String url, Properties info)。具体请参见采用接口三连接数据库。
  • 加载驱动方式介绍 加载驱动有两种方式: 在代码中创建连接之前任意位置隐含装载: Class.forName("com.huawei.opengauss.jdbc.Driver"); 在JVM启动时参数传递,jdbctest为测试用例程序的名称。 java -Djdbc.drivers=com.huawei.opengauss.jdbc.Driver jdbctest 由于GaussDB在JDBC的使用上与PG的使用方法保持兼容,所以同时在同一进程内使用两个JDBC驱动的时候,可能会类名冲突。 相比于PG驱动,GaussDB JDBC驱动主要做了以下特性的增强: 支持SHA256加密方式登录。 支持对接实现sf4j接口的第三方日志框架。 支持容灾切换。
  • 采用接口二连接数据库 使用DriverManager.getConnection(String url, String user, String password)接口创建数据库连接,命令如下: 导入java.sql.Connection和java.sql.DriverManager。 java.sql.Connection是数据库连接接口,通过java.sql.DriverManager的 getConnection() 方法让应用程序连接到数据库。此外,用户需要根据实际的应用场景,再导入其他的接口和类,具体请参见JDBC接口参考。 1 2 import java.sql.Connection; import java.sql.DriverManager; 指定数据库sourceURL($ip、$port、database需要用户自行修改)、用户名和密码。 用户名和密码直接写到代码中有很大的安全风险,建议在环境变量中存放。 String sourceURL = "jdbc:opengauss://$ip:$port/database"; String userName = System.getenv("EXAMPLE_USERNAME_ENV"); String password = System.getenv("EXAMPLE_PASSWORD_ENV"); 加载驱动。 在代码运行工具(如IDE)中添加opengaussjdbc.jar包。 执行以下命令加载数据库驱动程序“com.huawei.opengauss.jdbc.Driver”。 String driver = "com.huawei.opengauss.jdbc.Driver"; Class.forName(driver); 创建数据库连接。 调用DriverManager.getConnection(String url, String user, String password),进行数据库连接。 Connection conn = DriverManager.getConnection(sourceURL, userName, password);
  • 采用接口三连接数据库 使用DriverManager.getConnection(String url, Properties info)接口创建数据库连接,命令如下: 导入java.sql.Connection、java.sql.DriverManager、java.util.Properties。 java.util.Properties的setProperty() 方法,用于设置Properties 对象的属性值。此外,用户需要根据实际的应用场景,再导入其他的接口和类,具体请参见JDBC接口参考。 1 2 3 import java.sql.Connection; import java.sql.DriverManager; import java.util.Properties; 指定数据库sourceURL($ip、$port、database需要用户自行修改)、用户名和密码。 用户名和密码直接写到代码中有很大的安全风险,建议在环境变量中存放。 String sourceURL = "jdbc:opengauss://$ip:$port/database"; String userName = System.getenv("EXAMPLE_USERNAME_ENV"); String password = System.getenv("EXAMPLE_PASSWORD_ENV"); 创建Properties 对象,并将userName和password设置为该对象的属性值。 Properties info = new Properties(); info.setProperty("user", userName); info.setProperty("password", password); 加载驱动。 在代码运行工具(如IDE)中添加opengaussjdbc.jar包。 执行以下命令加载数据库驱动程序“com.huawei.opengauss.jdbc.Driver”。 String driver = "com.huawei.opengauss.jdbc.Driver"; Class.forName(driver); 创建数据库连接。 调用DriverManager.getConnection(String url, Properties info),进行数据库连接。 1 Connection conn = DriverManager.getConnection(sourceURL, info);
  • 连接数据库涉及的API 在测试连接数据库成功后,ODBC API提供了一组函数来连接数据库,如表1所示。 表1 相关API说明 功能 API 申请句柄资源 SQLAllocHandle:申请句柄资源,可替代如下函数: SQLAllocEnv:申请环境句柄。 SQLAllocConnect:申请连接句柄。 SQLAllocStmt:申请语句句柄。 设置环境属性 SQLSetEnvAttr 设置连接属性 SQLSetConnectAttr 连接数据库 SQLConnect 以开发源程序DBtest.c为例(完整示例请参考获取和处理数据库中的数据): 1 2 3 4 5 6 7 8 9101112131415161718192021222324252627282930313233343536373839404142 // DBtest.c (compile with: libodbc.so)// 程序头文件和全局变量请参考完整示例// 申请环境句柄。 V_OD_erg = SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE,&V_OD_Env); if ((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO)) { printf("Error AllocHandle\n"); exit(0); }// 设置版本信息(环境属性)。 SQLSetEnvAttr(V_OD_Env, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0);// 申请连接句柄 。 V_OD_erg = SQLAllocHandle(SQL_HANDLE_DBC, V_OD_Env, &V_OD_hdbc); if ((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO)) { SQLFreeHandle(SQL_HANDLE_ENV, V_OD_Env); exit(0); }// 获取用户名和用户密码。char *userName;userName = getenv("EXAMPLE_USERNAME_ENV");char *password;password = getenv("EXAMPLE_PASSWORD_ENV");// 设置连接属性。SQLSetConnectAttr(V_OD_hdbc, SQL_ATTR_AUTOCOMMIT,(SQLPOINTER *)SQL_AUTOCOMMIT_ON, 0);// 连接数据库,这里的userName与password分别表示连接数据库的用户名和用户密码。// 如果odbc.ini文件中已经配置了用户名密码,那么这里可以留空("");但是不建议这么做,因为一旦odbc.ini权限管理不善,将导致数据库用户密码泄露。 V_OD_erg = SQLConnect(V_OD_hdbc, (SQLCHAR*) "gaussdb", SQL_NTS, (SQLCHAR*) userName, SQL_NTS, (SQLCHAR*) password, SQL_NTS); if ((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO)) { printf("Error SQLConnect %d\n",V_OD_erg); SQLFreeHandle(SQL_HANDLE_ENV, V_OD_Env); exit(0); } printf("Connected !\n"); 父主题: 连接数据库