2. JDBC 建立/关闭连接¶
KingbaseES JDBC 中提供了两种建立数据库连接的方法:通过 DriverManager 和 DataSource。
2.1. 使用 DriverManager 连接数据库¶
如果应用程序需要通过 KingbaseES JDBC 来访问和操纵 KingbaseES 数据库中的数据,则应在程序开始时先装载 KingbaseES 的 JDBC,可以使用以下语句完成该项工作:
Class.forName("com.kingbase8.Driver"); 或 DriverManager.registerDriver(new com.kingbase8.Driver());
Note
forName() 方法可能抛出一个 ClassNotFoundException,所以在程序中需要捕获该异常。
与数据库建立连接的标准方法是调用 DriverManager.getConnection 方法,它有以下三种调用格式:
-
getConnection(url, user, password)
-
getConnection(url, java.util.Properties)
-
getConnection(url)
DriverManager 类(即所谓的 JDBC 管理器)将尝试找到可与 URL 所代表的那个数据库进行连接的驱动程序。DriverManager 类存有已注册的 Driver 类清单,当调用方法 getConnection 时,它将检查清单中的每个驱动程序,直到找到可与 URL 中指定的数据库进行连接的驱动程序为止。
在 KingbaseES JDBC 中,数据库是用 URL 表示的。目前 KingbaseES JDBC 支持以下几种地址格式:
jdbc:kingbase8:database jdbc:kingbase8://host/database jdbc:kingbase8://host:port/database jdbc:kingbase8://host:port/database?para1=val1¶2=val2…
如果 host 是 IPv6 地址,则必须用中括号把地址括起来,如下所示:
jdbc:kingbase8://[IPv6host]:port/database?para1=val1¶2=val2…
Note
如果使用了Socks代理,此处IPv6地址需要使用冒分十六进制表示法,不能使用0位压缩表示法。
这里:
host 是数据库服务器的主机名或主机的 IP 地址。缺省是 "localhost"
port 是数据库服务器监听的端口号。KingbaseES 服务器的缺省端口号:54321;
database 是数据库名。
如果连接串中包含('%','?','&','/')等字符时,会对 JDBC 分析连接串造成影响。解决的办法有以下三种:
-
使用Properties。
将连接属性和其值存储在 Poperties 容器中,并调用 getConnection(String url, Properties props) 方法,获得连接。使用这种方法,连接属性中的特殊字符不需要做任何处理。但由于数据库名称必须存储在 url 中,所以这种方法不能处理数据库名称中含有特殊字符的情况。
-
使用转义字符处理过的 URL。
URL 的词法规则要求一些特殊字符必须经过转义才能被正确的识别。KingbaseES JDBC 使用的转义方法如下:
URLEncoder.encode(String arg1, System.getProperty("file.encoding"))
其中 arg1 为各种连接属性值,为待转义字符串。
URLEncoder 的转义规则如下:
-
字母数字字符 "a" 到 "z"、"A" 到 "Z" 和 "0" 到 "9" 保持不变。
-
特殊字符 "."、"-"、"*" 和 "_" 保持不变。
-
空格字符 " " 转换为一个加号 "+"。
-
所有其他字符都是不安全的,因此首先使用一些编码机制将它们转换为一个或多个字节。然后每个字节用一个包含 3 个字符的字符串 "%xy" 表示,其中 xy 为该字节的两位十六进制表示形式。其编码方式使用相应平台的默认编码。
另附:SQL Server 2005 的转义规则由于包含特殊字符(如空格、分号和引号),所以必须转义连接 URL 值的某些部分。如果这些字符包含在大括号中,则 JDBC 驱动程序将支持对其进行转义。例如:{;} 将转义分号。转义的值可以包含特殊字符(特别是“=”、“;”、“[]”和空格),但不能包含大括号。应将必须进行转义且包含大括号的值添加到属性集中。
-
例 2-1. 建立数据库连接的步骤
下面是通常情况下建立数据库连接所需的所有步骤的示例:
Connection con; Class.forName("com.kingbase8.Driver"); //加载驱动程序 String url = "jdbc:kingbase8://servername/testdb"; con = DriverManager.getConnection(url,"userID","passwd");
2.2. JDBC连接属性¶
除了标准的连接参数外,JDBC 驱动程序还提供了一些额外的连接参数去指定一些 JDBC 驱动程序的工作方式。这些参数或者可以在 connection URL 中设置,或者可以保存在一个 Properties object 中。以下例子分别使用以上两种方法建立一个不使用转义字符的连接:
String url = "jdbc:kingbase8://localhost/test"; java.util.Properties info = new java.util.Properties(); info.put ("user", "system"); info.put ("password", "manager"); Connection con = DriverManager.getConnection(url, info);
String url = "jdbc:kingbase8://localhost/test?user=system&password=manager"; Connection con = DriverManager.getConnection(url);
除以上方法外,当连接参数较多时,也可通过配置文件配置连接参数,此时需在连接串中添加参数ConfigurePath来指定配置文件的路径。
以下例子分别使用两种方式来建立读写分离的配置,以集群:node1[192.168.8.128:54321]、node2[192.168.8.223:54322]、node3[192.168.8.130:54323]为例:
只用连接串 开启JDBC读写分离 一主两备: URL jdbc:kingbase8://192.168.8.128:54321/test?USEDISPATCH=true &SLAVE_ADD=192.168.8.223,192.168.8.130&SLAVE_PORT=54322,54323&nodeList=node1,node2,node3
连接串+配置文件 开启JDBC读写分离 一主两备: URL jdbc:kingbase8://192.168.8.128:54321/test?ConfigurePath=jdbc.conf jdbc.conf配置文件 USEDISPATCH=true SLAVE_ADD=192.168.8.223,192.168.8.130 SLAVE_PORT=54322,54323 nodeList=node1,node2,node3
在连接中可以额外指定的连接参数如下:
DBNAME = String
指定要连接的数据库名称,默认值是null。(可以直接在JDBC URL中指定)
HOST = String
指定服务器的地址,默认值是null。(可以直接在JDBC URL中指定)
PORT = String
指定服务器的端口号,默认值是null。(可以直接在JDBC URL中指定)
user = String
指定连接数据库的用户名,默认值是null。
password = String
指定连接数据库的密码,默认值是null。
passwordEncryption = String
指定密码的加密方式,默认值是null,目前只支持base64。
protocolVersion = String
指定建立连接时采用的通信协议,当前只支持版本3,默认取值为:null
preferQueryMode = String
指定使用哪种模式发送查询给数据库。
“simple” 全部语句只发送Q报文,不发送parse/bind/execute报文。
“extended”全部语句都发送parse/bind/execute报文。
“extendedForPrepared”只有prepare 语句才发送parse/bind/execute报文。
“extendedCacheEveryting”和“extended”一样并且缓存每一条语句。默认值为 “extended”。
prepareThreshold
指定同一条prepare语句执行多少次后才启用服务器端prepare,默认值是5。
preparedStatementCacheQueries
指定prepare语句的最大缓存数目,默认值是256。
preparedStatementCacheSizeMiB
指定prepare语句的缓存最大大小(以兆字节为单位),默认值是5。
databaseMetadataCacheFields
指定数据库元数据的最大缓存数目,默认值是65536。
databaseMetadataCacheFieldsMiB
指定数据库元数据的缓存最大大小(以兆字节为单位),默认值是5。
defaultRowFetchSize
获取结果集行数的默认值,0意思是一次获取结果集的所有行,默认值是0。
loggerLevel = String
指定日志记录级别。日志记录级别为:"OFF", "WARNING", "INFO", "DEBUG", "TRACE",默认值是null。
loggerFile = String
指定日志信息文件的保存路径。可以是相对路径,也可以是绝对路径,如果为null则不生成日志文件,而是打印到控制台。如果有指定路径,则只打印到文件。例如:LogFile=e:\logFile.txt,默认值是null。
binaryTransfer = boolean
指定是否使用二进制格式发送和接收数据,默认值是true。
readOnly = boolean
指定连接是否为只读模式,默认值是false。
binaryTransferEnable = String
指定逗号分隔的类型列表以启用二进制传输。指定OID值或名称。
binaryTransferDisable = String
指定逗号分隔的类型列表以禁用二进制传输。指定OID值或名称。重写驱动程序缺省的和binaryTransferEnable设置的值。
stringtype = String
指定bind参数时设置类型为unspecified或者varchar,默认值是null。
unknownLength = String
指定未知长度类型的返回长度。默认值:“2147483647”
logUnclosedConnections = boolean
指定当未显式关闭的连接被垃圾回收时,是否从连接的打开记录堆栈跟踪泄漏源,默认值是false。
disableColumnSanitiser = boolean
指定是否启用禁用列名净化的优化器,默认值是false。
autosave = String
指定当一个查询失败时驱动如何做。
“always”每一个查询前都设置savepoint,失败是都回滚到savepoint。
“never”什么都不做。
“conservative”每一个查询前都设置savepoint,但是回滚只针对极少情况才做。默认值是never。
ssl = Boolean
指定在使用 JDBC 连接时,是否使用 SSL 安全方式传输数据,值为 true 和 false,默认是 false。
sslmode = String
指定控制 SSL 使用的参数,默认是 null。
sslfactory = String
指定使用 SSL 的 SSLSocketFactory 类,默认是 null。
sslfactoryarg = String
指定被转发到 SSLSocketFactory 类的构造函数的参数,默认是 null。
sslhostnameverifier = String
指定一个实现了 javax.net.ssl.HostnameVerifier ,且可以验证服务器的类,默认是 null。
sslcert = String
指定客户端SSL证书的位置,默认是 null。
sslkey = String
指定客户端 PKCS#8 SSL 密钥的位置,默认是 null。
sslrootcert = String
指定用于对服务器进行身份验证的根证书的位置,默认是 null。
sslpassword = String
指定客户端ssl密钥的密码(如果设置了 sslpasswordcallback ,则忽略),默认是 null。
sslpasswordcallback = String
指定一个实现了 javax.security.auth.callback.CallbackHandler ,且可以为 ssl 密码处理 PasssworCallback 的类,默认是 null。
tcpKeepAlive = Boolean
指定是否打开TCP的心跳保活机制,默认取值为:false
socketTimeout = String
指定底层socket receive的超时时间,单位是秒,值可以为任意正整数,“0”表示没有超时,一直等,直到返回,默认取值为:“0”。
loginTimeout = String
指定等待数据库建立连接的超时时间,单位是秒,默认取值为:“0”
connectTimeout = String
指定Socket做connect时的超时时间,单位是秒,默认取值为:“10”
cancelSignalTimeout = String
指定发送取消命令的超时时间,单位是秒,默认取值为:“10”
socketFactory = String
指定用于创建套接字的套接字工厂,默认取值为:null
socketFactoryArg = String
指定 SocketFactory 类的构造器的参数,默认取值为:null
receiveBufferSize = String
指定Socket做read时的buffer大小,“-1”意思是用系统默认值,默认取值为:“-1”
sendBufferSize = String
指定Socket做send时的buffer大小,“-1”意思是用系统默认值,默认取值为:“-1”
clientEncoding = String
指定客户端的编码格式,值为null时采用jvm的编码格式,默认取值为:null
assumeMinServerVersion = String
假设服务器至少是这个版本,默认取值为:null
ApplicationName = String
指定应用程序的名称(后端>= V8R6 ),默认取值为:Kingbase8 JDBC Driver
jaasApplicationName = String
指定JAAS系统或应用程序登录配置的名称,默认取值为:null
kerberosServerName = String
指定使用GSSAPI进行身份验证时要使用的Kerberos服务名称,默认取值为:null
useSpnego = boolean
指定是否在SSPI身份验证请求中使用SPNEGO,默认取值为:false
gsslib = String
指定强制SSPI或GSSAPI,取值可以为auto、sspi、gssapi,默认取值为:auto
sspiServiceClass = String
指定用于SPN的Windows SSPI服务类,默认取值为:null
allowEncodingChanges = boolean
指定是否允许更改clientEncoding,默认取值为:false
currentSchema = String
指定要在搜索路径中设置的模式,默认取值为:null
targetServerType = String
指定要连接的服务器类型,取值可以为any、master、slave、preferSlave,默认取值为:any
loadBalanceHosts = boolean
如果禁用,主机按照给定的顺序连接。如果启用,从合适的候选集合中随机选择启用的主机,默认取值为:false
hostRecheckSeconds = String
指定检查主机状态的周期,以防它们发生更改,单位是秒,默认取值为:“10”
reWriteBatchedInserts = boolean
指定是否启用优化以重写和折叠批处理的兼容性INSERT语句,默认取值为:false
replication = String
指定启动报文的连接参数replication的值(true,database)。布尔值 true 告诉后端进入 walsender 模式,其中可以发出一小组复制命令而不是SQL语句。在 walsender 模式下只能使用简单查询协议。将数据库作为值传递指示walsender连接到dbname参数中指定的数据库,这将允许连接用于从该数据库进行逻辑复制(后端 >= 8.6),默认取值为:null
ConfigurePath = String
指定配置文件的路径,只能在连接串中配置,值为null时,不读取配置文件,默认取值为:null。当连接参数较多时,可通过配置文件配置连接参数。当文件中配置的连接参数与URL中的参数重复时,会覆盖掉URL中的参数值
TransactionDispatchStrategy = String
指定事务中的分发策略,1表示事务都不分发,2表示事务中的写语句之前的读语句可以分发,默认取值为:“2”。此功能开启需要同时开启读写分离功能。
USEDISPATCH = Boolean
指定是否使用读写分离功能,默认取值为:false。此配置项关闭JDBC就变成单机JDBC,无读写分离功能。
HOSTLOADRATE = String
指定主机负载率,默认取值为:“0”。此功能开启需要同时开启读写分离功能。根据当前发给主机的语句数目与总语句数目的比例与HOSTLOADRATE设置的比例进行比较,当前者大于后者时,发给备机,否则发给主机,当总语句数目达到Integer.MAX_VALUE时,用当前分发的实际比例的分子分母更新当前发给主机的语句数目与总语句数目。
SLAVE_ADD = String
指定备机地址,可指定多个,用“,”隔开。此功能开启需要同时开启读写分离功能。
SLAVE_PORT = String
指定备机端口,与备机地址一一对应,可指定多个,用“,”隔开。此功能开启需要同时开启读写分离功能且设置备机地址。
MASTER_CHECK = Boolean
指定是否在新建连接时检查当前连接数据库是否为master,如果不是则去slave中检查有没有master,如果还是找不到就会向上报错,默认取值为:true。此功能开启需要同时开启读写分离功能。
MONITORINTERVAL = String
指定集群检测线程每次检测的时间间隔,单位是秒,默认取值为:“5”。此功能开启需要同时开启读写分离功能和集群备机检测功能。
RETRYTIMES = String
指定失败重发的最高次数,默认取值为:“10”。此功能开启需要同时开启读写分离功能。
RETRYINTERVAL = String
指定每次失败重发之间的时间间隔,单位是秒,默认取值为:“5”。此功能开启需要同时开启读写分离功能且重试次数大于0。
WhiteList = String
WhiteList指定只读函数列表,可指定多个,各个函数之间用分号分隔,如:WhiteList=MAX;COUNT;AVG 这样,默认取值为:null。目前只支持函数名字的比较,不支持函数名重载的区分。此功能开启需要同时开启读写分离功能。
BlackList = String
默认情况下认为函数都是只读的,BlackList指定写函数列表,可指定多个,各个函数之间用分号分隔,如:BlackList=updateXXX;writeXXX 这样,默认取值为:null。目前只支持函数名字的比较,不支持函数名重载的区分。不与WhiteList同时配置,与WhiteList同时配置时,只有BlackList生效。此功能开启需要同时开启读写分离功能。
MasterFunctionList = String
指定只发主机,但不改变事务状态的函数语句列表,可指定多个,各个函数之间用分号分隔,如:MasterFunctionList=updateXXX;writeXXX 这样,默认取值为:null。目前只支持函数名字的比较,不支持函数名重载的区分。此功能开启需要同时开启读写分离功能。
TempTable = String
指定临时表,如果是查询临时表的查询语句,则只发主机且不改变事务状态。可指定多个,各个表名之间用分号分隔,如:aaa;bbb这样,默认取值为:null。此功能开启需要同时开启读写分离功能。
BlackSqlList = String
指定只发主机,但不改变事务状态的sql语句列表,可指定多个,各个语句之间用分号分隔,如:BlackSqlList=SET TRANSACTION READ WRITE;BEGIN READ WRITE 这样,默认取值为:null。此功能开启需要同时开启读写分离功能。
nodeList = String
指定各节点的名称,各节点的名称为./repmgr cluster show命令查询出的Name字段。要求开启读写分离时必须配置此项,不允许为空并要与节点的地址配置顺序完全一致。各个节点名称之间用逗号分隔,如:nodeList=node1,node2,node3。
readListStrategy = String
指定可分发节点选择列表策略,1表示所有在线节点均可分发,2表示只分发主节点和同步备机节点,默认取值为:“1”。此功能开启需要同时开启读写分离功能。
escapeSyntaxCallMode = String
指定驱动程序如何将JDBC转义调用语法转换为底层SQL,以调用过程或函数。
“select”表示驱动始终使用select语句。
“callIfNoReturn”表示如果没有指定返回参数,则驱动使用call语句,否则驱动使用select语句。
“call”表示驱动始终使用call语句。默认值为call。
readOnlyMode = String
指定连接设置为只读时的处理行为。
“ignore”表示设置readOnly无效。
“transaction”表示当readOnly为true且为非自动提交时事务为只读事务。
“always”表示当readOnly为true时,如果为自动提交事务模式,会话将设置为只读,如果为非自动提交模式,事务将开始只读。默认值为“transaction”。
useFetchSizeInAutoCommit = Boolean
指定是否在自动提交模式下使用按需执行的功能,默认取值为false。使用时需打开服务器自动提交模式下的按需执行功能,同时指定参数defaultRowFetchSize。
nullConvertEmptyLob = Boolean
指定当驱动接收到数据库返回的大对象为null时,驱动返回给上层空的大对象还是null,默认返回空大对象,即默认值为true。
initParams = String
指定用来初始化数据库连接的session级参数,可指定多个,各个参数之间用分号进行分隔,如initParams=client_encoding='UTF8';extra_float_digits=2,默认值为null。
optimizeBatchedDML = Boolean
指定是否开启批量INSERT、UPDATE、DELETE、MERGE优化,批量是指JDBC标准批量处理接口executeBatch,默认取值为:false,即不开启。该参数要求待执行SQL必须包含占位符,同时如果设置了reWriteBatchedInserts=true 或者preferQueryMode=simple,那么该参数会被忽略。开启该参数后,批量执行返回的数组第一个位置为所有影响行数之和,其余位置为0。该参数需要2021年7月15号以后的V8R6C4版本的数据库才能支持。
storeCase = String
指定数据库存储SQL标识符的大小写形式,取值可以为lower、upper和original,默认值是lower。storeCase为lower时,DatabaseMetaData的storesLowerCaseIdentifiers()返回true,storesUpperCaseIdentifiers()和storesMixedCaseIdentifiers()返回false。storeCase为upper时,storesUpperCaseIdentifiers()返回true,其余二者返回false。storeCase为original时,storesMixedCaseIdentifiers()返回true,其余二者返回false。
zipLevel = String
指定通信传输压缩的比率,取值范围为0~9的整数值,0表示不进行压缩,9表示最高压缩比率。使用时需依赖C库,通过java.library.path指定其路径。Windows下为compresskb.dll和compresskb.lib(可通过PATH指定其路径),Linux下为libcompresskb.so(通过LD_LIBRARY_PATH指定其路径)。该功能适用于网络IO为瓶颈(带宽小于100Mb)的情况。该参数需要2021年12月31号以后的V8R6C5版本的数据库才能支持。注意:传输压缩,需要双发压缩和解压协议消息,因此会带来额外CPU开销,如果网络不是瓶颈,那么开启压缩反而会降低性能。
structType = String
指定数据库复合类型返回的数据类型,取值可以为Struct(即返回java.sql.Struct)和KBobject(即返回com.kingbase8.util.KBobject),默认值是null,即返回KBobject。注意:a.如果返回Struct类型,Struct中包含字符串类型的字段值,该值两端有双引号且个数不匹配时,取值会出现错误。
b.如果以Struct类型作为绑定参数,Struct中包含二进制类型的字段值,该值中包含转义字符、中文等,无法正确处理(存值时报错,或存取值不对)。
2.3. 使用 DataSource 连接数据库¶
连接(Connection)是客户端 Java 应用程序与数据库服务器之间的通信连接,由 KingbaseES JDBC 建立,在应用程序的代码中使用数据库之前,必须获取一个数据库连接。在 KingbaseES JDBC中,连接是通过 java.sql.Connection 接口实现。创建一个连接后,可以调用它的方法获得和设置连接、管理事务和创建语句对象等。
DataSource 接口是在 JDBC 3.0 的规范中定义的另外一种获取数据源连接的方法。使用 DataSource 进行数据库连接可以提高应用程序的可移植性,因为应用程序使用一个逻辑名称建立与数据库的连接,该逻辑名通过使用 JNDI(Java Naming and Directory Interface) 命名服务映射到真正的 DataSource 对象,该 DataSource 对象表示了一个真正的数据库连接。如果数据源的信息发生变化,只需修改该 DataSource 对象的属性,而不需要修改应用程序。
DataSource 对象是推荐使用的方法,它使得应用程序更容易移植和维护,而且应用程序可以透明地使用连接池和分布事务的功能。J2EE 组件多通过 DataSource 对象与数据源建立连接的。
DataSource 接口的实现可以提供连接池的功能,也可以不提供。在基本的 DataSource 接口的实现中,客户的连接对象与物理的数据库连接是一对一的关系,当连接对象关闭的时候,物理的数据库连接也要关闭,因此,每个客户连接都要打开、初始化和关闭一次物理的数据库连接,这显然降低系统的性能。连接池则维护了一组物理的数据库连接,在客户间重用来提高性能和可扩展性。
当连接串的属性中包括('/', '&', '?', '%')等特殊字符时,DataSource 可以提供另外一种解决方法(请参考“使用 DriverManager 连接数据库”一节)。用户可以通过以下提供的 setXXX 方法在 DataSource 初始化时设置连接属性。此时不必对连接串中的特殊字符进行转义。
KingbaseES JDBC 在 KBSimpleDataSource 类中实现了 DataSource 接口,在 Jdbc3PoolingDataSource 类中实现了具有连接池功能的 DataSource 接口。下面分别介绍它们的使用方式。
2.3.1. 使用 DataSource 连接数据库(不使用JNDI)¶
通过 DataSource 来建立连接的过程主要分为以下几个步骤:
-
创建 KBSimpleDataSource
创建一个 KingbaseES 的 DataSource,要执行以下语句:
KBSimpleDataSource ds = new KBSimpleDataSource();
-
初始化连接属性
标准的 DataSource 属性包括:databaseName,password, portNumber,serverName,user。
用户通过以下方法来对这些属性进行设置:
setDatabaseName(String dbname); setPassword(String pwd); setPortNumber(int pn); setServerName(String sn); setUser(String user);
这里的赋值实际上是指定了建立一个物理连接所需要的属性。
例 2-2. 获得一个Connection实例
用户在应用程序中可以通过如下方法来获得一个 Connection 实例:
Connection conn=ds.getConnection("user","pwd"); //没有使用 setPassword()、setUser()方法 或者: Connection conn=ds.getConnection(); //已经使用过 setPassword()、setUser()方法
2.3.2. 使用 DataSource 连接数据库(使用 JNDI)¶
JNDI(Java Naming and directory Interface),Java 名字目录接口,是 J2EE 提供的名字服务(J2SE 中需要获取额外的类包才可实现同样功能)。JNDI 机制由一个通用的客户机接口和一组 JNDI 提供者组成,提供者用于定义后台名字系统。
KingbaseES JDBC 驱动程序提供通过 JNDI 查找方式来获取数据源的方法,其步骤如下:
-
建立数据源
例 2-3. 建立数据源
KBSimpleDataSource ds = new KBSimpleDataSource(); ds.setDatabaseName("test") ; ds.setUser("system") ; ds.setPassword("manager") ; ds.setPortNumber(54321) ; (通过JNDI绑定数据源) Context ctx = null; try { Hashtable env = new Hashtable (5); env.put (Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.fscontext.RefFSContextFactory"); env.put (Context.PROVIDER_URL, "file:/job/jndi"); //"file:/job/jndi"中,要在本程序运行的盘上建立目录job和其子目录jndi ctx = new InitialContext(env); } catch (NamingException ne) { ne.printStackTrace(); } ctx.rebind("DataSource", ds);//绑定JNDI和数据源
特别说明:此段程序运行,需要从 Oracle Java Technologies | Oracle 下载两个 jar文件,其名字分别为:fscontext.jar 和 providerutil.jar(这两个类包文件在同一个压缩文件中,目前最新的名字为fscontext-1_2-beta3.zip,以后其名可能会发生变化)。
-
通过 JNDI 查找来获取数据源
例 2-4. 通过 JNDI 查找来获取数据源
Context ctx2 = null; //开始使用数据源 try { Hashtable env = new Hashtable (5); env.put (Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.fscontext.RefFSContextFactory"); env.put (Context.PROVIDER_URL, "file:/job/jndi"); ctx2 = new InitialContext(env); } catch (NamingException ne) { ne.printStackTrace(); } //通过 JNDI 查找到数据源 DataSource ds2 = (DataSource)ctx2.lookup("DataSource");
-
使用数据源做 SQL 语句处理
例 2-5. 使用数据源做 SQL 语句处理
Connection conn = ds2.getConnection(); Statement stmt = conn.createStatement() ; String sql = "select * from tu9"; ResultSet rs = stmt.executeQuery( sql ) ; while ( rs.next() ) { System.out.print(rs.getString("name") + rs.getString("nick")) ; } System.out.println(); rs.close() ; stmt.close() ; conn.close(); 例如: //程序开始 import java.sql.*; import javax.sql.*; import javax.naming.*; import java.util.*; import com.kingbase8.ds.*; public class example1 { public static void main(String [] args) { try { KBSimpleDataSource ds = new KBSimpleDataSource(); ds.setDatabaseName("test") ; ds.setUser("system") ; ds.setPassword("manager") ; ds.setPortNumber(54321) ; //建立 JNDI 的环境 Context ctx = null; try { Hashtable env = new Hashtable (5); env.put (Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.fscontext.RefFSContextFactory"); env.put (Context.PROVIDER_URL, "file:/job/jndi"); ctx = new InitialContext(env); } catch (NamingException ne) { ne.printStackTrace(); } ctx.rebind("DataSource", ds);//绑定JNDI和数据源 //开始使用数据源 Context ctx2 = null; try { Hashtable env = new Hashtable (5); env.put (Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.fscontext.RefFSContextFactory"); env.put (Context.PROVIDER_URL, "file:/job/jndi"); ctx2 = new InitialContext(env); } catch (NamingException ne) { ne.printStackTrace(); } //通过JNDI查找到数据源 DataSource ds2 = (DataSource)ctx2.lookup("DataSource"); try { Connection conn = ds2.getConnection(); Statement stmt = conn.createStatement() ; stmt.executeUpdate( "create table dataSource (id int)"); stmt.executeUpdate( "insert into dataSource values (1)"); ResultSet rs = stmt.executeQuery( "select * from dataSource"); while(rs.next()) { System.out.println("id:"+ rs.getInt(1)); } stmt.executeUpdate("drop table dataSource"); rs.close(); stmt.close(); conn.close(); } catch(SQLException e) { e.printStackTrace() ; } } catch(Exception e) { e.printStackTrace() ; } } } //程序结束
2.3.3. 连接池¶
Jdbc3PoolingDataSource 类是实现了 DataSource 接口的数据库连接池的管理类。
使用 Jdbc3PoolingDataSource 类可以提高程序的运行效率。建立数据库连接将耗费大量的资源,而把连接放到池中,可以节省大量的建立新连接的开销。
使用方法如下:
-
创建 Jdbc3PoolingDataSource 对象。
Jdbc3PoolingDataSource ds = new Jdbc3PoolingDataSource();
-
设置相应属性。
ds.setDataSourceName("A Data Source");//设置数据源的名字 ds.setDatabaseName("test") ;//设置数据库名 ds.setUser("system") ;//设置用户名 ds.setPassword("manager") ;//设置密码 ds.setMaxConnections(10) ;//设置最大连接数 ds.setInitialConnections(10) ;//设置初始连接数 ds.setPortNumber(54321) ;//设置数据库相应的端口号
-
获取连接。
Connection conn = ds.getConnection() ;
-
查建立 SQL 语句,执行相应的操作。
Statement stmt = conn.createStatement() ; String sql = "select * from tu9"; ResultSet rs = stmt.executeQuery( sql ) ; while ( rs.next() ) { System.out.print(rs.getString("name")+ rs.getString("nick")) ; } System.out.println(); rs.close() ; stmt.close() ;
-
关闭连接。
conn.close();
-
关闭池。
ds.close();
说明:池建立一次即可,最好放在系统初始化时执行;在系统退出时,再执行关闭池的操作。
例如:
例 2-6. 连接池的使用
//程序开始 import java.sql.*; import javax.sql.*; import java.util.*; import com.kingbase8.jdbc3.*; import com.kingbase8.*; public class example2 { public static void main(String [] args) throws Exception { Jdbc3PoolingDataSource ds = new Jdbc3PoolingDataSource(); ds.setDataSourceName("A Data Source") ; ds.setDatabaseName("test") ; ds.setUser("system") ; ds.setPassword("manager") ; ds.setMaxConnections(10) ; ds.setInitialConnections(10) ; ds.setPortNumber(54321) ; Connection conn = ds.getConnection() ; Statement stmt = conn.createStatement() ; stmt.executeUpdate("create table pool (id int)"); stmt.executeUpdate("insert into pool values (1)"); ResultSet rs = stmt.executeQuery("select * from pool"); while(rs.next()) { System.out.println("id:"+ rs.getInt(1)); } stmt.executeUpdate("drop table pool"); rs.close(); stmt.close(); conn.close(); ds.close(); } }
使用具有连接池功能的连接方法也可以通过 JDNI 方式建立数据库连接,方法与 使用 DataSource 连接数据库(使用 JNDI) 中的方法相同。
2.4. 关闭与数据库的连接¶
要关闭与数据库的连接,只需要对连接对象 conn 调用 close()方法:
conn.close();
2.5. JDBC Driver API¶
public Connection connect(String url, Properties info)
功能:
试图创建一个到给定 URL 的数据库连接。如果驱动程序识别出它是连接到给定 URL 的错误类型的驱动程序,那么它应该返回 "null"。
参数:
url - 要连接到的数据库的 URL;
info - 做为连接参数的任意字符串标记/值对的列表。通常至少应该包括 "user" 和 "password" 属性。
返回值:
表示到 URL 的连接的 Connection 对象。
public boolean acceptsURL(String url)
功能:
查询驱动程序是否认为它可以打开到给定 URL 的连接。
参数:
url - 数据库的 URL。
返回值:
如果此驱动程序理解给定的 URL,则返回 true;否则,返回 false。
public DriverPropertyInfo[] getPropertyInfo(String url,Properties info)
功能:
获得此驱动程序的可能属性信息。
参数:
url - 要连接到的数据库的 URL;
info - 将要在打开的连接上发送的标记/值对的建议列表。
返回值:
描述可能属性的 DriverPropertyInfo 对象的数组。如果不需要任何属性,该数组可能是一个空数组。
public int getMajorVersion()
功能:
获取此驱动程序的主版本号。
返回值:
此驱动程序的主版本号。
public int getMinorVersion()
功能:
获得此驱动程序的次版本号。
返回值:
此驱动程序的次版本号。
public boolean jdbcCompliant()
功能:
报告此驱动程序是否是一个真正的 JDBC CompliantTM 驱动程序。
返回值:
如果此驱动程序是 JDBC 兼容的,则返回 true;否则,返回 false。
2.6. JDBC Connection API¶
public Statement createStatement()
功能:
创建一个 Statement 对象来将 SQL 语句发送到数据库。不带参数的 SQL 语句通常使用 Statement 对象执行。如果多次执行相同的 SQL 语句,使用 PreparedStatement 对象可能更有效。
返回值:
一个新的默认 Statement 对象。
public PreparedStatement prepareStatement(String sql)
功能:
创建一个 PreparedStatement 对象来将参数化的 SQL 语句发送到数据库。带有 IN 参数或不带有 IN 参数的 SQL 语句都可以被预编译并存储在 PreparedStatement 对象中。然后可以有效地使用此对象来多次执行该语句。
参数:
sql - 可能包含一个或多个 '?' IN 参数占位符的 SQL 语句。
返回值:
包含预编译 SQL 语句的新的默认 PreparedStatement 对象。
public CallableStatement prepareCall(String sql)
功能:
创建一个 CallableStatement 对象来调用数据库存储过程。CallableStatement 对象提供了设置其 IN 和 OUT 参数的方法,以及用来执行调用存储过程的方法。
参数:
sql - 可以包含一个或多个 '?' 参数占位符的 SQL 语句。通常此语句是使用 JDBC 调用转义语法指定的。
返回值:
包含预编译 SQL 语句的新的默认 CallableStatement 对象。
public void setAutoCommit(boolean autoCommit)
功能:
将此连接的自动提交模式设置为给定状态。如果连接处于自动提交模式下,则它的所有 SQL 语句将被执行并作为单个事务提交。否则,它的 SQL 语句将聚集到事务中,直到调用 commit 方法或 rollback 方法为止。默认情况下,新连接处于自动提交模式。
参数:
autoCommit - 为 true 表示启用自动提交模式;为 false 表示禁用自动提交模式。
public boolean getAutoCommit()
功能:
获取此 Connection 对象的当前自动提交模式。
返回值:
此 Connection 对象的自动提交模式的当前状态。
public void commit()
功能:
使所有上一次提交/回滚后进行的更改成为持久更改,并释放此 Connection 对象当前持有的所有数据库锁。此方法只应该在已禁用自动提交模式时使用。
public void rollback()
功能:
取消在当前事务中进行的所有更改,并释放此 Connection 对象当前持有的所有数据库锁。此方法只应该在已禁用自动提交模式时使用。
public void close()
功能:
立即释放此 Connection 对象的数据库和 JDBC 资源,而不是等待它们被自动释放。
public boolean isClosed()
功能:
查询此 Connection 对象是否已经被关闭。如果在连接上调用了 close 方法或者发生某些严重的错误,则连接被关闭。只有在调用了 Connection.close 方法之后被调用时,此方法才保证返回 true。
返回值:
如果此 Connection 对象是关闭的,则返回 true;如果它仍然处于打开状态,则返回 false。
public DatabaseMetaData getMetaData()
功能:
获取一个 DatabaseMetaData 对象,该对象包含关于此 Connection 对象所连接的数据库的元数据。元数据包括关于数据库的表、受支持的 SQL 语法、存储过程、此连接功能等等的信息。
返回值:
此 Connection 对象的一个 DatabaseMetaData 对象。
public void setReadOnly(boolean readOnly)
功能:
将此连接设置为只读模式,作为驱动程序启用数据库优化的提示。
参数:
readOnly - 为 true 表示启用只读模式;为 false 表示禁用只读模式。
public boolean isReadOnly()
功能:
查询此 Connection 对象是否处于只读模式。
返回值:
如果此 Connection 对象是只读的,则返回 true;否则返回 false。
public String getCatalog()
功能:
获取此 Connection 对象的当前目录名称。
返回值:
当前目录名称;如果不存在,则返回 null。
public void setTransactionIsolation(int level)
功能:
试图将此 Connection 对象的事务隔离级别更改为给定的级别。可能的事务隔离级别是 Connection 接口中定义的常量。
参数:
level - 以下 Connection 常量之一:
Connection.TRANSACTION_READ_UNCOMMITTED
Connection.TRANSACTION_READ_COMMITTED
Connection.TRANSACTION_REPEATABLE_READ
Connection.TRANSACTION_SERIALIZABLE
(注意,不能使用 Connection.TRANSACTION_NONE,因为它指定了不受支持的事务。)
public int getTransactionIsolation()
功能:
获取此 Connection 对象的当前事务隔离级别。
返回值:
当前事务隔离级别,它将是以下常量之一:
Connection.TRANSACTION_READ_UNCOMMITTED
Connection.TRANSACTION_READ_COMMITTED
Connection.TRANSACTION_REPEATABLE_READ
Connection.TRANSACTION_SERIALIZABLE
Connection.TRANSACTION_NONE。
public SQLWarning getWarnings()
功能:
获取此 Connection 对象上的调用报告的第一个警告。如果有多个警告,则后续警告将被链接到第一个警告,可以通过对之前获得的警告调用 SQLWarning.getNextWarning 方法获取。
返回值:
第一个 SQLWarning 对象;如果不存在,则返回 null。
public void clearWarnings()
功能:
清除为此 Connection 对象报告的所有警告。调用此方法后,在为此 Connection 对象报告新的警告前,getWarnings 方法将返回 null。
public Statement createStatement(int resultSetType,int resultSetConcurrency)
功能:
创建一个 Statement 对象,该对象将生成具有给定类型和并发性的 ResultSet 对象。此方法与上述 createStatement 方法相同,但它允许重写默认结果集类型和并发性。已创建结果集的可保存性可调用 getHoldability() 确定。
参数:
resultSetType - 结果集类型,它是
ResultSet.TYPE_FORWARD_ONLY
ResultSet.TYPE_SCROLL_INSENSITIVE
ResultSet.TYPE_SCROLL_SENSITIVE
之一。
resultSetConcurrency - 并发类型,它是
ResultSet.CONCUR_READ_ONLY
ResultSet.CONCUR_UPDATABLE
之一。
返回值:
一个新的 Statement 对象,该对象将生成具有给定类型和并发性的 ResultSet 对象。
public PreparedStatement prepareStatement(String sql,int resultSetType,int resultSetConcurrency)
功能:
创建一个 PreparedStatement 对象,该对象将生成具有给定类型和并发性的 ResultSet 对象。此方法与上述 prepareStatement 方法相同,但它允许重写默认结果集类型和并发性。已创建结果集的可保存性可调用 getHoldability() 确定。
参数:
sql - 一个 String 对象,它是将被发送到数据库的 SQL 语句,可以包含一个或多个 '?' IN 参数;
resultSetType - 结果集类型,它是
ResultSet.TYPE_FORWARD_ONLY
ResultSet.TYPE_SCROLL_INSENSITIVE
ResultSet.TYPE_SCROLL_SENSITIVE
之一。
resultSetConcurrency - 并发类型,它是
ResultSet.CONCUR_READ_ONLY
ResultSet.CONCUR_UPDATABLE
之一 。
返回值:
包含预编译的 SQL 语句的新 PreparedStatement 对象,该对象将生成具有给定类型和并发性的 ResultSet 对象。
public CallableStatement prepareCall(String sql,int resultSetType,int resultSetConcurrency)
功能:
创建一个 CallableStatement 对象,该对象将生成具有给定类型和并发性的 ResultSet 对象。此方法与上述 prepareCall 方法相同,但它允许重写默认结果集类型和并发性。已创建结果集的可保存性可调用 getHoldability() 确定。
参数:
sql - 一个 String 对象,它是将被发送给数据库的 SQL 语句,可以包含一个或多个 '?' 参数;
resultSetType - 结果集类型,它是
ResultSet.TYPE_FORWARD_ONLY
ResultSet.TYPE_SCROLL_INSENSITIVE
ResultSet.TYPE_SCROLL_SENSITIVE
之一。
resultSetConcurrency - 并发类型,它是
ResultSet.CONCUR_READ_ONLY
ResultSet.CONCUR_UPDATABLE
之一。
返回值:
一个包含预编译的 SQL 语句的新 CallableStatement 对象,该对象将生成具有给定类型和并发性的 ResultSet 对象。
public void setHoldability(int holdability)
功能:
将使用此 Connection 对象创建的 ResultSet 对象的默认可保存性 (holdability) 更改为给定可保存性。ResultSet 对象的默认可保存性可调用 DatabaseMetaData.getResultSetHoldability() 确定。
参数:
holdability - ResultSet 的可保存性常量,它是
ResultSet.HOLD_CURSORS_OVER_COMMIT
ResultSet.CLOSE_CURSORS_AT_COMMIT
之一。
public int getHoldability()
功能:
获取使用此 Connection 对象创建的 ResultSet 对象的当前可保存性。
返回值:
可保存性,它是 ResultSet.HOLD_CURSORS_OVER_COMMIT 或 ResultSet.CLOSE_CURSORS_AT_COMMIT 之一。
public Savepoint setSavepoint()
功能:
在当前事务中创建一个未命名的保存点 (savepoint),并返回表示它的新 Savepoint 对象。
返回值:
新的 Savepoint 对象。
public Savepoint setSavepoint(String name)
功能:
在当前事务中创建一个具有给定名称的保存点,并返回表示它的新 Savepoint 对象。
参数:
name - 包含保存点名称的 String。
返回值:
新的 Savepoint 对象。
public void rollback(Savepoint savepoint)
功能:
取消所有设置给定 Savepoint 对象之后进行的更改。
参数:
savepoint - 要回滚到的 Savepoint 对象。
public void releaseSavepoint(Savepoint savepoint)
功能:
从当前事务中移除指定的 Savepoint 和后续 Savepoint 对象。在已移除保存点之后,对该保存点的任何引用都会导致抛出 SQLException。
参数:
savepoint - 要移除的 Savepoint 对象。
public Statement createStatement(int resultSetType,int resultSetConcurrency,int resultSetHoldability)
功能:
创建一个 Statement 对象,该对象将生成具有给定类型、并发性和可保存性的 ResultSet 对象。此方法与上述 createStatement 方法相同,但它允许重写默认结果集类型、并发性和可保存性。
参数:
resultSetType - 以下 ResultSet常量之一:
ResultSet.TYPE_FORWARD_ONLY
ResultSet.TYPE_SCROLL_INSENSITIVE
ResultSet.TYPE_SCROLL_SENSITIVE
resultSetConcurrency - 以下 ResultSet常量之一:
ResultSet.CONCUR_READ_ONLY
ResultSet.CONCUR_UPDATABLE
resultSetHoldability - 以下 ResultSet常量之一:
ResultSet.HOLD_CURSORS_OVER_COMMIT
ResultSet.CLOSE_CURSORS_AT_COMMIT
返回值:
一个新的 Statement 对象,该对象将生成具有给定类型、并发性和可保存性的 ResultSet 对象。
public PreparedStatement prepareStatement(String sql,int resultSetType,int resultSetConcurrency,int resultSetHoldability)
功能:
创建一个 PreparedStatement 对象,该对象将生成具有给定类型、并发性和可保存性的 ResultSet 对象。
参数:
sql - 一个 String 对象,它是将被发送到数据库的 SQL 语句,可以包含一个或多个 '?' IN 参数;
resultSetType - 以下 ResultSet常量之一:
ResultSet.TYPE_FORWARD_ONLY
ResultSet.TYPE_SCROLL_INSENSITIVE
ResultSet.TYPE_SCROLL_SENSITIVE
resultSetConcurrency - 以下 ResultSet常量之一:
ResultSet.CONCUR_READ_ONLY
ResultSet.CONCUR_UPDATABLE
resultSetHoldability - 以下 ResultSet常量之一:
ResultSet.HOLD_CURSORS_OVER_COMMIT
ResultSet.CLOSE_CURSORS_AT_COMMIT
返回值:
一个包含预编译 SQL 语句的新 PreparedStatement 对象,该对象将生成具有给定类型、并发性和可保存性的 ResultSet 对象。
public CallableStatement prepareCall(String sql,int resultSetType,int resultSetConcurrency,int resultSetHoldability)
功能:
创建一个 CallableStatement 对象,该对象将生成具有给定类型和并发性的 ResultSet 对象。此方法与上述 prepareCall 方法相同,但它允许重写默认结果集类型、结果集并发性类型和可保存性。
参数:
sql - 一个 String 对象,它是将被发送到数据库的 SQL 语句,可以包含一个或多个 '?' 参数;
resultSetType - 以下 ResultSet常量之一:
ResultSet.TYPE_FORWARD_ONLY
ResultSet.TYPE_SCROLL_INSENSITIVE
ResultSet.TYPE_SCROLL_SENSITIVE
resultSetConcurrency - 以下 ResultSet常量之一:
ResultSet.CONCUR_READ_ONLY
ResultSet.CONCUR_UPDATABLE
resultSetHoldability - 以下 ResultSet常量之一:
ResultSet.HOLD_CURSORS_OVER_COMMIT
ResultSet.CLOSE_CURSORS_AT_COMMIT
返回值:
一个包含预编译 SQL 语句的新 CallableStatement 对象,该对象将生成具有给定类型、并发性和可保存性的 ResultSet 对象。
public PreparedStatement prepareStatement(String sql, int autoGeneratedKeys)
功能:
创建一个默认 PreparedStatement 对象,该对象能获取自动生成的键。给定常量告知驱动程序是否可以获取自动生成的键。如果 SQL 语句不是一条 INSERT 语句,或者 SQL 语句能够返回自动生成的键(这类语句的列表是特定于供应商的),则忽略此参数。
参数:
sql - 可能包含一个或多个 '?' IN 参数占位符的 SQL 语句;
autoGeneratedKeys - 指示是否应该返回自动生成的键的标志,它是 Statement.RETURN_GENERATED_KEYS 或 Statement.NO_GENERATED_KEYS 之一。
返回值:
一个包含预编译 SQL 语句的新 PreparedStatement 对象,该对象能够返回自动生成的键。
public PreparedStatement prepareStatement(String sql,int[] columnIndexes)
功能:
创建一个能返回由给定数组指定的自动生成键的默认 PreparedStatement 对象。此数组包含目标表中列的索引,而目标表包含应该可返回的自动生成的键。如果 SQL 语句不是 INSERT 语句,或者 SQL 语言能够返回自动生成的键(这类语句的列表是特定于供应商的),则驱动程序将忽略该数组。
参数:
sql - 可能包含一个或多个 '?' IN 参数占位符的 SQL 语句;
columnIndexes - 列索引数组,这些索引指示应该从一个或多个插入行中返回的那些列。
返回值:
一个包含预编译语句的新 PreparedStatement 对象,该对象能够返回由给定列索引数组指定的自动生成键。
public PreparedStatement prepareStatement(String sql,String[] columnNames)
功能:
创建一个能返回由给定数组指定的自动生成键的默认 PreparedStatement 对象。此数组包含目标表中列的名称,而目标表包含应该返回的自动生成键。如果 SQL 语句不是 INSERT 语句,或者 SQL 语言能够返回自动生成的键(这类语句的列表是特定于供应商的),则驱动程序将忽略该数组。
参数:
sql - 可能包含一个或多个 '?' IN 参数占位符的 SQL 语句;
columnNames - 列名称数组,这些名称指示应该从一个或多个插入行中返回的那些列。
返回值:
一个包含预编译语句的新 PreparedStatement 对象,该对象能够返回由给定列名称数组指定的自动生成键。
public Clob createClob()
功能:
构造实现 Clob 接口的对象。返回的对象最初不包含任何数据。Clob 接口的 setAsciiStream、setCharacterStream 和 setString 方法可用来向 Clob 添加数据。在PG兼容模式下,该接口未实现。
返回值:
实现 Clob 接口的对象。
public Blob createBlob()
功能:
构造实现 Blob 接口的对象。返回的对象最初不包含任何数据。Blob 接口的 setBinaryStream 和 setBytes 方法可用来向 Blob 添加数据。在PG兼容模式下,该接口未实现。
返回值:
实现 Blob 接口的对象。
public SQLXML createSQLXML()
功能:
构造实现 SQLXML 接口的对象。返回的对象最初不包含任何数据。SQLXML 接口的 createXmlStreamWriter 和 setString 方法可用来向 SQLXML 对象添加数据。
返回值:
实现 SQLXML 接口的对象。
2.7. JDBC DataSource API¶
public XAConnection getXAConnection()
功能:
尝试建立可在分布式事务中使用的物理数据库连接。
返回值:
可在分布式事务中使用的 XAConnection 对象,该对象表示到数据源的物理连接。
public XAConnection getXAConnection(String user, String password)
功能:
使用给定的用户名和密码,尝试建立一个物理数据库连接。返回的连接可在分布式事务中使用。
参数:
user - 为其建立连接的数据库用户;
password - 用户的密码。
返回值:
可在分布式事务中使用的 XAConnection 对象,该对象表示到数据源的物理连接。
2.8. JDBC ConnectionPoolDataSource API¶
public PooledConnection getPooledConnection()
功能:
尝试建立可用作入池连接的物理数据库连接。
返回值:
PooledConnection 对象,该对象是到此 ConnectionPoolDataSource 对象表示的数据库的物理连接。
public PooledConnection getPooledConnection(String user, String password)
功能:
尝试建立可用作入池连接的物理数据库连接。
参数:
user - 为其建立连接的数据库用户;
password - 用户的密码。
返回值:
PooledConnection 对象,该对象是到此 ConnectionPoolDataSource 对象表示的数据库的物理连接。
2.9. JDBC PooledConnection API¶
public Connection getConnection()
功能:
创建并返回一个 Connection 对象,它是此 PooledConnection 对象表示的物理连接的句柄。
返回值:
一个 Connection 对象,它是到此 PooledConnection 对象的句柄。
public void close()
功能:
关闭此 PooledConnection 对象表示的物理连接。
public void addConnectionEventListener(ConnectionEventListener listener)
功能:
注册给定的事件侦听器,以便在此 PooledConnection 对象上发生事件时它将得到通知。
参数:
listener - 一个组件(通常为连接池管理器),它实现了 ConnectionEventListener 接口,并在关闭连接或发生错误时应得到通知。
public void removeConnectionEventListener(ConnectionEventListener listener)
功能:
从在此 PooledConnection 对象上发生事件时得到通知的组件所组成的列表中移除给定的事件侦听器。
参数:
listener - 一个组件(通常为连接池管理器),它实现了 ConnectionEventListener 接口,并已作为侦听器向此 PooledConnection 对象注册。
public void addStatementEventListener(StatementEventListener listener)
功能:
向此 PooledConnection 对象注册一个 StatementEventListener。该连接创建的 PreparedStatement 关闭或检测为无效时希望获得通知的组件可以使用此方法向此 PooledConnection 对象注册一个 StatementEventListener。
参数:
listener - 实现将向此 PooledConnection 对象注册的 StatementEventListener 接口的组件。
public void removeStatementEventListener(StatementEventListener listener)
功能:
从一个组件列表中移除指定的 StatementEventListener,该列表由驱动程序检测到 PreparedStatement 已关闭或无效时将获得通知的组件组成。
参数:
listener - 实现以前向此 PooledConnection 对象注册的 StatementEventListener 接口的组件。
2.10. JDBC XAConnection API¶
public XAResource getXAResource()
功能:
获取 XAResource 对象,事务管理器将使用该对象管理此 XAConnection 对象如何参与到分布式事务中。
返回值:
XAResource 对象。
public PooledConnection getPooledConnection(String user, String password)
功能: