java 虚拟机自动完整驱动注册。
PreparedStatement
在GBase
8a
server 中不支持预处理功能,PreparedStatement 是由驱动来
实现的。因此,驱动程序不支持getParameterMetaData()或getMetaData()等,
因为其需要客户端上具有完整的SQL 语法分析程序。
当服务器支持时,会使用服务端预处理语句和二进制编码的结果集。
当使用一个带有large 参数的服务器端预处理命令时要小心,这些参数是
通过setBinaryStream()、
setAsciiStream()、
setUnicodeStream()、
setBlob()
或setClob()设置的。
如果用户将large 参数修改为不带large 的参数后重新执
行语句,
那么此用户必需先调用clearParameters()并重置所有的参数。
原因如
下:
当设置参数时(在执行预处理语句前)
,驱动程序会将large 数据
out-of-band 发送到服务器端预处理语句;
一旦完成了这些,这个在客户端用于读取数据的流就会被关闭(按照
JDBC 规范)
,并且不能再次读取流;
如果一个参数从large 变为非large,
那么驱动必须重置服务器端的预
处理语句状态,这样就可以允许被改变成的参数替代先前的large 值
了。这会删除掉所有已经发送给服务器的large 数据,因此要求通过
GBase 8a 程序员手册JDBC 篇
南大通用数据技术股份有限公司
- 27 -
setBinaryStream()、 setAsciiStream()、setUnicodeStream()、
setBlob()或setClob()方法重发数据。
因此,如果用户想把一个参数的large 类型改成一个非large 的类型,那
么用户必须调用clearParameters()并在重新执行前再次设置准备好语句的所
有参数。
ResultSet
缺省情况下,
ResultSets 被完整地取回并存储在内存中。
在大多数情况下,
这是操作起来最有效的方式,
而且由于GBase 网络协议的设计这也更容易实现。
如果用户使用着拥有大量行或大数据的ResultSets,而且无法在JVM 内为所需
内存分配大量空间,可以通知驱动以“流”方式返回结果,一次一行。为了使
这个功能可用,用户需要按如下方式创建一个语句实例:
stmt = conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY,
java.sql.ResultSet.CONCUR_READ_ONLY);
stmt.setFetchSize(Integer.MIN_VALUE);
这是个向前只读结果集,
它读取得容量以整数为单位。
MIN_VALUE 指示驱动
程序以逐行操作的方式形成“流”结果输出。
此后,任何用这个语句创建的结果集都按行检索。
使用这种方法有些要注意的地方,用户必须在当前连接上使用任何查询之
前,读出结果集中所有的行(或者关闭它)
,否则就是会抛出异常。
这些语句持有的锁(在GsDB 存储引擎中,无论它们是GsSYS 表级锁还是行
级锁)
,最早可以在语句完成的时候释放。
如果这个语句在一个事务的范围内,那么这些锁在事务结束时(这意味着
那条语句需要先完成)释放。和大多数其它数据库一样,语句不会完成直到所
有依赖于该语句的结果被读取或对于这个语句活跃的结果被关闭。
因此,当使用“流”结果时,如果用户想对那些被这个语句引用并产生结
果集的表保持并发访问,应当尽快地处理它们。
GBase 8a 程序员手册JDBC 篇
- 28 -
南大通用数据技术股份有限公司
ResultSetMetaData
可用于获取关于 ResultSet 对象中列的类型和属性信息的对象。
Statement
Statements 允许用户执行基本的SQL 查询并且通过后面将介绍的类
ResultSet 获得结果。
调用在对象Connection 上的createStatement()方法,可以创建一个
Statement 实例,而这个Connection 对象可以通过在前面介绍过的
DriverManager.getConnection()或DataSource.getConnection()方法获得。
一旦拥有了一个Statement 实例,就能调用executeQuery(String)方法执
行一个SELECT 查询。
更新数据库中的数据可以使用executeUpdate(String
SQL)方法,
该方法返
回由更新语句影响到的行数。
如果事先不知道SQL 语句将执行一个SELECT 操作还是一个UPDATE/INSERT
操作,
那么就可以使用execute(String
SQL)方法。
如果SQL 查询是一个SELECT,
该方法返回true,
如果是一个UPDATE/INSERT/DELETE 查询时返回false。
并且,
如果是一个SELECT 查询,
可以调用getResultSet()方法获得结果,
如果是一个
UPDATE/INSERT/DELETE 查询,
可以调用Statement 实例上的getUpdateCount()
方法获得被影响到的行数。