华为云用户手册

  • 参数 表1 SQLBindCol参数 关键字 参数说明 StatementHandle 语句句柄。 ColumnNumber 要绑定结果集的列号。起始列号为0,以递增的顺序计算列号,第0列是书签列。若未设置书签页,则起始列号为1。 TargetType 缓冲区中C数据类型的标识符。 TargetValuePtr 输出参数:指向与列绑定的数据缓冲区的指针。SQLFetch函数返回这个缓冲区中的数据。如果此参数为一个空指针,则StrLen_or_IndPtr是一个有效值。 BufferLength TargetValuePtr指向缓冲区的长度,以字节为单位。 StrLen_or_IndPtr 输出参数:缓冲区的长度或指示器指针。若为空值,则未使用任何长度或指示器值。
  • 注意事项 当分配的句柄并非环境句柄时,如果SQLAllocHandle返回的值为SQL_ERROR,则它会将OutputHandlePtr的值设置为SQL_NULL_HDBC、SQL_NULL_HSTMT或SQL_NULL_HDESC。之后,通过调用带有适当参数的SQLGetDiagRec,其中HandleType和Handle被设置为IntputHandle的值,可得到相关的SQLSTATE值,通过SQLSTATE值可以查出调用此函数的具体信息。
  • 参数 表1 SQLAllocHandle参数 关键字 参数说明 HandleType 由SQLAllocHandle分配的句柄类型。必须为下列值之一: SQL_HANDLE_ENV(环境句柄) SQL_HANDLE_DBC(连接句柄) SQL_HANDLE_STMT(语句句柄) SQL_HANDLE_DESC(描述句柄) 申请句柄顺序为,先申请环境句柄,再申请连接句柄,最后申请语句句柄。后申请的句柄依赖它前面申请的句柄。 InputHandle 将要分配的新句柄的类型。 如果HandleType为SQL_HANDLE_ENV,则该值为SQL_NULL_HANDLE。 如果HandleType为SQL_HANDLE_DBC,则它一定是一个环境句柄。 如果HandleType为SQL_HANDLE_STMT或SQL_HANDLE_DESC,则它一定是一个连接句柄。 OutputHandlePtr 输出参数:一个缓冲区的指针,此缓冲区以新分配的数据结构存放返回的句柄。
  • ODBC接口参考 ODBC接口是一套提供给用户的API函数,本节将对部分常用接口做具体描述,若涉及其他接口可参考msdn(网址:https://msdn.microsoft.com/en-us/library/windows/desktop/ms714177(v=vs.85).aspx)中ODBC Programmer's Reference项的相关内容。 SQLAllocEnv SQLAllocConnect SQLAllocHandle SQLAllocStmt SQLBindCol SQLBindParameter SQLColAttribute SQLConnect SQLDisconnect SQLExecDirect SQLExecute SQLFetch SQLFreeStmt SQLFreeConnect SQLFreeHandle SQLFreeEnv SQLPrepare SQLGetData SQLGetDiagRec SQLSetConnectAttr SQLSetEnvAttr SQLSetStmtAttr 父主题: 基于ODBC开发
  • 日志诊断场景 ODBC日志分为unixODBC驱动管理器日志和psqlODBC驱动端日志。前者可以用于追溯应用程序API的执行是否成功,后者是底层实现过程中的一些DFX日志,用来帮助定位问题。 unixODBC日志需要在odbcinst.ini文件中配置: 1 2 3 4 5 6 7 [ODBC] Trace=Yes TraceFile=/path/to/odbctrace.log [GaussMPP] Driver64=/usr/local/lib/psqlodbcw.so setup=/usr/local/lib/psqlodbcw.so gsqlODBC日志只需要在odbc.ini加上如下内容: [gaussdb] Driver=GaussMPP Servername=10.10.0.13(数据库Server IP) ... Debug=1(打开驱动端debug日志) unixODBC日志将会生成在TraceFile配置的路径下,psqlODBC会在系统/tmp/下生成mylog_xxx.log。
  • 常见问题处理 [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源码包。 获取参考地址:https://www.unixodbc.org/unixODBC-2.3.7.tar.gz。 下载后请先按照社区提供的完整性校验算法进行完整性校验。下载https://www.unixodbc.org/unixODBC-2.3.7.tar.gz.md5,查看MD5值,对比MD5值是否与源码包一致。 安装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中的驱动名。 [DRIVER_N] Driver64 驱动动态库的路径。 Driver64=/usr/local/lib/psqlodbcw.so setup 驱动安装路径,与Driver64中动态库的路径一致。 setup=/usr/local/lib/psqlodbcw.so 配置数据源文件。 在“/usr/local/etc/odbc.ini”文件中追加以下内容。 [MPPODBC] 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] 数据源的名称。 [MPPODBC] Driver 驱动名,对应odbcinst.ini中的DriverName。 Driver=DRIVER_N 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=allow Debug 设置为1时,将会打印psqlodbc驱动的mylog,日志生成目录为/tmp/。设置为0时则不会生成。 Debug=1 UseServerSidePrepare 是否开启数据库端扩展查询协议。 可选值0或1,默认为1,表示打开扩展查询协议。 UseServerSidePrepare=1 UseBatchProtocol 是否开启批量查询协议(打开可提高DML性能)。可选值0或者1,默认为1。 当此值为0时,不使用批量查询协议(主要用于与早期数据库版本通信兼容)。 当此值为1,并且数据库support_batch_bind参数存在且为on时,将打开批量查询协议。 UseBatchProtocol=1 ForExtensionConnector 这个开关控制着savepoint是否发送,savepoint相关问题可以注意这个开关,默认值为1。取值为0,发送savepoint,取值为1,不发送savepoint。 ForExtensionConnector=1 ConnectionExtraInfo GUC参数connection_info中显示驱动部署路径和进程属主用户的开关。 说明: 默认值为0。当设置为1时,ODBC驱动会将当前驱动的部署路径、进程属主用户上报到数据库中,记录在GUC参数connection_info里,同时可以在PG_STAT_ACTIVITY中查询到。 ConnectionExtraInfo=1 BoolAsChar 设置为Yes,Bools值将会映射为SQL_CHAR。如不设置将会映射为SQL_BIT。默认值为Yes。 BoolsAsChar = Yes RowVersioning 当尝试更新一行数据时,设置为Yes会允许应用检测数据有没有被其他用户进行修改。默认值为No。 RowVersioning=Yes ShowSystemTables 设置为Yes,驱动将默认系统表格视为普通SQL表格。默认值为No。 ShowSystemTables=Yes MaxCacheQueries 控制每个连接缓存的预编译语句个数,如果设置为0,则不开启客户端预编译语句缓存池。设置为大于4096的值会限制为4096。如果执行过的语句个数超过MaxCacheQueries设置的上限,则淘汰最近最少使用的语句。默认值为0。 MaxCacheQueries=128 MaxCacheSizeMiB 控制每个连接缓存的预编译语句总大小,在MaxCacheQueries大于0时生效。如果缓存的语句总长度大于MaxCacheSizeMiB则淘汰最近最少使用的语句。单位为MB,设置为大于4096的值会限制为4096。默认值为1。 MaxCacheSizeMiB=10 TcpUserTimeout 在支持TCP_USER_TIMEOUT套接字选项的操作系统上,指定传输的数据在TCP连接被强制关闭之前可以保持未确认状态的最大时长。0表示使用系统缺省。通过Unix域套接字做的连接忽略这个参数。单位为毫秒,默认为0。 TcpUserTimeout=5000 其中关于Sslmode的选项的允许值,具体信息如表3 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 MPPODBC(数据源名称)命令。 如果显示如下信息,表明配置正确,连接成功。 +---------------------------------------+ | Connected! | | | | sql-statement | | help [tablename] | | quit | | | +---------------------------------------+ 若显示ERROR信息,则表明配置错误。请检查上述配置是否正确。 目前通过ODBC连接数据库时,会如下设置内核参数: SET extra_float_digits = 2; SET DateStyle = 'ISO'; 这些参数可能会导致ODBC客户端的行为与gsql客户端的行为不一致,例如,Date数据显示方式、浮点数精度表示。如果实际期望和这些配置不符,建议在ODBC应用代码中显式设定这些参数。
  • 开发流程中涉及的API 表1 相关API说明 功能 API 申请句柄资源 SQLAllocHandle:申请句柄资源,可替代如下函数: SQLAllocEnv:申请环境句柄 SQLAllocConnect:申请连接句柄 SQLAllocStmt:申请语句句柄 设置环境属性 SQLSetEnvAttr 设置连接属性 SQLSetConnectAttr 设置语句属性 SQLSetStmtAttr 连接数据源 SQLConnect 绑定缓冲区到结果集的列中 SQLBindCol 绑定SQL语句的参数标志和缓冲区 SQLBindParameter 查看最近一次操作错误信息 SQLGetDiagRec 为执行SQL语句做准备 SQLPrepare 执行一条准备好的SQL语句 SQLExecute 直接执行SQL语句 SQLExecDirect 结果集中取行集 SQLFetch 返回结果集中某一列的数据 SQLGetData 获取结果集中列的描述信息 SQLColAttribute 断开与数据源的连接 SQLDisconnect 释放句柄资源 SQLFreeHandle:释放句柄资源,可替代如下函数: SQLFreeEnv:释放环境句柄 SQLFreeConnect:释放连接句柄 SQLFreeStmt:释放语句句柄 数据库中收到的一次执行请求(不在事务块中),如果含有多条语句,将会被打包成一个事务,如果其中有一个语句失败,那么整个请求都将会被回滚。 ODBC为应用程序与数据库的中心层,负责把应用程序发出的SQL指令传到数据库当中,自身并不解析SQL语法。故在应用程序中写入带有保密信息的SQL语句时(如明文密码),保密信息会被暴露在驱动日志中。
  • 常用方法 表1 LogicalCreateSlotBuilder常用方法 返回值 方法 描述 throws T withSlotName(String slotName) 指定复制槽名。 - ChainedLogicalCreateSlotBuilder withOutputPlugin(String outputPlugin) 插件名称,当前支持mppdb_decoding。mppdb_decoding:一种解码的输出格式,设置后输出内容为JSON格式。输出的结果包含相关数据的属性信息和属性对应的值。 - void make() 在数据库中创建具有指定参数的插槽。 SQLException ChainedLogicalCreateSlotBuilder self() 返回ChainedLogicalCreateSlotBuilder的实现。 -
  • ChainedStreamBuilder的继承关系 ChainedStreamBuilder是逻辑复制的接口,实现类是ReplicationStreamBuilder,该类位于org.postgresql.replication.fluent Package中,该类的声明如下: public class ReplicationStreamBuilder implements ChainedStreamBuilder
  • PGReplicationStream的继承关系 PGReplicationStream是逻辑复制的接口,实现类是V3PGReplicationStream,该类位于org.postgresql.core.v3.replication Package中,该类的声明如下: public class V3PGReplicationStream implements PGReplicationStream
  • 常用方法 表1 PGReplicationConnection常用方法 返回值 方法 描述 throws void close() 结束逻辑复制,并释放资源。 SQLException void forceUpdateStatus() 强制将上次接收、刷新和应用的 LSN 状态发送到后端。 SQLException LogSequenceNumber getLastAppliedLSN() 获取上次主机日志回放的LSN。 - LogSequenceNumber getLastFlushedLSN() 获取上次主机刷新的LSN,即当前逻辑解码推进的LSN。 - LogSequenceNumber getLastReceiveLSN() 获取上次接收的LSN(针对LSN序复制槽)或 CS N(针对CSN序复制槽)。 - boolean isClosed() 复制流是否关闭。 - ByteBuffer read() 从后端读取下一条WAL记录。如果读取不到,该方法阻塞I/O读。 SQLException ByteBuffer readPending() 从后端读取下一条WAL记录。如果读取不到,该方法不阻塞I/O读。 SQLException void setAppliedLSN(LogSequenceNumber applied) 设置应用的LSN。 - void setFlushedLSN(LogSequenceNumber flushed) 设置刷新的LSN(针对LSN序复制槽)或CSN(针对CSN序复制槽),在下次更新时发送至后端,用于推进服务端LSN(针对LSN序复制槽)或CSN(针对CSN序复制槽)。 -
  • 常用方法 表1 PGReplicationConnection常用方法 返回值 方法 描述 throws ChainedCreateReplicationSlotBuilder createReplicationSlot() 用于创建逻辑复制槽。只能创建LSN序逻辑复制槽,若需要创建CSN序逻辑复制槽,请参考逻辑复制SQL函数pg_create_logical_replication_slot。 - void dropReplicationSlot(String slotName) 用于删除逻辑复制槽。 SQLException,IOException ChainedStreamBuilder replicationStream() 用户开启逻辑复制。 -
  • PGReplicationConnection的继承关系 PGReplicationConnection是逻辑复制的接口,实现类是PGReplicationConnectionImpl,该类位于org.postgresql.replication Package中,该类的声明如下: public class PGReplicationConnection implements PGReplicationConnection
  • javax.naming.Context javax.naming.Context是连接配置的上下文接口。 表1 对javax.naming.Context的支持情况 方法名 返回值类型 支持JDBC 4 bind(Name name, Object obj) void Yes bind(String name, Object obj) void Yes lookup(Name name) Object Yes lookup(String name) Object Yes rebind(Name name, Object obj) void Yes rebind(String name, Object obj) void Yes rename(Name oldName, Name newName) void Yes rename(String oldName, String newName) void Yes unbind(Name name) void Yes unbind(String name) void Yes 父主题: JDBC接口参考
  • javax.sql.PooledConnection javax.sql.PooledConnection是由连接池创建的连接接口。 表1 对javax.sql.PooledConnection的支持情况 方法名 返回值类型 支持JDBC 4 addConnectionEventListener (ConnectionEventListener listener) void Yes close() void Yes getConnection() Connection Yes removeConnectionEventListener (ConnectionEventListener listener) void Yes 父主题: JDBC接口参考
  • javax.sql.DataSource javax.sql.DataSource是数据源接口。 表1 对javax.sql.DataSource接口的支持情况 方法名 返回值类型 支持JDBC 4 getConneciton() Connection Yes getConnection(String username,String password) Connection Yes getLoginTimeout() int Yes getLogWriter() PrintWriter Yes setLoginTimeout(int seconds) void Yes setLogWriter(PrintWriter out) void Yes 父主题: JDBC接口参考
  • javax.sql.ConnectionPoolDataSource javax.sql.ConnectionPoolDataSource是数据源连接池接口。 表1 对javax.sql.ConnectionPoolDataSource的支持情况 方法名 返回值类型 支持JDBC 4 getPooledConnection() PooledConnection Yes getPooledConnection(String user,String password) PooledConnection Yes 父主题: JDBC接口参考
  • java.sql.Statement java.sql.Statement是SQL语句接口。 表1 对java.sql.Statement的支持情况 方法名 返回值类型 支持JDBC 4 addBatch(String sql) void Yes clearBatch() void Yes clearWarnings() void Yes close() void Yes closeOnCompletion() void Yes execute(String sql) Boolean Yes execute(String sql, int autoGeneratedKeys) Boolean Yes execute(String sql, int[] columnIndexes) Boolean Yes execute(String sql, String[] columnNames) Boolean Yes executeBatch() Boolean Yes executeQuery(String sql) ResultSet Yes executeUpdate(String sql) int Yes executeUpdate(String sql, int autoGeneratedKeys) int Yes executeUpdate(String sql, int[] columnIndexes) int Yes executeUpdate(String sql, String[] columnNames) int Yes getConnection() Connection Yes getFetchDirection() int Yes getFetchSize() int Yes getGeneratedKeys() ResultSet Yes getMaxFieldSize() int Yes getMaxRows() int Yes getMoreResults() Boolean Yes getMoreResults(int current) Boolean Yes getResultSet() ResultSet Yes getResultSetConcurrency() int Yes getResultSetHoldability() int Yes getResultSetType() int Yes getQueryTimeout() int Yes getUpdateCount() int Yes getWarnings() SQLWarning Yes isClosed() Boolean Yes isCloseOnCompletion() Boolean Yes isPoolable() Boolean Yes setCursorName(String name) void Yes setEscapeProcessing(boolean enable) void Yes setFetchDirection(int direction) void Yes setMaxFieldSize(int max) void Yes setMaxRows(int max) void Yes setPoolable(boolean poolable) void Yes setQueryTimeout(int seconds) void Yes setFetchSize(int rows) void Yes cancel() void Yes executeLargeUpdate(String sql) long No getLargeUpdateCount() long No executeLargeBatch() long No executeLargeUpdate(String sql, int autoGeneratedKeys) long No executeLargeUpdate(String sql, int[] columnIndexes) long No executeLargeUpdate(String sql, String[] columnNames) long No 通过setFetchSize可以减少结果集在客户端的内存占用情况。它的原理是通过将结果集打包成游标,然后分段处理,所以会加大数据库与客户端的通信量,会有性能损耗。 由于数据库游标是事务内有效,所以,在设置setFetchSize的同时,需要将连接设置为非自动提交模式,setAutoCommit(false)。同时在业务数据需要持久化到数据库中时,在连接上执行提交操作。 LargeUpdate相关方法必须在JDBC4.2及以上版本使用。 父主题: JDBC接口参考
  • java.sql.ResultSetMetaData java.sql.ResultSetMetaData是对ResultSet对象相关信息的具体描述。 表1 对java.sql.ResultSetMetaData的支持情况 方法名 返回值类型 支持JDBC 4 getCatalogName(int column) String Yes getColumnClassName(int column) String Yes getColumnCount() int Yes getColumnDisplaySize(int column) int Yes getColumnLabel(int column) String Yes getColumnName(int column) String Yes getColumnType(int column) int Yes getColumnTypeName(int column) String Yes getPrecision(int column) int Yes getScale(int column) int Yes getSchemaName(int column) String Yes getTableName(int column) String Yes isAutoIncrement(int column) boolean Yes isCaseSensitive(int column) boolean Yes isCurrency(int column) boolean Yes isDefinitelyWritable(int column) boolean Yes isNullable(int column) int Yes isReadOnly(int column) boolean Yes isSearchable(int column) boolean Yes isSigned(int column) boolean Yes isWritable(int column) boolean Yes uppercaseAttributeName为true时,下面接口会将查询结果转为大写,可转换范围为26个英文字母。 public String getColumnName(int column) public String getColumnLabel(int column) 父主题: JDBC接口参考
  • java.sql.PreparedStatement java.sql.PreparedStatement是预处理语句接口。 表1 对java.sql.PreparedStatement的支持情况 方法名 返回值类型 支持JDBC 4 clearParameters() void Yes execute() Boolean Yes executeQuery() ResultSet Yes excuteUpdate() int Yes executeLargeUpdate() long No getMetaData() ResultSetMetaData Yes getParameterMetaData() ParameterMetaData Yes setArray(int parameterIndex, Array x) void Yes setAsciiStream(int parameterIndex, InputStream x, int length) void Yes setBinaryStream(int parameterIndex, InputStream x) void Yes setBinaryStream(int parameterIndex, InputStream x, int length) void Yes setBinaryStream(int parameterIndex, InputStream x, long length) void Yes setBlob(int parameterIndex, InputStream inputStream) void Yes setBlob(int parameterIndex, InputStream inputStream, long length) void Yes setBlob(int parameterIndex, Blob x) void Yes setCharacterStream(int parameterIndex, Reader reader) void Yes setCharacterStream(int parameterIndex, Reader reader, int length) void Yes setClob(int parameterIndex, Reader reader) void Yes setClob(int parameterIndex, Reader reader, long length) void Yes setClob(int parameterIndex, Clob x) void Yes setDate(int parameterIndex, Date x, Calendar cal) void Yes setNull(int parameterIndex, int sqlType) void Yes setNull(int parameterIndex, int sqlType, String typeName) void Yes setObject(int parameterIndex, Object x) void Yes setObject(int parameterIndex, Object x, int targetSqlType) void Yes setObject(int parameterIndex, Object x, int targetSqlType, int scaleOrLength) void Yes setSQLXML(int parameterIndex, SQLXML xmlObject) void Yes setTime(int parameterIndex, Time x) void Yes setTime(int parameterIndex, Time x, Calendar cal) void Yes setTimestamp(int parameterIndex, Timestamp x) void Yes setTimestamp(int parameterIndex, Timestamp x, Calendar cal) void Yes setUnicodeStream(int parameterIndex, InputStream x, int length) void Yes setURL(int parameterIndex, URL x) void Yes setBoolean(int parameterIndex, boolean x) void Yes setBigDecimal(int parameterIndex, BigDecimal x) void Yes setByte(int parameterIndex, byte x) void Yes setBytes(int parameterIndex, byte[] x) void Yes setDate(int parameterIndex, Date x) void Yes setDouble(int parameterIndex, double x) void Yes setFloat(int parameterIndex, float x) void Yes setInt(int parameterIndex, int x) void Yes setLong(int parameterIndex, long x) void Yes setShort(int parameterIndex, short x) void Yes setString(int parameterIndex, String x) void Yes setNString(int parameterIndex, String x) void Yes addBatch() void Yes executeBatch() int[] Yes addBatch()、execute()必须在clearBatch()之后才能执行。 调用executeBatch()方法并不会清除batch。用户必须显式使用clearBatch()清除 。 在添加了一个batch的绑定变量后,用户若想重用这些值(再次添加一个batch),无需再次使用set*()方法。 以下方法是从java.sql.Statement继承而来:close、execute、executeQuery、executeUpdate、getConnection、getResultSet、getUpdateCount、isClosed、setMaxRows、setFetchSize。 executeLargeUpdate()方法必须在JDBC4.2及以上版本使用。 父主题: JDBC接口参考
  • java.sql.Driver java.sql.Driver是数据库驱动接口。 表1 对java.sql.Driver的支持情况 方法名 返回值类型 支持JDBC 4 acceptsURL(String url) Boolean Yes connect(String url, Properties info) Connection Yes jdbcCompliant() Boolean Yes getMajorVersion() int Yes getMinorVersion() int Yes getParentLogger() Logger Yes getPropertyInfo(String url, Properties info) DriverPropertyInfo[] Yes 父主题: JDBC接口参考
  • java.sql.DatabaseMetaData java.sql.DatabaseMetaData是数据库对象定义接口。 表1 对java.sql.DatabaseMetaData的支持情况 方法名 返回值类型 支持JDBC 4 allProceduresAreCallable() boolean Yes allTablesAreSelectable() boolean Yes autoCommitFailureClosesAllResultSets() boolean Yes dataDefinitionCausesTransactionCommit() boolean Yes dataDefinitionIgnoredInTransactions() boolean Yes deletesAreDetected(int type) boolean Yes doesMaxRowSizeIncludeBlobs() boolean Yes generatedKeyAlwaysReturned() boolean Yes getBestRowIdentifier(String catalog, String schema, String table, int scope, boolean nullable) ResultSet Yes getCatalogs() ResultSet Yes getCatalogSeparator() String Yes getCatalogTerm() String Yes getClientInfoProperties() ResultSet Yes getColumnPrivileges(String catalog, String schema, String table, String columnNamePattern) ResultSet Yes getConnection() Connection Yes getCrossReference(String parentCatalog, String parentSchema, String parentTable, String foreignCatalog, String foreignSchema, String foreignTable) ResultSet Yes getDefaultTransactionIsolation() int Yes getExportedKeys(String catalog, String schema, String table) ResultSet Yes getExtraNameCharacters() String Yes getFunctionColumns(String catalog, String schemaPattern, String functionNamePattern, String columnNamePattern) ResultSet Yes getFunctions(String catalog, String schemaPattern, String functionNamePattern) ResultSet Yes getIdentifierQuoteString() String Yes getImportedKeys(String catalog, String schema, String table) ResultSet Yes getIndexInfo(String catalog, String schema, String table, boolean unique, boolean approximate) ResultSet Yes getMaxBinaryLiteralLength() int Yes getMaxCatalogNameLength() int Yes getMaxCharLiteralLength() int Yes getMaxColumnNameLength() int Yes getMaxColumnsInGroupBy() int Yes getMaxColumnsInIndex() int Yes getMaxColumnsInOrderBy() int Yes getMaxColumnsInSelect() int Yes getMaxColumnsInTable() int Yes getMaxConnections() int Yes getMaxCursorNameLength() int Yes getMaxIndexLength() int Yes getMaxLogicalLobSize() default long Yes getMaxProcedureNameLength() int Yes getMaxRowSize() int Yes getMaxSchemaNameLength() int Yes getMaxStatementLength() int Yes getMaxStatements() int Yes getMaxTableNameLength() int Yes getMaxTablesInSelect() int Yes getMaxUserNameLength() int Yes getNumericFunctions() String Yes getPrimaryKeys(String catalog, String schema, String table) ResultSet Yes getPartitionTablePrimaryKeys(String catalog, String schema, String table) ResultSet Yes getProcedureColumns(String catalog, String schemaPattern, String procedureNamePattern, String columnNamePattern) ResultSet Yes getProcedures(String catalog, String schemaPattern, String procedureNamePattern) ResultSet Yes getProcedureTerm() String Yes getSchemas() ResultSet Yes getSchemas(String catalog, String schemaPattern) ResultSet Yes getSchemaTerm() String Yes getSearchStringEscape() String Yes getSQLKeywords() String Yes getSQLStateType() int Yes getStringFunctions() String Yes getSystemFunctions() String Yes getTablePrivileges(String catalog, String schemaPattern, String tableNamePattern) ResultSet Yes getTimeDateFunctions() String Yes getTypeInfo() ResultSet Yes getUDTs(String catalog, String schemaPattern, String typeNamePattern, int[] types) ResultSet Yes getURL() String Yes getVersionColumns(String catalog, String schema, String table) ResultSet Yes insertsAreDetected(int type) boolean Yes locatorsUpdateCopy() boolean Yes othersDeletesAreVisible(int type) boolean Yes othersInsertsAreVisible(int type) boolean Yes othersUpdatesAreVisible(int type) boolean Yes ownDeletesAreVisible(int type) boolean Yes ownInsertsAreVisible(int type) boolean Yes ownUpdatesAreVisible(int type) boolean Yes storesLowerCaseIdentifiers() boolean Yes storesMixedCaseIdentifiers() boolean Yes storesUpperCaseIdentifiers() boolean Yes supportsBatchUpdates() boolean Yes supportsCatalogsInDataManipulation() boolean Yes supportsCatalogsInIndexDefinitions() boolean Yes supportsCatalogsInPrivilegeDefinitions() boolean Yes supportsCatalogsInProcedureCalls() boolean Yes supportsCatalogsInTableDefinitions() boolean Yes supportsCorrelatedSubqueries() boolean Yes supportsDataDefinitionAndDataManipulationTransactions() boolean Yes supportsDataManipulationTransactionsOnly() boolean Yes supportsGetGeneratedKeys() boolean Yes supportsMixedCaseIdentifiers() boolean Yes supportsMultipleOpenResults() boolean Yes supportsNamedParameters() boolean Yes supportsOpenCursorsAcrossCommit() boolean Yes supportsOpenCursorsAcrossRollback() boolean Yes supportsOpenStatementsAcrossCommit() boolean Yes supportsOpenStatementsAcrossRollback() boolean Yes supportsPositionedDelete() boolean Yes supportsPositionedUpdate() boolean Yes supportsRefCursors() boolean Yes supportsResultSetConcurrency(int type, int concurrency) boolean Yes supportsResultSetType(int type) boolean Yes supportsSchemasInIndexDefinitions() boolean Yes supportsSchemasInPrivilegeDefinitions() boolean Yes supportsSchemasInProcedureCalls() boolean Yes supportsSchemasInTableDefinitions() boolean Yes supportsSelectForUpdate() boolean Yes supportsStatementPooling() boolean Yes supportsStoredFunctionsUsingCallSyntax() boolean Yes supportsStoredProcedures() boolean Yes supportsSubqueriesInComparisons() boolean Yes supportsSubqueriesInExists() boolean Yes supportsSubqueriesInIns() boolean Yes supportsSubqueriesInQuantifieds() boolean Yes supportsTransactionIsolationLevel(int level) boolean Yes supportsTransactions() boolean Yes supportsUnion() boolean Yes supportsUnionAll() boolean Yes updatesAreDetected(int type) boolean Yes getTables(String catalog, String schemaPattern, String tableNamePattern, String[] types) ResultSet Yes getColumns(String catalog, String schemaPattern, String tableNamePattern, String columnNamePattern) ResultSet Yes getTableTypes() ResultSet Yes getUserName() String Yes isReadOnly() boolean Yes nullsAreSortedHigh() boolean Yes nullsAreSortedLow() boolean Yes nullsAreSortedAtStart() boolean Yes nullsAreSortedAtEnd() boolean Yes getDatabaseProductName() String Yes getDatabaseProductVersion() String Yes getDriverName() String Yes getDriverVersion() String Yes getDriverMajorVersion() int Yes getDriverMinorVersion() int Yes usesLocalFiles() boolean Yes usesLocalFilePerTable() boolean Yes supportsMixedCaseIdentifiers() boolean Yes storesUpperCaseIdentifiers() boolean Yes storesLowerCaseIdentifiers() boolean Yes supportsMixedCaseQuotedIdentifiers() boolean Yes storesUpperCaseQuotedIdentifiers() boolean Yes storesLowerCaseQuotedIdentifiers() boolean Yes storesMixedCaseQuotedIdentifiers() boolean Yes supportsAlterTableWithAddColumn() boolean Yes supportsAlterTableWithDropColumn() boolean Yes supportsColumnAliasing() boolean Yes nullPlusNonNullIsNull() boolean Yes supportsConvert() boolean Yes supportsConvert(int fromType, int toType) boolean Yes supportsTableCorrelationNames() boolean Yes supportsDifferentTableCorrelationNames() boolean Yes supportsExpressionsInOrderBy() boolean Yes supportsOrderByUnrelated() boolean Yes supportsGroupBy() boolean Yes supportsGroupByUnrelated() boolean Yes supportsGroupByBeyondSelect() boolean Yes supportsLikeEscapeClause() boolean Yes supportsMultipleResultSets() boolean Yes supportsMultipleTransactions() boolean Yes supportsNonNullableColumns() boolean Yes supportsMinimumSQLGrammar() boolean Yes supportsCoreSQLGrammar() boolean Yes supportsExtendedSQLGrammar() boolean Yes supportsANSI92EntryLevelSQL() boolean Yes supportsANSI92IntermediateSQL() boolean Yes supportsANSI92FullSQL() boolean Yes supportsIntegrityEnhancementFacility() boolean Yes supportsOuterJoins() boolean Yes supportsFullOuterJoins() boolean Yes supportsLimitedOuterJoins() boolean Yes isCatalogAtStart() boolean Yes supportsSchemasInDataManipulation() boolean Yes supportsSavepoints() boolean Yes supportsResultSetHoldability(int holdability) boolean Yes getResultSetHoldability() int Yes getDatabaseMajorVersion() int Yes getDatabaseMinorVersion() int Yes getJDBCMajorVersion() int Yes getJDBCMinorVersion() int Yes uppercaseAttributeName为true时,以下接口会将查询结果转为大写,可转换范围与java中的toUpperCase方法一致。 public ResultSet getProcedures(String catalog, String schemaPattern, String procedureNamePattern) public ResultSet getProcedureColumns(String catalog, String schemaPattern, String procedureNamePattern, String columnNamePattern) public ResultSet getTables(String catalog, String schemaPattern, String tableNamePattern, String[] types) public ResultSet getSchemas(String catalog, String schemaPattern) public ResultSet getColumns(String catalog, String schemaPattern, String tableNamePattern, String columnNamePattern) public ResultSet getColumnPrivileges(String catalog, String schema, String table, String columnNamePattern) public ResultSet getTablePrivileges(String catalog, String schemaPattern, String tableNamePattern) public ResultSet getBestRowIdentifier(String catalog, String schema, String table, int scope, boolean nullable) public ResultSet getPrimaryKeys(String catalog, String schema, String table) protected ResultSet getImportedExportedKeys(String primaryCatalog, String primarySchema, String primaryTable, String foreignCatalog, String foreignSchema, String foreignTable) public ResultSet getIndexInfo(String catalog, String schema, String tableName, boolean unique, boolean approximate) public ResultSet getUDTs(String catalog, String schemaPattern, String typeNamePattern, int[] types) public ResultSet getFunctions(String catalog, String schemaPattern, String functionNamePattern) getPartitionTablePrimaryKeys(String catalog, String schema, String table)接口用于获取分区表含全局索引的主键列,使用示例如下: PgDatabaseMetaData dbmd = (PgDatabaseMetaData)conn.getMetaData(); dbmd.getPartitionTablePrimaryKeys("catalogName", "schemaName", "tableName"); 父主题: JDBC接口参考
  • JDBC接口参考 JDBC接口是一套提供给用户的API方法,本节将对部分常用接口做具体描述,若涉及其他接口可参考JDK1.8(软件包)/JDBC 4.2中相关内容。 java.sql.Connection java.sql.CallableStatement java.sql.DatabaseMetaData java.sql.Driver java.sql.PreparedStatement java.sql.ResultSet java.sql.ResultSetMetaData java.sql.Statement javax.sql.ConnectionPoolDataSource javax.sql.DataSource javax.sql.PooledConnection javax.naming.Context javax.naming.spi.InitialContextFactory CopyManager PGReplicationConnection PGReplicationStream ChainedStreamBuilder ChainedCommonStreamBuilder PGobject 父主题: 基于JDBC开发
  • 容灾场景 某客户有两套数据库实例,其中A数据库实例为生产数据库实例,B数据库实例为容灾数据库实例。当客户执行容灾切换时,A数据库实例将降为容灾数据库实例,B数据库实例将升为生产数据库实例。此时为了避免修改配置文件导致的应用重启或重新发版,客户可在初始配置文件时,即将A、B数据库实例写入连接串中。此时在主数据库实例不可连接时,驱动将尝试对容灾数据库实例建连。例如A数据库实例为{node1,node2,node3}。B数据库实例为{node4,node5,node6}。 url可参考如下进行配置: jdbc:postgresql://node1,node2,node3,node4,node5,node6/database?priorityServers=3
  • 自动寻主场景 某客户存在一套集中式数据库实例,包含1主2备三个节点{node1,node2,node3},其中node1为主节点,node2、node3为备节点。 客户希望应用连接能建立在主DN上,并在发生主备切换时,自动选择新的主节点建连,则url可参考如下进行配置: jdbc:postgresql://node1,node2,node3/database?targetServerType=master
  • 高性能场景 某客户对于相同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
  • 示例:从MY迁移数据 下面示例演示如何通过CopyManager从MY向GaussDB进行数据迁移。执行示例前,需要加载驱动,驱动的获取和加载方法请参见JDBC包、驱动类和环境类。 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 // 认证用的用户名和密码直接写到代码中有很大的安全风险,建议在配置文件或者环境变量中存放(密码应密文存放,使用时解密),确保安全。 // 本示例以用户名和密码保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量(环境变量名称请根据自身情况进行设置)EXAMPLE_USERNAME_ENV和EXAMPLE_PASSWORD_ENV。 import java.io.StringReader; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import org.postgresql.copy.CopyManager; import org.postgresql.core.BaseConnection; public class Migration{ public static void main(String[] args) { String url = new String("jdbc:postgresql://$ip:$port/postgres"); //数据库URL String user = System.getenv("EXAMPLE_USERNAME_ENV"); //GaussDB用户名 String pass = System.getenv("EXAMPLE_PASSWORD_ENV"); //GaussDB密码 String tablename = new String("migration_table"); //定义表信息 String delimiter = new String("|"); //定义分隔符 String encoding = new String("UTF8"); //定义字符集 String driver = "org.postgresql.Driver"; StringBuffer buffer = new StringBuffer(); //定义存放格式化数据的缓存 try { //获取源数据库查询结果集 ResultSet rs = getDataSet(); //遍历结果集,逐行获取记录 //将每条记录中各字段值,按指定分隔符分割,由换行符结束,拼成一个字符串 //把拼成的字符串,添加到缓存buffer while (rs.next()) { buffer.append(rs.getString(1) + delimiter + rs.getString(2) + delimiter + rs.getString(3) + delimiter + rs.getString(4) + "\n"); } rs.close(); try { //建立目标数据库连接 Class.forName(driver); Connection conn = DriverManager.getConnection(url, user, pass); BaseConnection baseConn = (BaseConnection) conn; baseConn.setAutoCommit(false); //初始化表信息 String sql = "Copy " + tablename + " from STDIN DELIMITER " + "'" + delimiter + "'" + " ENCODING " + "'" + encoding + "'"; //提交缓存buffer中的数据 CopyManager cp = new CopyManager(baseConn); StringReader reader = new StringReader(buffer.toString()); cp.copyIn(sql, reader); baseConn.commit(); reader.close(); baseConn.close(); } catch (ClassNotFoundException e) { e.printStackTrace(System.out); } catch (SQLException e) { e.printStackTrace(System.out); } } catch (Exception e) { e.printStackTrace(); } } //******************************** // 从源数据库返回查询结果集 //********************************* private static ResultSet getDataSet() { ResultSet rs = null; try { Class.forName("com.mysql.jdbc.Driver").newInstance(); String userName = System.getenv("EXAMPLE_USERNAME_ENV"); String password = System.getenv("EXAMPLE_PASSWORD_ENV"); Connection conn = DriverManager.getConnection("jdbc:mysql://$ip:$port/database?useSSL=false&allowPublicKeyRetrieval=true", uesrName, password); Statement stmt = conn.createStatement(); rs = stmt.executeQuery("select * from migration_table"); } catch (SQLException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } return rs; } } 父主题: 基于JDBC开发
  • 示例:通过本地文件导入导出数据 在使用JAVA语言基于GaussDB进行二次开发时,可以使用CopyManager接口,通过流方式,将数据库中的数据导出到本地文件或者将本地文件导入数据库中,文件支持CSV、TEXT等格式。 示例如下,执行时需要加载GaussDB JDBC驱动,驱动的获取和加载方法请参见JDBC包、驱动类和环境类。 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 // 认证用的用户名和密码直接写到代码中有很大的安全风险,建议在配置文件或者环境变量中存放(密码应密文存放,使用时解密),确保安全。 // 本示例以用户名和密码保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量(环境变量名称请根据自身情况进行设置)EXAMPLE_USERNAME_ENV和EXAMPLE_PASSWORD_ENV。 import java.sql.Connection; import java.sql.DriverManager; import java.io.IOException; import java.io.FileInputStream; import java.io.FileOutputStream; import java.sql.SQLException; import org.postgresql.copy.CopyManager; import org.postgresql.core.BaseConnection; public class Copy{ public static void main(String[] args) { String urls = new String("jdbc:postgresql://$ip:$port/postgres"); //数据库URL String username = System.getenv("EXAMPLE_USERNAME_ENV"); //用户名 String password = System.getenv("EXAMPLE_PASSWORD_ENV"); //密码 String tablename = new String("migration_table"); //定义表信息 String tablename1 = new String("migration_table_1"); //定义表信息 String driver = "org.postgresql.Driver"; Connection conn = null; try { Class.forName(driver); conn = DriverManager.getConnection(urls, username, password); } catch (ClassNotFoundException e) { e.printStackTrace(System.out); } catch (SQLException e) { e.printStackTrace(System.out); } // 将SELECT * FROM migration_table查询结果导出到本地文件d:/data.txt try { copyToFile(conn, "d:/data.txt", "(SELECT * FROM migration_table)"); } catch (SQLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } //将d:/data.txt中的数据导入到migration_table_1中。 try { copyFromFile(conn, "d:/data.txt", tablename1); } catch (SQLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } // 将migration_table_1中的数据导出到本地文件d:/data1.txt try { copyToFile(conn, "d:/data1.txt", tablename1); } catch (SQLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } // 使用copyIn把数据从文件中导入数据库, public static void copyFromFile(Connection connection, String filePath, String tableName) throws SQLException, IOException { FileInputStream fileInputStream = null; try { CopyManager copyManager = new CopyManager((BaseConnection)connection); fileInputStream = new FileInputStream(filePath); copyManager.copyIn("COPY " + tableName + " FROM STDIN", fileInputStream); } finally { if (fileInputStream != null) { try { fileInputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } } // 使用copyOut把数据从数据库中导出到文件中 public static void copyToFile(Connection connection, String filePath, String tableOrQuery) throws SQLException, IOException { FileOutputStream fileOutputStream = null; try { CopyManager copyManager = new CopyManager((BaseConnection)connection); fileOutputStream = new FileOutputStream(filePath); copyManager.copyOut("COPY " + tableOrQuery + " TO STDOUT", fileOutputStream); } finally { if (fileOutputStream != null) { try { fileOutputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } } } 父主题: 基于JDBC开发
  • 示例3 常用数据类型使用示例 //bit类型使用示例,注意此处bit类型取值范围[0,1] Statement st = conn.createStatement(); String sqlstr = "create or replace function fun_1()\n" + "returns bit AS $$\n" + "select col_bit from t_bit limit 1;\n" + "$$\n" + "LANGUAGE SQL;"; st.execute(sqlstr); CallableStatement c = conn.prepareCall("{ ? = call fun_1() }"); //注册输出类型,位串类型 c.registerOutParameter(1, Types.BIT); c.execute(); //使用Boolean类型获取结果 System.out.println(c.getBoolean(1)); // money类型使用示例 // 表结构中包含money类型列的使用示例。 st.execute("create table t_money(col1 money)"); PreparedStatement pstm = conn.prepareStatement("insert into t_money values(?)"); // 使用PGobject赋值,取值范围[-92233720368547758.08,92233720368547758.07] PGobject minMoney = new PGobject(); minMoney.setType("money"); minMoney.setValue("-92233720368547758.08"); pstm.setObject(1, minMoney); pstm.execute(); // 使用PGMoney赋值,取值范围[-9999999.99,9999999.99] pstm.setObject(1,new PGmoney(9999999.99)); pstm.execute();
共100000条