连接两台电脑如何联机

两台电脑如何联机  时间:2021-05-07  阅读:()
程序员参考jConnectforJDBC7.
07文档ID:DC38606-01-0707-01最后修订日期:2012年6月版权所有2012bySybase,Inc.
保留所有权利.
本出版物适用于Sybase软件及所有后续版本,除非在新版本或技术说明中另有说明.
此文档中的信息如有更改,恕不另行通知.
此处说明的软件按许可协议提供,其使用和复制必须符合该协议的条款.
仅在定期安排的软件发布日期提供升级.
未经Sybase,Inc.
的事先书面许可,本书的任何部分不得以任何形式、任何手段(电子的、机械的、手动、光学的或其它手段)进行复制、传播或翻译.
Sybase商标可在theSybasetrademarkspage(http://www.
sybase.
com/detailid=1011207)处进行查看.
Sybase和列出的标记均是Sybase,Inc.
的商标.
表示已在美国注册.
SAP和此处提及的其它SAP产品与服务及其各自的徽标是SAPAG在德国和世界各地其它几个国家/地区的商标或注册商标.
Java和所有基于Java的标记都是Oracle和/或其分公司在美国和其它国家/地区的商标或注册商标.
Unicode和Unicode徽标是Unicode,Inc.
的注册商标.
文中提及的所有其它公司和产品名可能是与其相关的各个公司的商标.
Use,duplication,ordisclosurebythegovernmentissubjecttotherestrictionssetforthinsubparagraph(c)(1)(ii)ofDFARS52.
227-7013fortheDODandassetforthinFAR52.
227-19(a)-(d)forcivilianagencies.
Sybase,Inc.
,OneSybaseDrive,Dublin,CA94568.
目录程序员参考iii本书内容.
vii第1章简介.
1什么是JDBC1什么是jConnect3第2章编程信息.
5设置jConnect.
5设置jConnect版本.
5调用jConnect驱动程序.
7为J2EE服务器配置jConnect.
8建立连接.
9连接属性9连接到AdaptiveServer25使用sql.
ini和interfaces文件目录服务27使用JNDI连接到服务器.
28处理国际化和本地化.
33使用jConnect传递Unicode数据33jConnect字符集转换程序35处理数据库39实施高可用性故障切换支持40执行服务器到服务器的远程过程调用.
44使用AdaptiveServer的宽表支持.
45访问数据库元数据.
46对结果集使用游标.
47使用包括COMPUTE子句的Transact-SQL查询.
58批处理更新支持59通过存储过程的结果集更新数据库60使用数据类型.
61仅数据锁定表中的可变长度行.
68大对象(LOB)支持.
68大对象定位符支持.
69目录ivjConnectforJDBC实施高级功能.
70使用BCP插入功能70受支持的AdaptiveServerClusterEdition功能.
71使用事件通知.
72处理错误消息.
75使用口令加密.
80将Java对象作为列数据存储在表中.
82使用动态类装载87JDBC4.
0规范支持.
90JDBC3.
0规范支持.
91JDBC2.
0选件工具包扩展支持.
93对JDBC标准的约束与说明101不受支持的JDBC4.
0规范要求.
101使用Connection.
isClosed和IS_CLOSED_TEST101对未处理的结果使用Statement.
close102调整多线程103使用ResultSet.
getCursorName103执行存储过程.
104第3章安全性.
107概述.
107限制108实现自定义套接字插件108创建和配置自定义套接字.
109Kerberos.
112为Kerberos配置jConnect应用程序112GSSMANAGER_CLASS连接属性113设置Kerberos环境116示例应用程序.
118krb5.
conf配置文件120互操作性.
122故障排除.
123相关文档.
124第4章故障排除125使用jConnect进行调试125获取Debug类的一个实例.
125在应用程序中打开调试程序126在应用程序中关闭调试程序127为调试程序设置CLASSPATH.
127使用Debug方法127动态日志记录.
129目录程序员参考v捕获TDS通信.
130PROTOCOL_CAPTURE连接属性.
130Capture类中的pause和resume方法130解决连接错误.
131网关连接被拒绝131管理jConnect应用程序所使用的内存.
132解决存储过程错误133RPC返回比已注册参数少的输出参数133在返回输出参数时出现获取/状态错误.
133在非链式事务模式中执行存储过程133解决自定义套接字执行错误134第5章性能和调优135改善jConnect性能.
135BigDecimal范围重设.
136REPEAT_READ连接属性.
136SunIoConverter字符集转换136对动态SQL中的预准备语句的性能调优137选择预准备语句和存储过程138可移植应用程序中的预准备语句.
138具有jConnect扩展的预准备语句139Connection.
prepareStatement140DYNAMIC_PREPARE连接属性141SybConnection.
prepareStatement142ESCAPE_PROCESSING_DEFAULT连接属性143jConnect中的优化批处理.
143游标性能.
144LANGUAGE_CURSOR连接属性145第6章迁移jConnect应用程序147向jConnect7.
x迁移应用程序147更改Sybase扩展.
148扩展更改示例.
148方法名称.
149Debug类149第7章Web服务器网关151关于Web服务器网关.
151使用TDS贯通.
151配置jConnect和网关152使用要求.
155阅读index.
html文件.
156运行示例Isql小程序.
156目录vijConnectforJDBC使用TDS贯通服务器小程序.
157检查要求.
158安装服务器小程序.
158调用服务器小程序.
160跟踪活动的TDS会话.
160恢复TDS会话.
160附录AjConnect示例程序161运行IsqlApp.
161运行jConnect示例程序和代码.
163示例应用程序.
163示例代码.
164附录BSQL例外与警告消息167词汇表189索引193程序员参考vii本书内容《SybasejConnectforJDBC程序员参考》介绍jConnectforJDBC产品,并说明了如何用它访问存储在关系数据库管理系统中的数据.
读者本手册适用于熟悉Java编程语言、JDBC和Transact-SQL以及Sybase版的结构化查询语言(SQL)的数据库应用程序程序员.
如何使用本手册本书中的信息是按以下方式组织的:第1章"简介"介绍jConnectforJDBC产品的概念和组件.
第2章"编程信息"介绍jConnectforJDBC编程要求.
第3章"安全性"介绍可与jConnect结合使用的安全机制.
第4章"故障排除"介绍jConnect使用过程中可能出现的问题的解决方案和变通解决方法.
第5章"性能和调优"介绍如何增强使用jConnect的应用程序的性能.
第6章"迁移jConnect应用程序"介绍如何将应用程序迁移到jConnect7.
x.
第7章"Web服务器网关"包含有关Web服务器网关的信息并解释如何将这些网关与jConnect结合使用.
附录B"SQL例外与警告消息"列出了在使用jConnect时可能会遇到的SQL例外和警告消息.
附录A"jConnect示例程序"用作jConnect示例程序指南.
相关文档有关详细信息,请参见以下书籍:SybasejConnectforJDBCReleaseBulletin(《SybasejConnectforJDBC发行公告》)包含有关jConnect的最新信息.
针对您的平台的SoftwareDeveloper'sKitReleaseBulletin(《软件开发工具包发行公告》)包含有关软件开发工具包(SDK)的最新信息.
viiijConnectforJDBCSoftwareDeveloper'sKitandOpenServerInstallationGuide(《软件开发工具包和OpenServer安装指南》)包含有关安装SDK及其jConnectforJDBC组件的信息.
AdaptiveServerEnterpriseInstallationGuide(《AdaptiveServerEnterprise安装指南》)包含有关安装AdaptiveServer的信息.
针对您的平台的AdaptiveServerEnterpriseReleaseBulletin(《AdaptiveServerEnterprise发行公告》)包含AdaptiveServerEnterprise的已知问题和最新更新的信息.
JDBC的jConnect扩展javadoc文档.
JavaSoftware的Java开发工具包(JDK)包含用于从源代码文件中提取注释的javadoc脚本.
此脚本已用于从jConnect源文件中提取jConnect软件包、类和方法的文档.
使用完全安装或javadocs选项安装jConnect时,javadoc信息位于javadocs目录Installation_directory/docs/en/javadocs中.
其它信息来源使用SybaseGettingStartedCD、SyBooksCD和SybaseProductManuals网站可以了解有关产品的更多信息:GettingStartedCD包含PDF格式的发行公告和安装指南,还可能包含SyBooksCD中未收纳的其它文档或更新信息.
它随软件一起提供.
要阅读或打印GettingStartedCD上的文档,您需要使用AdobeAcrobatReader,可以通过CD上提供的链接从Adobe网站免费下载该软件.
SyBooksCD含有产品手册,它随软件一起提供.
基于Eclipse的SyBooks浏览器使您能够以易于使用的、基于HTML的格式阅读手册.
有些文档可能是以PDF格式提供的,您可以通过SyBooksCD上的PDF目录访问这些文档.
若要阅读或打印PDF文件,您需要使用AdobeAcrobatReader.
有关安装和启动SyBooks的说明,请参见GettingStartedCD上的SyBooks安装指南或SyBooksCD上的README.
txt文件.
SybaseProductManuals网站是SyBooksCD的联机版本,您可以使用一种标准Web浏览器来访问它.
除了产品手册之外,还可以找到有关EBFs/Maintenance(EBF/维护)、TechnicalDocuments(技术文档)、CaseManagement(案例管理)、SolvedCases(解决的案例)、Newsgroups(新闻组)和SybaseDeveloperNetwork(Sybase开发员网络)的链接.
若要访问SybaseProductManuals网站,请转到ProductManuals(http://www.
sybase.
com/support/manuals/).
Web上的Sybase认证Sybase网站上的技术文档不断在更新.
本书内容程序员参考ix查找有关产品认证的最新信息1将Web浏览器定位到TechnicalDocuments(http://www.
sybase.
com/support/techdocs/).
2单击"认证报告"(CertificationReport).
3在"合作伙伴认证报告"(PartnerCertificationReport)过滤器中选择相应的产品、平台和时间范围,然后单击"查找"(Go).
4单击合作伙伴认证报告的标题即可显示该报告.
查找有关组件认证的最新信息1将Web浏览器定位到AvailabilityandCertificationReports(http://certification.
sybase.
com/).
2在"按基本产品搜索"(SearchbyBaseProduct)下选择产品系列和产品,或在"按平台搜索"(SearchbyPlatform)下选择平台和产品.
3选择"搜索"(Search)以显示所选项目的可用性和认证报告.
创建Sybase网站(包括支持页)的个人化视图建立MySybase配置文件.
MySybase是一项免费服务,它允许您创建SybaseWeb页的个性化视图.
1将Web浏览器定位到TechnicalDocuments(http://www.
sybase.
com/support/techdocs/).
2单击"我的Sybase"(MySybase)并创建MySybase配置文件.
SybaseEBF和软件维护查找有关EBF和软件维护的最新信息1将Web浏览器定位到theSybaseSupportPage(http://www.
sybase.
com/support).
2选择"EBF/维护"(EBFs/Maintenance).
如果出现提示信息,请输入您的MySybase用户名和口令.
3选择一个产品.
4指定时间范围并单击"查找"(Go).
即会显示EBF/维护版本的列表.
锁形图标表示因为您没有注册为"技术支持联系人"(TechnicalSupportContact),因此您没有某些EBF/维护版本的下载授权.
如果您尚未注册,但拥有Sybase代表提供的或通过支持合同获得的有效信息,请单击"编辑角色"(EditRoles)将"技术支持联系人"(TechnicalSupportContact)角色添加到MySybase配置文件中.
xjConnectforJDBC5单击信息图标可显示EBF/维护报告,或单击产品说明下载软件.
约定表1:语法约定辅助功能特性为具有可访问性,专门采用HTML版本提供本文档.
可以利用适应性技术(如屏幕阅读器)浏览HTML文档,也可以用屏幕放大器进行查看.
jConnectforJDBC和HTML文档已进行了测试,符合美国政府"第508节辅助功能"的要求.
符合"第508节"的文档一般也符合非美国的辅助功能原则,如WorldWideWeb协会(W3C)中针对Web站点的原则.
此产品的联机帮助也是以HTM格式提供的,您可以使用屏幕阅读器进行浏览.
注释您可能需要对辅助功能工具进行配置以获得最佳使用效果.
某些屏幕阅读器按照大小写来辨别文本,例如将"ALLUPPERCASETEXT"看作首字母缩写,而将"MixedCaseText"看作单词.
对工具进行配置,规定语法约定,您可能会感觉更方便.
有关工具的信息,请查阅文档.
有关Sybase如何支持辅助功能的信息,请参见SybaseAccessibility(http://www.
sybase.
com/accessibility).
Sybase辅助功能站点包括指向"第508节"和W3C标准的相关信息的链接.
如果需要帮助对于购买了支持合同的客户安装的每一个Sybase产品,都会有一位或多位指定人员获得与Sybase技术支持部门联系的授权.
如果使用手册或联机帮助不能解决问题,可让指定人员与Sybase技术支持部门联系或与所在区域的Sybase子公司联系.
键定义命令命令名、命令选项名、实用程序名、实用程序标志和其它关键字用sansserif字体显示.
变量变量(即代表您要填充的值的词语)用斜体显示.
{}大括号表示至少选择括号中的一个选项.
不要在命令中包括大括号.
[]中括号表示可以选择括号中的一个或多个选项,也可不选.
不要在命令中包括大括号.
()小括号将作为命令的一部分键入.
|竖线表示只可以选择一个显示的选项.
,逗号表示可以选择任意多个显示的选项,可输入逗号作为命令的一部分来分隔选项.
程序员参考1第1章简介本章介绍了jConnectforJDBC产品及其概念和组件.
什么是JDBCOracleCorporation制定的Java数据库连接(JDBC)是一套应用程序编程接口(API)规范,它允许Java应用程序使用结构化查询语言(SQL)访问多个数据库管理系统.
JDBC驱动程序管理器可以处理多个连接到不同数据库的驱动程序.
标准JDBCAPI和JDBC标准扩展API中包含一组接口,利用这些接口可以打开到数据库的连接,执行SQL命令并处理结果.
表1-1中介绍了这些接口.
主题页码什么是JDBC1什么是jConnect3什么是JDBC2jConnectforJDBC表1-1:JDBC接口每个关系数据库管理系统都需要一个驱动程序来实现这些接口.
有四种类型的JDBC驱动程序:类型1JDBC-ODBC桥–将JDBC调用转换成ODBC调用,然后将其传递给ODBC驱动程序.
有些ODBC软件必须驻留在客户端计算机中.
有些客户端数据库代码可能也驻留在客户端计算机中.
类型2native-APIpartly-Java驱动程序–将JDBC调用转换成数据库特定的调用.
该驱动程序能够直接与数据库服务器通信,同时还需要客户端计算机中的一些二进制代码.
类型3net-protocolall-Java驱动程序–利用独立于DBMS的网络协议与中间层服务器通信.
然后,中间层网关将请求转换成供应商特定的协议.
类型4native-protocolall-Java驱动程序–将JDBC调用转换成供应商特定的DBMS协议,允许客户端应用程序直接与数据库服务器通信.
有关JDBC及其规范的详细信息,请参见OracleTechnologyNetworkforJava(http://www.
oracle.
com/technetwork/java/index.
html).
接口说明java.
sql.
Driver定位数据库URL的驱动程序java.
sql.
Connection用于连接到特定数据库java.
sql.
Statement执行SQL语句java.
sql.
PreparedStatement处理带参数的SQL语句java.
sql.
CallableStatement处理数据库存储过程调用java.
sql.
ResultSet获取SQL语句的结果java.
sql.
DatabaseMetaData用于访问关于数据库的连接的信息.
java.
sql.
ResultSetMetaData用于访问描述ResultSet属性的信息.
javax.
sql.
Rowset处理JDBCRowSet实现.
javax.
sql.
DataSource处理与数据源的连接.
javax.
sql.
ConnectionPoolDataSource处理连接归集.
第1章简介程序员参考3什么是jConnectjConnect是Sybase高性能JDBC驱动程序.
jConnect包含以下两种驱动程序:native-protocol/all-Java驱动程序和net-protocol/all-Java驱动程序.
jConnect使用的协议是TDS5.
0(TabularDataStream,第5版),它是AdaptiveServerEnterprise和OpenServer应用程序的本地协议.
jConnect执行JDBC标准,为整个Sybase产品系列提供最佳连接,通过它可访问25个以上的企业级系统和遗留系统,包括:AdaptiveServerEnterpriseSQLAnywhereSybaseIQReplicationServerDirectConnect此外,jConnectforJDBC还能够访问Oracle、AS/400以及其它使用SybaseDirectConnect的数据源.
在某些情况下,JDBC的jConnect实现会偏离JDBC规范.
有关详细信息,请参见第101页的"对JDBC标准的约束与说明".
什么是jConnect4jConnectforJDBC程序员参考5第2章编程信息本章描述构成jConnectforJDBC的基本组件和编程要求.
介绍了如何调用jConnect驱动程序、设置连接属性和连接到数据库服务器.
还包含有关使用jConnect功能的信息.
本章包含下列主题:有关JDBC编程的信息,请转到以下位置中面向Java开发人员的资源页:OracleTechnologyNetworkforJava(http://www.
oracle.
com/technetwork/java/index.
html).
设置jConnect本节介绍在使用jConnect之前需要执行的任务.
设置jConnect版本jConnect版本属性JCONNECT_VERSION确定驱动程序的行为和激活的功能.
例如,AdaptiveServer15.
5支持jConnect6.
05和7.
0,但这两个版本处理datetime和time数据的方式有所不同.
在连接到AdaptiveServer15.
5时,支持微秒级精度的时间数据的jConnect7.
0使用bigdatetime或bigtime,即使目标AdaptiveServer列被定义为datetime或time也是如此.
而不支持微秒级精度的jConnect6.
05在连接到AdaptiveServer15.
5时则始终会转换datetime或time数据.
可以使用SybDriver.
setVersion方法或JCONNECT_VERSION连接属性设置jConnect版本.
主题页码设置jConnect5建立连接9处理国际化和本地化33处理数据库39实施高级功能70对JDBC标准的约束与说明101设置jConnect6jConnectforJDBC使用SybDriver.
setVersionsetVersion方法影响由SybDriver对象创建的所有连接的jConnect缺省行为.
可以多次调用setVersion来更改版本设置.
新连接会继承在建立连接时与版本设置相关联的行为.
在会话过程中更改版本设置不会影响当前连接.
可以使用com.
sybase.
jdbcx.
SybDriver.
VERSION_LATEST常量确保总是请求所使用的jConnect驱动程序的最高版本值.
但是,在将版本设置为com.
sybase.
jdbcx.
SybDriver.
VERSION_LATEST后,如果用较新的jConnect驱动程序替换当前的jConnect驱动程序,可能会发现行为发生变化.
此代码示例演示如何装载jConnect驱动程序和设置其版本:importjava.
sql.
DriverManager;importcom.
sybase.
jdbcx.
SybDriver;SybDriversybDriver=(SybDriver)Class.
forName("com.
sybase.
jdbc4.
jdbc.
SybDriver").
newInstance();sybDriver.
setVersion(com.
sybase.
jdbcx.
SybDriver.
VERSION_7);DriverManager.
registerDriver(sybDriver);使用JCONNECT_VERSION可以使用JCONNECT_VERSION连接属性覆盖SybDriver版本设置并为特定连接指定不同的版本设置.
表2-1列出了有效的JCONNECT_VERSION值以及与这些值相关联的jConnect特征.
表2-1:jConnect版本设置及其功能JCONNECT_VERSION功能"7.
0"除以下情况外,jConnect7.
0与jConnect6.
05的行为相同:jConnect从服务器请求对bigdatetime和bigtimeSQL数据类型的支持.
15.
5之前的AdaptiveServer版本将忽略该请求.
请参见第66页的"使用date和time数据类型".
jConnect支持JDBC4.
0.
请参见第90页的"JDBC4.
0规范支持"和第101页的"对JDBC标准的约束与说明".
ENABLE_BULK_LOAD的有效值为空值(缺省值)、ARRAYINSERT_WITH_MIXED_STATEMENTS、ARRAYINSERT、BCP和LOG_BCP.
"6.
05"除以下情况外,jConnect6.
05与jConnect6.
0的行为相同:jConnect支持计算列,包括其元数据信息.
jConnect支持长标识符.
通过长标识符,您可以使用最多255个字节的标识符或对象名称.
长标识符适用于大多数用户定义的标识符,包括表名、列名和索引名称.
jConnect支持JDBC3.
0.
请参见第91页的"JDBC3.
0规范支持"和第101页的"对JDBC标准的约束与说明".
第2章编程信息程序员参考7调用jConnect驱动程序若要注册和调用jConnect,请将jConnect添加到jdbc.
drivers系统属性中.
在初始化阶段,DriverManager类试图装载jdbc.
drivers中列出的驱动程序.
这不如调用Class.
forName的效率高.
可以在此属性中列出多个驱动程序,程序之间用冒号(:)分隔.
以下代码示例演示如何在程序内向jdbc.
drivers中添加驱动程序:"6"除以下情况外,jConnect6.
0与jConnect5.
x的行为相同:jConnect请求对date和timeSQL数据类型的支持.
12.
5.
1之前的Adaptive版本将忽略该请求.
请参见第66页的"使用date和time数据类型".
jConnect从服务器请求对unichar和univarchar数据类型的支持.
12.
5.
1之前的AdaptiveServer版本将忽略该请求.
请参见第33页的"使用jConnect传递Unicode数据".
jConnect从服务器请求对宽表的支持.
12.
5.
1之前的AdaptiveServer版本将忽略该请求.
第45页的"使用AdaptiveServer的宽表支持".
DISABLE_UNICHAR_SENDING的缺省值为false.
"5"jConnect5.
x与jConnect4.
0的行为相同.
"4"除以下情况外,jConnect4.
0与jConnect3.
0的行为相同:LANGUAGE连接属性的缺省值为null.
Statement.
cancel的缺省行为是只取消调用其的Statement对象.
此行为符合JDBC标准.
请使用CANCEL_ALL设置Statement.
cancel的行为.
可以使用JDBC2.
0方法以列数据的形式存储和检索Java对象.
请参见第82页的"将Java对象作为列数据存储在表中".
"3"除以下情况外,jConnect3.
0与jConnect2.
0的行为相同:如果CHARSET连接属性没有指定字符集,jConnect将使用数据库的缺省字符集.
CHARSET_CONVERTER的缺省值为CheckPureConverter类.
"2"LANGUAGE连接属性的缺省值为us_english.
如果CHARSET连接属性没有指定字符集,缺省字符集将是iso_1.
CHARSET_CONVERTER的缺省值为TruncationConverter类,除非CHARSET连接属性指定多字节或8位字符集(在这种情况下,CHARSET_CONVERTER的缺省值为CheckPureConverter类.
请参见第35页的"jConnect字符集转换程序".
Statement.
cancel的缺省行为是取消调用其的对象,以及任何其它已开始执行且正在等待结果的Statement对象.
此行为不符合JDBC标准.
请使用CANCEL_ALL设置Statement.
cancel的行为.
JCONNECT_VERSION功能设置jConnect8jConnectforJDBCPropertiessysProps=System.
getProperties();Stringdrivers="com.
sybase.
jdbc4.
jdbc.
SybDriver";StringoldDrivers=sysProps.
getProperty("jdbc.
drivers");if(oldDrivers!
=null)drivers+=":"+oldDrivers;sysProps.
put("jdbc.
drivers",drivers.
toString());注释System.
getProperties不能用于Java小程序.
请改用Class.
forName方法.
在Java6和JDBC4中,JDBC驱动程序的实例化过程已得到简化.
您可以使用Java系统属性jdbc.
drivers来指定驱动程序类,例如:java-Djdbc.
drivers=com.
sybase.
jdbc4.
jdbc.
SybDriverUseDriverUseDriver程序不需要显式装载驱动程序:publicclassUseDriver{publicstaticvoidmain(String[]args){try{Connectionconn=java.
sql.
DriverManager.
getConnection("jdbc:sybase:Tds:localhost:5000USER=sa&PASSWORD=secret");//morecodetouseconnection.
.
.
}catch(SQLExceptionse){System.
out.
println("ERROR:SQLException"+se);}}}为J2EE服务器配置jConnect可以使用com.
sybase.
jdbc4.
jdbc.
SybConnectionPoolDataSource类在EAServer等应用程序服务器中配置与AdaptiveServer服务器的连接池.
javax.
sql.
ConnectionPoolDataSource接口的com.
sybase.
jdbc4.
jdbc.
SybConnectionPoolDataSource实现可为每个连接属性提供getter和setter方法.
还可通过编程方式配置jConnect,例如:privateDataSourcegetDataSource(){SybConnectionPoolDataSourceconnectionPoolDataSource=new第2章编程信息程序员参考9SybConnectionPoolDataSource();connectionPoolDataSource.
setDatabaseName("pubs2");connectionPoolDataSource.
setNetworkProtocol("Tds");connectionPoolDataSource.
setServerName("localhost");connectionPoolDataSource.
setPortNumber(5000);connectionPoolDataSource.
setUser("sa");connectionPoolDataSource.
setPassword(PASSWORD);returnconnectionPoolDataSource;}privatevoidwork()throwsSQLException{Connectionconn=null;Statementstmt=null;DataSourceds=getDataSource();try{conn=ds.
getConnection();stmt=conn.
createStatement();//.
.
.
}finally{if(stmt!
=null){try{stmt.
close();}catch(Exceptionex){/*ignore*/}}if(conn!
=null){try{conn.
close();}catch(Exceptionex){/*ignore*/}}}}建立连接本节介绍如何使用jConnect建立与AdaptiveServer或SQLAnywhere数据库的连接.
连接属性连接属性指定登录到服务器所需的信息并定义预期的客户端和服务器行为.
连接属性名称不区分大小写.
建立连接10jConnectforJDBC设置连接属性必须在连接到服务器之前设置连接属性.
可使用两种方法设置连接属性:在应用程序中使用DriverManager.
getConnection方法.
在定义URL时设置连接属性.
注释在URL中设置的驱动程序连接属性不会覆盖在应用程序中使用DriverManager.
getConnection方法设置的任何相应的连接属性.
下面的示例代码使用了DriverManager.
getConnection方法.
随jConnect提供的示例程序也包含设置这些属性的示例.
Propertiesprops=newProperties();props.
put("user","userid");props.
put("password","user_password");/**Iftheprogramisanappletthatwantstoaccess*aserverthatisnotonthesamehostasthe*webserver,thenitusesaproxygateway.
*/props.
put("proxy","localhost:port");/**Makesureyousetconnectionpropertiesbefore*attemptingtomakeaconnection.
Youcanalso*setthepropertiesintheURL.
*/Connectioncon=DriverManager.
getConnection("jdbc:sybase:Tds:host:port",props);列出当前连接设置若要列出驱动程序的当前连接设置,请使用Driver.
getDriverPropertyInfo(Stringurl,Propertiesprops).
该代码返回包含以下内容的DriverPropertyInfo对象数组:驱动程序属性驱动程序属性所基于的当前设置URL和传入的属性jConnect连接属性列表表2-2列出了jConnect的连接属性并给出了其缺省值.
这些属性不区分大小写.
第2章编程信息程序员参考11可使用getClientInfo()和setClientInfo()标准方法动态设置标记为Dynamic的连接属性的值.
表2-2:连接属性属性说明缺省值Dynamic或StaticALTERNATE_SERVER_NAME指定镜像SQLAnywhere环境中主数据库和辅助数据库使用的备用服务器名称.
主数据库和辅助数据库使用相同的备用服务器名称,因此客户端应用程序可以连接到当前主服务器,而无需事先知道两台服务器中的哪一台是主服务器.
JDBCURL的语法仍然是jdbc:sybase:Tds::/databaseconnection_property=value;.
但是,如果设置了ALTERNATE_SERVER_NAME,jConnect将忽略hostname和port变量的值,而是使用SQLAnywhereUDP发现协议来确定当前主服务器.
有关数据库镜像的信息,请参见《SQLAnywhere服务器–数据库管理》.
注释也可以对未镜像的SQLAnywhere使用ALTERNATE_SERVER_NAME.
不过,您将始终从单独的服务器获取相同的主机和端口值.
NullStaticAPPLICATIONNAME指定应用程序名称.
这是一个用户定义的属性.
可以编程使服务器端解释为此属性提供的值.
NullStaticBE_AS_JDBC_COMPLIANT_AS_POSSIBLE调整其它属性以确保jConnect方法的应答方式尽可能符合JDBC3.
0标准.
如果将该属性设置为"true",将影响(并覆盖)下列属性:CANCEL_ALL(设置为"false")LANGUAGECURSOR(设置为"false")SELECT_OPENS_CURSOR(设置为"true")FAKE_METADATA(设置为"true")GET_BY_NAME_USES_COLUMN_LABEL(设置为"false")FalseStatic建立连接12jConnectforJDBCCACHE_COLUMN_METADATA如果重复使用执行SELECT查询的PreparedStatement或CallableStatement对象,则将CACHE_COLUMN_METADATA设置为true可以提高性能.
设置为true时,该语句将会记住与第一次执行该语句时所返回的SELECT查询结果关联的ResultSetMetadata信息.
以后执行该语句时,将会重用这些元数据,而不必重新构建.
这可以通过使用更多内存来节省CPU时间.
在连接到AdaptiveServer15.
7ESD#1及更高版本时,应使用SUPPRESS_ROW_FORMAT连接属性.
FalseStaticCANCEL_ALL指定Statement.
cancel方法的行为:如果CANCEL_ALL为false,那么调用Statement.
cancel将只取消调用其的Statement对象.
因此,如果stmtA是Statement对象,stmtA.
cancel将取消执行数据库中stmtA所包含的SQL语句,而不影响其它语句.
无论stmtA是在高速缓存中等待执行还是已开始执行并且正在等待结果,都会取消该命令.
如果CANCEL_ALL为true,那么调用Statement.
cancel将不仅取消调用其的对象,还将取消同一连接上已开始执行并且正在等待结果的任何其它Statement对象.
以下示例将CANCEL_ALL设置为"false".
props是指定连接属性的Properties对象:props.
put("CANCEL_ALL","false");注释若要取消执行某个连接上的所有Statement对象,而不管其是否已开始在服务器上执行,请使用扩展方法SybConnection.
cancel.
True–对于JCONNECT_VERSION="4"Static属性说明缺省值Dynamic或Static第2章编程信息程序员参考13CAPABILITY_TIME仅在JCONNECT_VERSION>=6时使用.
此时jConnect与支持TIME数据类型的服务器相连,并且所有类型为java.
sql.
Time或escapeliterals{t.
.
.
}的参数都被作为TIME进行处理.
jConnect的以前版本将这些参数作为DATETIME进行处理并在java.
sql.
Time参数前加上"1970-01-01".
如果基础数据类型为datetime或smalldatetime,则日期部分也会存储在数据库中.
在jConnect6.
0或更高版本中,在处理TIME时,服务器会将时间转换成基础数据类型并在前面加上其自己的基准年.
这可能导致旧数据与新数据之间不兼容.
如果要对java.
sql.
Time使用datetime或smalldatetime数据类型,为了能够向后兼容,您应将CAPABILITY_TIME保留为false.
将此属性保留为false可强制jConnect将java.
sql.
Time参数或转义文字{t.
.
.
}作为DATETIME进行处理,而不论服务器处理TIME数据类型的能力如何.
将此属性设置为true会使jConnect在连接到AdaptiveServer时将java.
sql.
Time参数作为TIME数据类型进行处理.
如果您要使用smalldatetime或datetime列来存储时间值,Sybase建议您将此属性保留为false.
FalseStaticCAPABILITY_WIDETABLE如果您为了提高性能而不使用JDBCResultSetMetaData(如列名),则可以将此属性设置为"false".
这将减少通过网络交换的数据并提高性能.
除非要使用EAServer,否则Sybase建议使用缺省设置.
请参见第45页的"使用AdaptiveServer的宽表支持".
FalseStaticCHARSET为传递给数据库的字符串指定字符集.
如果CHARSET值为Null,jConnect将使用服务器的缺省字符集向服务器发送string数据.
如果指定CHARSET,数据库必须能够处理此格式的字符.
如果数据库不能处理此格式的字符,将生成一条消息,说明不能正确完成字符转换.
注释如果使用的是jConnect6.
05或更高版本,并将DISABLE_UNICHAR_SENDING设置为false,那么当客户端试图向服务器发送无法用连接所使用的字符集表示的字符时,jConnect将能够检测出来.
发生这种情况时,jConnect会将字符数据作为unichar数据发送给服务器,这样可使客户端能够在unichar/univarchar列和参数中插入Unicode数据.
NullStatic属性说明缺省值Dynamic或Static建立连接14jConnectforJDBCCHARSET_CONVERTER_CLASS指定希望jConnect使用的字符集转换程序类.
jConnect使用来自SybDriver.
setVersion的版本设置或随JCONNECT_VERSION属性传入的版本来确定要使用的缺省字符集转换程序类.
有关详细信息,请参见第35页的"选择字符集转换程序".
视版本而定.
请参见第6页的表2-1.
StaticCLASS_LOADER该属性设置为您创建的DynamicClassLoader对象.
DynamicClassLoader用于装载在应用程序启动时存储在数据库中但不在CLASSPATH中的Java类.
有关详细信息,请参见第87页的"使用动态类装载".
NullStaticCONNECTION_FAILOVER与Java命名和目录接口(JNDI)一起使用.
请参见第31页的"CONNECTION_FAILOVER连接属性".
TrueStaticCRC当该属性设置为true时,返回的更新计数为累计计数,其中既包括受执行的语句直接影响的更新,也包括执行语句后调用的所有触发器.
falseStaticDATABASE当从Sybaseinterfaces文件获得连接信息时,使用该属性指定连接的数据库名称.
interfaces文件的URL无法提供数据库名称.
nullStaticDEFAULT_QUERY_TIMEOUT当设置该连接属性时,它将作为在该连接上创建的任何语句的缺省查询超时.
0(无超时)DynamicDELETE_WARNINGS_FROM_EXCEPTION_CHAIN指定是要保留SQLWarning还是将其从SQLException链中删除.
值:True–jConnect会将SQLWarning对象从SQLException链中删除.
False–jConnect会将SQLWarning对象保留在SQLException链中.
TrueStaticDISABLE_UNICHAR_SENDING当客户端应用程序向服务器发送unichar字符(以及非unichar字符)时,会对发送到数据库的任何字符数据产生轻微的性能影响.
在jConnect6.
05和更高版本中,此属性在缺省情况下设置为false.
如果使用jConnect较早版本的客户端希望向数据库发送unichar数据,则必须将此属性设置为false.
请参见第33页的"使用jConnect传递Unicode数据".
视版本而定StaticDISABLE_UNPROCESSED_PARAM_WARNINGS禁用警告.
在处理存储过程的结果时,jConnect经常读取行数据之外的返回值.
如果不处理返回值,jConnect将引发一个警告.
若要禁用这些警告(这样有助于提高性能),请将此属性设置为"true".
FalseStaticDYNAMIC_PREPARE决定是否在数据库中预编译动态SQL预准备语句.
请参见第141页的"DYNAMIC_PREPARE连接属性".
trueDynamic属性说明缺省值Dynamic或Static第2章编程信息程序员参考15EARLY_BATCH_READ_THRESHOLD指定行数阈值,超出该值后,读取器线程应启动,以清除批处理的服务器响应.
如果无需较早读取,则将该值设置为-1.
-1StaticENABLE_BULK_LOAD指定是否使用bulkload向数据库中插入行.
值:空值–禁用批量装载.
ARRAYINSERT_WITH_MIXED_STATEMENTS–使用行级别日志记录启用批量装载,并允许应用程序在批量装载操作过程中执行其它语句.
ARRAYINSERT–使用行级别日志记录启用bulkload,但应用程序在执行bulkload操作期间无法执行其它语句.
BCP–使用页面级别日志记录启用批量装载,但应用程序在批量装载操作过程中无法执行其它语句.
LOG_BCP–除对整个事务进行转储以供可能的完全恢复外,其余和BCP相同.
NullDynamicENABLE_LOB_LOCATORS指定jConnect应该创建客户端物化LOB还是服务器端LOB定位符.
有效值:False:缺省值–jConnect使用客户端物化LOB.
即,LOB的所有数据均在客户端进行处理和高速缓存.
True:仅在自动提交设置为False时有效,否则,会在内部将值更改为False.
设置为true后,将使用服务器定位符,而不是在客户端存储LOB数据.
请参见第69页的"大对象定位符支持".
FalseDynamicENABLE_SERVER_PACKETSIZE指定是否将连接包大小设置为服务器建议的值.
如果设置为true,驱动程序将不使用PACKETSIZE连接属性,并且服务器可以使用介于512和最大包大小之间的任何值.
如果设置为false,将使用PACKETSIZE连接属性.
TrueStaticENCRYPT_PASSWORD允许安全登录.
当该属性设置为true时,登录和远程站点口令都会被加密,然后再发送到服务器.
不再以明文形式发送这些口令.
ENCRYPT_PASSWORD优先于RETRY_WITH_NO_ENCRYPTION.
有关口令加密的详细信息,请参见第80页的"使用口令加密".
FalseStatic属性说明缺省值Dynamic或Static建立连接16jConnectforJDBCESCAPE_PROCESSING_DEFAULT避免处理SQL语句中的JDBC函数转义.
缺省情况下,jConnect会分析提交到数据库的所有SQL语句,以查找有效的JDBC函数转义.
如果应用程序不在其SQL调用中使用JDBC函数转义,可将此连接属性设置为"false"以避免此处理过程.
这样做可以使性能获得略微改善.
此外,ESCAPE_PROCESSING_DEFAULT可帮助在SQL语法中使用大括号的后端服务器(如SybaseIQ)TrueStaticEXECUTE_BATCH_PAST_ERRORS指定jConnect允许批处理更新操作忽略在执行各个语句时遇到的非致命错误并完成批处理更新,还是中止批处理更新操作.
值:True–允许批处理更新操作忽略遇到的非致命错误并完成批处理更新.
False–在遇到非致命错误时中止批处理更新.
FalseStaticEXPIRESTRING包含许可证有效date.
除jConnect的评估副本之外,其余副本的有效期均设置为Never.
这是一个只读属性.
NeverStaticFAKE_METADATA返回假元数据.
如果在调用ResultSetMetaData方法getCatalogName、getSchemaName和getTableName时此属性设置为"true",由于服务器不提供有用的元数据,调用过程将返回空字符串("").
如果此属性设置为"false",那么调用这些方法将引发"NotImplemented"SQLException.
注释如果已启用宽表且正在使用AdaptiveServer12.
5或更高版本,则将忽略此属性设置,因为服务器提供了有用的元数据.
FalseStaticGET_BY_NAME_USES_COLUMN_LABEL提供与jConnect6.
0之前版本的向后兼容性.
在AdaptiveServer12.
5和更高版本中,jConnect跟以前相比可以访问更多的元数据.
在12.
5版本之前,columnname和columnalias代表同一数据类型.
现在在使用AdaptiveServer12.
5或更高版本且启用宽表的情况下,jConnect可以区分这两者.
若要保留向后兼容性,请将此属性设置为"true".
如果希望调用getByte、getInt、get*(StringcolumnName)以查看列的实际名称,请将此属性设置为"false".
TrueStatic属性说明缺省值Dynamic或Static第2章编程信息程序员参考17GET_COLUMN_LABEL_FOR_NAME保持与jConnect5.
5或更早版本的向后兼容,其中对ResultMetaData.
getColumnName的调用将返回列标签而不是列名称.
值:True–ResultMetaData.
getColumnName返回列标签False–ResultMetaData.
getColumnName返回列名FalseStaticGSSMANAGER_CLASS指定org.
ietf.
jgss.
GSSManager类的一种第三方实现.
可将此属性设置为字符串或GSSManager对象.
如果将此属性设置为字符串,其值应是第三方GSSManager实现的全限定类名.
如果将此属性设置为对象,则该对象必须扩展org.
ietf.
jgss.
GSSManager类.
有关详细信息,请参见第3章"安全性".
NullStaticHOMOGENEOUS_BATCH调用新的ASE优化批处理协议以加快PreparedStatement对象的批处理操作速度.
有效值:True–使用新的优化批处理协议.
False–即使jConnect连接到支持新优化批处理协议的ASE,也使用旧的批处理协议.
请参见第143页的"jConnect中的优化批处理".
TrueDynamicHOSTNAME标识当前主机名.
无.
最大长度是30个字符,如果超过则被截断至30个字符.
StaticHOSTPROC标识主机上的应用程序进程.
无StaticIGNORE_DONE_IN_PROC确定不返回中间更新结果(像在存储过程中那样),而只返回最终结果集.
FalseStatic属性说明缺省值Dynamic或Static建立连接18jConnectforJDBCIGNORE_WARNINGS指定是否检查并生成警告消息.
目前,此属性仅检查有关将时间戳值存储为AdaptiveServerdate和time数据类型(其精度低于Java时间戳)时的精度损失的警告.
有效值:True–jConnect不检查和生成警告消息,因此提高了性能.
False–缺省值,指示jConnect检查并生成警告消息.
注释在将IGNORE_WARNINGS设置为true前,应就此类配置对应用程序产生的影响进行全面测试.
FalseStaticIMPLICIT_CURSOR_FETCH_SIZE将该属性与SELECT_OPENS_CURSOR属性结合使用,可强制jConnect在发送到数据库的每个select查询上打开一个只读游标.
该游标具有在此属性中设置的值提取大小,除非使用Statement.
setFetchSize方法加以覆盖.
0StaticINTERNAL_QUERY_TIMEOUT使用该属性可设置将由在内部创建并用jConnect执行的语句所使用的查询超时.
如果内部命令没有在适当的时间内完成,这可以防止应用程序失败.
0(无超时)DynamicIS_CLOSED_TEST允许指定在调用Connection.
isClosed时向数据库发送何种查询(如果有).
有关详细信息,请参见第101页的"使用Connection.
isClosed和IS_CLOSED_TEST".
NullStaticJ2EE_TCK_COMPLIANT当该属性设置为true时,jConnect驱动程序会启用符合J2EE1.
4技术兼容包(TCK)测试套件的行为,这会导致性能有所下降.
因此,Sybase建议使用缺省值false.
falseStaticJAVA_CHARSET_MAPPING指定用户定义的字符集映射,取代AdaptiveServer的缺省字符集映射.
请参见第39页的"取代缺省字符集映射".
-StaticJCE_PROVIDER_CLASS指定RSA加密算法中使用的JavaCryptographyExtension(JCE)提供程序.
绑定的JCE提供程序.
StaticJCONNECT_VERSION设置版本专有的特性.
请参见第6页的"使用JCONNECT_VERSION".
7StaticLANGUAGE指定来自jConnect和服务器的消息的显示语言.
该设置必须与syslanguages中的语言相符,因为服务器消息将根据您的当地环境中的语言设置进行本地化.
支持的语言包括:中文、美国英语、法语、德语、日语、韩语、波兰语、葡萄牙语和西班牙语.
视版本而定.
请参见第6页的"使用JCONNECT_VERSION".
Static属性说明缺省值Dynamic或Static第2章编程信息程序员参考19LANGUAGE_CURSOR确定jConnect使用"语言游标"而不使用"协议游标".
请参见第144页的"游标性能".
FalseStaticLITERAL_PARAMS如果设置为"true",那么setXXX方法在PreparedStatement接口中设置的任何参数都会在SQL语句执行时以文字形式插入该语句.
如果设置为"false",参数标记将留在SQL语句中,而参数值被单独发送给服务器.
FalseStaticNEWPASSWORD指定口令有效期处理过程中使用的新口令.
NullStaticOPTIMIZE_FOR_PERFORMANCE指定是否启用jConnect性能增强属性.
目前,此属性仅控制IGNORE_WARNINGS属性.
有效值:True–jConnect在增强性能模式下运行.
False–缺省值,表示jConnect在正常模式下运行.
注释在将OPTIMIZE_FOR_PERFORMANCE设置为true前,应就此类配置对应用程序产生的影响进行全面测试.
FalseStaticOPTIMIZE_STRING_CONVERSIONS指定是否启用字符串转换优化.
客户端在SQL预准备语句中使用字符数据类型时,此优化行为可提高jConnect的性能.
值:0–缺省值;不启用字符串转换优化.
1–在jConnect使用utf8或服务器缺省字符集时,启用字符串转换优化.
2–在所有情况下均启用字符串转换优化.
0StaticPACKETSIZE标识网络包大小.
如果使用的是AdaptiveServer15.
0或更高版本,Sybase建议您不要设置此属性,并让jConnect和AdaptiveServer选用适合于您的环境的网络包大小.
512StaticPASSWORD标识登录口令.
如果使用getConnection(String,String,String)方法,将自动设置;如果使用getConnection(String,Props),将显式设置.
无Static属性说明缺省值Dynamic或Static建立连接20jConnectforJDBCPRELOAD_JARS包含以逗号分隔的与指定CLASS_LOADER相关联的.
jar文件名的列表.
这些.
jar文件在连接时装载,可供使用相同jConnect驱动程序的任何其它连接使用.
有关详细信息,请参见第89页的"预装载.
jar文件".
NullStaticPROMPT_FOR_NEWPASSWORD指定是执行透明口令更改还是提示输入新口令.
值:True–提示手动设置新口令.
False–jConnect检查NEWPASSWORD的值,如果不是空值,则使用该值替换到期口令.
FalseStaticPROTOCOL_CAPTURE指定用于捕获应用程序和AdaptiveServer间的TDS通信的文件.
NullDynamicPROXY指定网关地址.
对于HTTP协议,URL是http://host:port.
若要使用支持加密的HTTPS协议,URL应为https://host:port/servlet_alias.
无StaticQUERY_TIMEOUT_CANCELS_ALL强制jConnect在读取超时时取消连接上的所有语句.
可以在客户端调用execute()但由于死锁(例如,试图读取当前正在另一个事务中更新的表)而超时时使用此行为.
FalseDynamicRELEASE_LOCKS_ON_CURSOR_CLOSE指定在游标关闭时AdaptiveServer是否在隔离级别2和3释放共享只读游标锁:False–在游标关闭时不释放共享游标锁.
True–在游标关闭时释放共享游标锁.
请参见第54页的"在游标关闭时释放锁".
FalseStaticREMOTEPWD包含用于通过服务器到服务器远程过程调用进行访问的远程服务器口令.
请参见第44页的"执行服务器到服务器的远程过程调用".
无StaticREPEAT_READ确定驱动程序是否保留列和输出参数的副本,以便可以随机读取或重复读取列.
请参见第136页的"REPEAT_READ连接属性".
TrueStatic属性说明缺省值Dynamic或Static第2章编程信息程序员参考21REQUEST_HA_SESSION指示连接客户端是否希望开始高可用性(HA)故障切换会话.
请参见第40页的"实施高可用性故障切换支持".
建立连接后将不能重置此属性.
如果希望请求故障切换会话时具有更大的灵活性,可以对客户端应用程序进行编码,使其在运行期设置REQUEST_HA_SESSION.
注释此属性设置为"true"将导致jConnect尝试进行故障切换登录.
如果没有正确设置此连接属性,即使已为故障切换配置了服务器,也不能启动故障切换会话.
FalseStaticREQUEST_KERBEROS_SESSION确定jConnect是否使用Kerberos进行鉴定.
如果此属性设置为"true",还必须指定SERVICE_PRINCIPAL_NAME属性的值.
可能还要为GSSMANAGER_CLASS属性提供值.
有关详细信息,请参见第3章"安全性".
FalseStaticRETRY_WITH_NO_ENCRYPTION允许服务器使用明文口令重新尝试登录当ENCRYPT_PASSWORD和RETRY_WITH_NO_ENCRYPTION属性都设置为true时,jConnect会首先使用加密口令登录.
如果登录失败,jConnect将使用明文口令登录.
有关口令加密的详细信息,请参见第80页的"使用口令加密".
FalseStaticRMNAME在使用分布式事务(XA)时设置资源管理器名称.
此属性将覆盖可能在LDAP服务器条目中设置的资源管理器名称.
有关详细信息,请参见第99页的"分布式事务管理支持".
NullStaticSECONDARY_SERVER_HOSTPORT在客户端使用HA故障切换会话时设置辅助服务器的主机名和端口.
此属性的值应采用下列格式:hostName:portNumber.
除非REQUEST_HA_SESSION也设置为"true",否则将忽略此属性.
有关详细信息,请参见第40页的"实施高可用性故障切换支持".
NullStatic属性说明缺省值Dynamic或Static建立连接22jConnectforJDBCSELECT_OPENS_CURSOR确定对Statement.
executeQuery的调用在查询包含FORUPDATE子句时是否自动生成游标.
如果前面已经在同一语句中调用了Statement.
setFetchSize或Statement.
setCursorName,那么将SELECT_OPENS_CURSOR设置为"true"将不起作用.
注释将SELECT_OPENS_CURSOR设置为"true"时,系统性能可能会下降.
有关在jConnect中使用游标的详细信息,请参见第47页的"对结果集使用游标".
FalseStaticSEND_BATCH_IMMEDIATE指定jConnect是在调用PreparedStatement.
addBatch()后立即为当前行发送参数,还是仅在调用PreparedStatement.
executeBatch()后再发送.
True–jConnect在调用PreparedStatement.
addBatch()后立即为当前行发送参数.
这会最大限度地减少客户端内存的使用率,并让服务器有更多时间来处理批处理参数.
False–jConnect仅在调用PreparedStatement.
executeBatch()后才发送批处理参数.
FalseDynamicSERIALIZE_REQUESTS确定jConnect在发送其它请求之前是否等待服务器的响应.
FalseStaticSERVER_INITIATED_TRANSACTIONS允许服务器控制事务.
缺省情况下,该属性设置为true,并且jConnect通过使用Transact-SQL命令setchainedon来允许服务器启动并控制事务.
如果设置为false,则jConnect通过使用Transact-SQL命令begintran启动并控制事务.
Sybase建议允许服务器控制事务.
TrueStaticSERVICENAME指示DirectConnect网关服务的后台数据库服务器的名称.
还用于指示在连接到SQLAnywhere之后应使用的数据库.
无StaticSERVERTYPE在连接到OpenSwitch时将此属性设置为"OSW".
这使得jConnect可以向OpenSwitch发送某些指令,允许OpenSwitch在将连接重定向到另一个服务器实例时记住初始的连接设置,例如隔离级别、textsize、带引号的标识符和autocommit.
无Static属性说明缺省值Dynamic或Static第2章编程信息程序员参考23SERVICE_PRINCIPAL_NAME在建立到AdaptiveServer的Kerberos连接时使用.
此属性的值应与密钥分发中心(KDC)中的服务器条目和数据库运行时所使用的服务器名称对应.
如果REQUEST_KERBEROS_SESSION属性设置为"false",将会忽略SERVICE_PRINCIPAL_NAME属性的值.
有关详细信息,请参见第3章"安全性".
NullStaticSESSION_IDTDS会话ID.
如果设置此属性,jConnect将认为应用程序正试图恢复由TDS贯通网关保持打开的现有TDS会话的通信.
jConnect将跳过登录协商并将所有来自应用程序的请求转发到指定的会话ID.
NullStaticSESSION_TIMEOUT指定HTTP贯通会话(使用jConnectTDS贯通服务器小程序创建)在空闲时保持活动的时间量(以秒为单位).
在达到指定时间后,连接会自动关闭.
有关TDS贯通服务器小程序的详细信息,请参见第151页的"使用TDS贯通".
NullStaticSETMAXROWS_AFFECTS_SELECT_ONLY指定setMaxRows是否仅限制select语句返回的行,以与JDBC规范一致.
值:True–Statement.
setMaxRows(intmax)仅限制作为select语句的结果返回的行数.
False–Statement.
setMaxRows(intmax)对作为select、insert、update和delete语句的结果返回的行数加以限制.
当连接到AdaptiveServer15.
5或更低版本时,SETMAXROWS_AFFECTS_SELECT_ONLY会被忽略.
TrueStaticSQLINITSTRING定义要在连接打开时传递给数据库服务器的一组命令.
这些命令必须是可以用Statement.
executeUpdate方法执行的SQL命令.
NullStaticSTREAM_CACHE_SIZE指定用于高速缓存语句响应流的最大大小.
Null(无限制的高速缓存大小)DynamicSTRIP_BLANKS强制服务器在将字符串值存储到表中之前,先删除其前导空白和尾随空白.
值:0–缺省值;客户端发送的字符串值"按原样"存储.
1–在将字符串值存储到表中之前,先删除其前导空白和尾随空白.
0Static属性说明缺省值Dynamic或Static建立连接24jConnectforJDBCSUPPRESS_CONTROL_TOKEN取消发送控制令牌.
值:0–缺省值;发送控制令牌.
1–取消发送控制令牌.
0StaticSUPPRESS_PARAM_FORMAT在执行动态SQL预准备语句时,jConnect客户端可使用SUPPRESS_PARAM_FORMAT连接字符串属性来抑制参数格式元数据.
在可能的情况下,客户端会减少发送的参数元数据以提高性能.
值:0–在select、insert和update操作中不抑制参数格式元数据.
1–缺省值;在可能的情况下抑制参数格式元数据.
1StaticSUPPRESS_ROW_FORMAT在jConnect中,客户端可使用SUPPRESS_ROW_FORMAT连接字符串属性来强制AdaptiveServer仅在动态SQL预准备语句的行格式更改时发送TDS_ROWFMT或TDS_ROWFMT2数据.
这样,AdaptiveServer可以尽量向客户端发送较少的数据,从而提高性能.
值:0–即便行格式未发生更改,也发送TDS_ROWFMT或TDS_ROWFMT2数据.
1–缺省值;强制服务器仅在行格式更改时才发送TDS_ROWFMT或TDS_ROWFMT2数据.
1StaticSUPPRESS_ROW_FORMAT2指定AdaptiveServer尽可能使用TDS_ROWFMT字节序列而不是TDS_ROWFMT2字节序列发送数据.
值:0–缺省值;不抑制TDS_ROWFMT2.
1–强制服务器尽可能以TDS_ROWFMT格式发送数据.
注释在连接到AdaptiveServer15.
7ESD#1及更高版本时,应改用SUPPRESS_ROW_FORMAT连接属性.
0Static属性说明缺省值Dynamic或Static第2章编程信息程序员参考25连接到AdaptiveServer在Java应用程序中,定义一个使用jConnect驱动程序连接到AdaptiveServer的URL.
此URL的基本格式如下:jdbc:sybase:Tds:host:port其中:jdbc:sybase标识驱动程序.
SYBSOCKET_FACTORY使jConnect能够使用自定义套接字实现.
将SYBSOCKET_FACTORY设置为下列两项之一:实现com.
sybase.
jdbcx.
SybSocketFactory的类的名称;或"DEFAULT",设置为此值将实例化新的java.
net.
Socket()使用此属性可建立到数据库的SSL连接.
NullStaticTEXTSIZE允许设置文本大小.
缺省情况下,AdaptiveServer和SQLAnywhere允许从图像或文本列中读取32,627字节.
如果已经安装了jConnectmda表,jConnect会将该值更改为2GB.
但是,如果在连接到OpenSwitch时设置该值,则允许连接在OpenSwitch将连接重定向到另一个服务器实例时记住此设置.
2GBStaticUSE_METADATA在建立连接时创建并初始化DatabaseMetaData对象.
连接到指定的数据库必须要使用DatabaseMetaData对象.
jConnect将DatabaseMetaData用于某些功能,如分布式事务管理支持(JTA/JTS)和动态类装载(DCL).
如果收到错误010SJ(表明应用程序需要元数据),请安装jConnect附带的用于返回元数据的存储过程.
请参见《jConnectforJDBC安装指南》第3章中的"安装存储过程".
TrueStaticUSER指定登录ID.
如果使用getConnection(String,String,String)方法,将自动设置;如果使用getConnection(String,Props),将显式设置.
无StaticVERSIONSTRING提供JDBC驱动程序的只读版本信息.
jConnect驱动程序版本Static属性说明缺省值Dynamic或Static建立连接26jConnectforJDBCTds是AdaptiveServer的Sybase通信协议.
host:port是AdaptiveServer主机名和监听端口.
有关数据库或OpenServer应用程序使用的条目,请参见$SYBASE/interfaces(UNIX)或%SYBASE%\ini\sql.
ini(Windows).
从"query"条目可获取host:port.
可使用下面的格式连接到特定数据库:jdbc:sybase:Tds:host:port/database注释若要使用SQLAnywhere或DirectConnect连接到特定数据库,请使用SERVICENAME连接属性而不是"/database"来指定数据库名称.
示例以下代码将创建到主机"myserver"上的监听端口3697的AdaptiveServer的连接.
SysProps.
put("user","userid");SysProps.
put("password","user_password");Stringurl="jdbc:sybase:Tds:myserver:3697";Connection_con=DriverManager.
getConnection(url,SysProps);URL连接属性参数可以在定义URL时指定jConnect驱动程序连接属性的值.
注释在URL中设置的驱动程序连接属性不会覆盖在应用程序中使用DriverManager.
getConnection方法设置的任何相应的连接属性.
若要在URL中设置连接属性,请将属性名及其值附加到URL定义中.
使用以下语法:jdbc:sybase:Tds:host:port/databaseproperty_name=value要设置多个连接属性,请附加每个额外的连接属性及其值(前面加上"&").
例如:jdbc:sybase:Tds:myserver:1234/mydatabaseLITERAL_PARAMS=true&PACKETSIZE=512&HOSTNAME=myhost如果其中某个连接属性的值包含"&",请在该连接属性值的"&"前加一个反斜杠(\).
例如,如果主机名是"a&bhost",则使用下列语法:第2章编程信息程序员参考27jdbc:sybase:Tds:myserver:1234/mydatabaseLITERAL_PARAMS=true&PACKETSIZE=512&HOSTNAME=a\&bhost请勿对连接属性值使用引号,即使这些值是字符串.
例如,使用:HOSTNAME=myhost而不是:HOSTNAME="myhost"使用sql.
ini和interfaces文件目录服务可以使用sql.
ini文件(对于Windows)和interfaces文件(对于UNIX)为jConnectforJDBC提供服务器信息.
通过使用sql.
ini或interfaces文件,企业可以集中管理企业网络中的可用服务的相关信息(包括AdaptiveServer信息).
使用连接字符串标识sql.
ini或interfaces文件.
在jConnectforJDBC上,只能连接到单个目录服务URL(DSURL).
用于jConnect的单个DSURL的连接字符串在连接到DSURL时,您必须指定sql.
ini或interfaces文件的路径和服务器名称.
否则,jConnect将返回错误.
以下命令指定sql.
ini文件的路径:Stringurl="jdbc:sybase:jndi:file://D:/syb1252/ini/mysql.
inimyaseISO1"其中:服务器名称为myaseISO1sql.
ini文件路径为file://D:/syb1252/ini/sql.
ini以下命令指定interfaces文件的路径:Stringurl="jdbc:sybase:jndi:file:///work/sybase/interfacesmyase"其中:服务器名称为myaseinterfaces文件路径为file:///work/sybase/interfaces建立连接28jConnectforJDBC适用于SSL的sql.
ini和interfaces文件的格式以下是用于SSL的sql.
ini文件的格式:[SYBSRV2]master=nlwnsck,mango1,4100,sslquery=nlwnsck,mango1,4100,sslquery=nlwnsck,mango1,5000,sslinterfaces文件的格式为:sybsrv2mastertcpethermango15000sslquerytcpethermango14100sslquerytcpethermango15000ssl注释jConnect支持在sql.
ini或interfaces文件中的同一服务器名称下存在多个查询条目.
jConnect尝试按照sql.
ini或interfaces文件中的顺序,通过查询条目连接到host或port值.
如果jConnect在查询条目中找到SSL,它将通过指定应用程序特定的套接字工厂来要求对应用程序进行编码以处理SSL连接,否则,连接可能会失败.
使用JNDI连接到服务器在jConnect中,您可以使用Java命名和目录接口(JNDI)来提供连接信息,它可以提供:一个集中位置,可以从中指定主机名和端口以连接到服务器.
不需要在应用程序中添加特定的主机和端口号的代码.
一个集中位置,可以从中指定供所有应用程序使用的连接属性和缺省数据库.
用于处理不成功的连接尝试的jConnectCONNECTION_FAILOVER属性.
CONNECTION_FAILOVER设置为"true"时,jConnect将尝试连接到JNDI名称空间中的主机/端口服务器地址序列,直到连接成功.
要配合使用jConnect和JNDI,需要确保在JNDI访问的任何目录服务中都能获得特定的信息,并且在javax.
naming.
Context类中设置了所需的信息.
本节包含以下主题:使用JNDI的连接URL所需的目录服务信息第2章编程信息程序员参考29CONNECTION_FAILOVER连接属性提供JNDI环境信息使用JNDI的连接URL若要指定jConnect应使用JNDI获得连接信息,请将"jndi"作为URL协议放在"sybase"后面:jdbc:sybase:jndi:protocol-information-for-use-with-JNDIURL中"jndi"后的任何内容都将通过JNDI进行处理.
例如,若要使用JNDI处理轻量目录访问协议(LDAP),可以输入以下代码:jdbc:sybase:jndi:ldap://LDAP_hostname:port_number/servername=Sybase11,o=MyCompany,c=US此URL告知JNDI从LDAP服务器获取信息,提供要使用的LDAP服务器的主机名和端口号,并且以特定于LDAP形式的提供数据库服务器的名称.
所需的目录服务信息当配合使用JNDI和jConnect时,JNDI需要为目标数据库服务器返回以下信息:要连接到的主机名和端口号要使用的数据库的名称不允许单个应用程序自己设置的任何连接属性此信息需要按照固定格式存储在任何用于提供连接信息的目录服务中.
要求的格式包括一个数值对象标识符(OID),它标识所提供的信息的类型(如目标数据库),随后是格式化信息.
注释可以使用别名代替OID来引用属性.
表2-3显示了要求的格式.
建立连接30jConnectforJDBC表2-3:JNDI的目录服务信息注释用斜体表示的属性是必需的.
以下示例演示为LDAP目录服务下的数据库服务器"SYBASE11"输入的连接信息.
示例1使用的是属性OID.
示例2使用的是属性别名,它不区分大小写.
可以使用OID也可以使用别名.
示例1dn:servername=SYBASE11,o=MyCompany,c=USservername:SYBASE111.
3.
6.
1.
4.
1.
897.
4.
2.
5:TCP#1#giotto12661.
3.
6.
1.
4.
1.
897.
4.
2.
5:TCP#1#giotto13371.
3.
6.
1.
4.
1.
897.
4.
2.
5:TCP#1#standby144441.
3.
6.
1.
4.
1.
897.
4.
2.
10:REPEAT_READ=false&PACKETSIZE=10241.
3.
6.
1.
4.
1.
897.
4.
2.
10:CONNECTION_FAILOVER=true属性说明别名OID(object_id)LDAP目录服务中的接口条目替换sybaseServer1.
3.
6.
1.
4.
1.
897.
4.
1.
1sybaseServerLDAP属性的集合点sybaseServer1.
3.
6.
1.
4.
1.
897.
4.
2版本属性sybaseVersion1.
3.
6.
1.
4.
1.
897.
4.
2.
1服务器名称属性sybaseServer1.
3.
6.
1.
4.
1.
897.
4.
2.
2服务属性sybaseService1.
3.
6.
1.
4.
1.
897.
4.
2.
3状态属性sybaseStatus1.
3.
6.
1.
4.
1.
897.
4.
2.
4地址属性sybaseAddress1.
3.
6.
1.
4.
1.
897.
4.
2.
5安全性机制属性sybaseSecurity1.
3.
6.
1.
4.
1.
897.
4.
2.
6重试次数属性sybaseRetryCount1.
3.
6.
1.
4.
1.
897.
4.
2.
7循环延迟属性sybaseRetryDelay1.
3.
6.
1.
4.
1.
897.
4.
2.
8jConnect连接协议sybaseJconnectProtocol1.
3.
6.
1.
4.
1.
897.
4.
2.
9jConnect连接属性sybaseJconnectProperty1.
3.
6.
1.
4.
1.
897.
4.
2.
10数据库名sybaseDatabasename1.
3.
6.
1.
4.
1.
897.
4.
2.
11高可用性故障切换服务器名称属性sybaseHAservername1.
3.
6.
1.
4.
1.
897.
4.
2.
15ResourceManager名称sybaseResourceManagerName1.
3.
6.
1.
4.
1.
897.
4.
2.
16ResourceManager类型sybaseResourceManagerType1.
3.
6.
1.
4.
1.
897.
4.
2.
17JDBCDataSource接口sybaseJdbcDataSource-Interface1.
3.
6.
1.
4.
1.
897.
4.
2.
18ServerTypesybaseServerType1.
3.
6.
1.
4.
1.
897.
4.
2.
19第2章编程信息程序员参考311.
3.
6.
1.
4.
1.
897.
4.
2.
11:pubs21.
3.
6.
1.
4.
1.
897.
4.
2.
9:Tds示例2dn:servername=SYBASE11,o=MyCompany,c=USservername:SYBASE11sybaseAddress:TCP#1#giotto1266sybaseAddress:TCP#1#giotto1337sybaseAddress:TCP#1#standby14444sybaseJconnectProperty:REPEAT_READ=false&PACKETSIZE=1024sybaseJconnectProperty:CONNECTION_FAILOVER=truesybaseDatabasename:pubs2sybaseJconnectProtocol:Tds在这些示例中,可通过主机"giotto"上的端口1266或1337访问SYBASE11,也可通过主机"standby1"上的端口4444对其进行访问.
REPEAT_READ和PACKETSIZE这两个连接属性在一个条目中设置.
CONNECTION_FAILOVER连接属性是作为单独条目设置的.
连接到SYBASE11的应用程序开始时是与pubs2数据库连接.
不需要指定连接协议,但如果指定了,则必须以"Tds"而不是"TDS"的形式输入该属性.
CONNECTION_FAILOVER连接属性CONNECTION_FAILOVER是布尔值连接属性,可以在jConnect使用JNDI获取连接信息时使用该属性.
如果CONNECTION_FAILOVER设置为True,jConnect将多次尝试连接到服务器.
如果连接到与服务器关联的主机和端口号的尝试失败,jConnect将使用JNDI获取与该服务器关联的下一个主机和端口号,并通过它们尝试连接.
连接尝试将按顺序使用与服务器关联的所有主机和端口.
例如,如果CONNECTION_FAILOVER设置为True,并且数据库服务器与下列主机和端口号相关联(如前面LDAP示例中所述):1.
3.
6.
1.
4.
1.
897.
4.
2.
5:TCP#1#giotto12661.
3.
6.
1.
4.
1.
897.
4.
2.
5:TCP#1#giotto13371.
3.
6.
1.
4.
1.
897.
4.
2.
5:TCP#1#standby4444为了连接到服务器,jConnect会尝试通过端口1266连接到主机"giotto".
如果失败,jConnect会尝试"giotto"上的端口1337.
如果再次失败,jConnect就会尝试通过端口4444连接到主机"standby1".
CONNECTION_FAILOVER的缺省值为True.
如果CONNECTION_FAILOVER设置为False,jConnect将尝试连接到初始主机和端口号.
如果尝试失败,jConnect将抛出一个SQL例外并不再重试.
建立连接32jConnectforJDBC提供JNDI环境信息若要与JNDI一起使用jConnect,您应该熟悉JNDIspecificationfromOracleTechnologyNetworkforJava(http://www.
oracle.
com/technetwork/java/jndi/index.
html).
特别是当JNDI和jConnect一起使用时,需要确保在javax.
naming.
directory.
DirContext中设置所需的初始化属性.
这些属性可以在系统级或在运行期设置.
两个重要属性是:Context.
INITIAL_CONTEXT_FACTORY此属性包含JNDI使用的初始环境工厂的全限定类名.
这确定了在Context.
PROVIDER_URL属性中指定的URL使用的JNDI驱动程序.
Context.
PROVIDER_URL此属性获取驱动程序(如LDAP驱动程序)要访问的目录服务的URL.
此URL应该是一个字符串,如"ldap://ldaphost:427".
以下示例演示如何在运行期设置环境属性以及如何使用JNDI和LDAP获取连接.
在该示例中,INITIAL_CONTEXT_FACTORY环境属性设置为调用LDAP服务提供程序的Oracle实施.
PROVIDER_URL环境属性被设置为位于主机"ldap_server1"上的389端口的LDAP目录服务的URL.
Propertiesprops=newProperties();/*WewanttouseLDAP,soINITIAL_CONTEXT_FACTORYissettothe*classnameofanLDAPcontextfactory.
Inthiscase,the*contextfactoryisprovidedbySun'simplementationofa*driverforLDAPdirectoryservice.
*/props.
put(Context.
INITIAL_CONTEXT_FACTORY,"com.
sun.
jndi.
ldap.
LdapCtxFactory");/*Now,wesetPROVIDER_URLtotheURLoftheLDAPserverthat*istoprovidedirectoryinformationfortheconnection.
*/props.
put(Context.
PROVIDER_URL,"ldap://ldap_server1:389");/*Setupadditionalcontextproperties,asneeded.
*/props.
put("user","xyz");props.
put("password","123");/*gettheconnection*/Connectioncon=DriverManager.
getConnection第2章编程信息程序员参考33("jdbc:sybase:jndi:ldap://ldap_server1:389"+"/servername=Sybase11,o=MyCompany,c=US",props);传递给getConnection的连接字符串包含开发人员必须提供的特定于LDAP的信息.
在运行期设置JNDI属性后(如上例所示),jConnect将它们传递给要用于初始化服务器的JNDI,如以下jConnect代码所示:javax.
naming.
directory.
DirContextctx=newjavax.
naming.
directory.
InitialDirContext(props);jConnect然后会通过调用DirContext.
getAtributes从JNDI获取所需的连接信息,如以下示例所示,其中ctx是一个DirContext对象:javax.
naming.
directory.
Attributesattrs=ctx.
getAttributes("ldap://ldap_server1:389/servername="+"Sybase11",SYBASE_SERVER_ATTRIBUTES);此例中,SYBASE_SERVER_ATTRIBUTES是在jConnect中定义的字符串数组.
数组值是表2-3中列出的必需目录信息的OID.
处理国际化和本地化本节讨论与jConnect有关的国际化和本地化问题.
使用jConnect传递Unicode数据在AdaptiveServer12.
5和更高版本中,数据库客户端可以使用unichar和univarchar数据类型.
这两种数据类型可以实现Unicode数据的有效存储和检索.
以下为从Unicode标准(版本2.
0)中引用的一段内容:"Unicode标准是对字符和文本进行编码的具有固定宽度的一致的编码方案.
这种用于信息处理的国际字符代码的指令系统包括当今世界上的主要脚本和常用的技术符号.
Unicode字符编码将字母字符、表意字符和符号同等对待,这意味着它们可以混合使用,且使用的难易程度相同.
Unicode标准使用ASCII字符集的模型,但使用16位编码以完全支持多语言文本.
"处理国际化和本地化34jConnectforJDBC这意味着用户可以指定数据库表列存储Unicode数据,而不用考虑服务器的缺省字符集.
注释在AdaptiveServer12.
5到12.
5.
0.
3版本中,服务器必须具有缺省字符集utf-8才能使用Unicode数据类型.
但在AdaptiveServer12.
5.
1和更高版本中,数据库用户无需考虑服务器的缺省字符集即可使用unichar和univarchar数据类型.
服务器接受unichar和univarchar数据时,jConnect将执行以下操作:对于客户端要发送到服务器的所有字符数据–例如,使用PreparedStatement.
setString(intcolumn,Stringvalue)–jConnect确定字符串是否能转换为服务器的缺省字符集.
如果jConnect确定这些字符不能转换为服务器的字符集(例如,有些字符无法用服务器的字符集表示),它会将数据以unichar/univarchar数据编码发送给服务器.
例如,如果客户端尝试向以iso_1作为缺省字符集的AdaptiveServer12.
5.
1发送Unicode日语字符,jConnect将检测到该日语字符不能转换为iso_1字符.
jConnect随后以Unicode数据发送字符串.
客户端向服务器发送unichar/univarchar数据会降低计算机的性能.
这是因为jConnect必须对不能直接映射到服务器的缺省字符集的所有字符串和字符执行两次字符到字节的转换.
如果您使用的是6.
05以前的jConnect版本,并想要使用unichar和univarchar数据类型,您必须执行以下任务:1设置JCONNECT_VERSION=6或更高版本.
有关详细信息,请参见第6页的"使用JCONNECT_VERSION".
2您需要将DISABLE_UNICHAR_SENDING连接属性设置为false.
从jConnect6.
05开始,此属性在缺省情况下设置为false.
有关详细信息,请参见第10页的"设置连接属性".
注释有关unichar和univarchar数据类型支持的详细信息,请参见AdaptiveServerEnterprise手册.
第2章编程信息程序员参考35jConnect字符集转换程序jConnect对所有字符集转换使用特殊类.
通过选择字符集转换程序类,可指定jConnect处理单字节和多字节字符集转换的方式以及转换对应用程序性能的影响.
共有两个字符集转换类.
jConnect使用的转换类基于JCONNECT_VERSION、CHARSET和CHARSET_CONVERTER_CLASS连接属性.
TruncationConverter类只能用于使用ASCII字符的单字节字符集(如iso_1和cp850).
它不能用于多字节字符集或使用非ASCII字符的单字节字符集.
当JCONNECT_VERSION设置为2时,TruncationConverter类是缺省转换程序.
jConnect7使用TruncationConverter类以与jConnectversion2.
2相同的方式处理字符集.
当JCONNECT_VERSION=2时,TruncationConverter类是缺省转换程序.
PureConverter类是纯Java类多字节字符集转换程序.
jConnect在JCONNECT_VERSION=4或更高版本时使用此类.
如果jConnect检测到在CHARSET连接属性中指定的字符集与TruncationConverter类不兼容,则在JCONNECT_VERSION=2时也使用此转换程序.
虽然PureConverter类能实现多字节字符集转换,但也可能降低jConnect驱动程序的性能.
如果需要考虑驱动程序性能,请参见第36页的"提高字符集转换性能".
选择字符集转换程序jConnect使用JCONNECT_VERSION来确定要使用的缺省字符集转换程序类.
JCONNECT_VERSION=2或更高版本时,缺省值为PureConverter和TruncationConverter.
JCONNECT_VERSION=4或更高版本时,缺省值为PureConverter.
也可以通过设置CHARSET_CONVERTER_CLASS连接属性指定希望jConnect使用的字符集转换程序.
如果希望使用jConnect版本的缺省字符集转换程序之外的字符集转换程序,此方法将很有用.
例如,如果您设置JCONNECT_VERSION=4或更高版本,但要使用TruncationConverter类而不使用多字节的PureConverter类,则可以设置CHARSET_CONVERTER_CLASS:.
.
.
props.
put("CHARSET_CONVERTER_CLASS","com.
sybase.
jdbc4.
utils.
TruncationConverter")处理国际化和本地化36jConnectforJDBC设置CHARSET连接属性可以通过设置CHARSET驱动程序属性指定要在应用程序中使用的字符集.
如果没有设置CHARSET属性:JCONNECT_VERSION=2时,jConnect将使用iso_1作为缺省字符集.
JCONNECT_VERSION=3和更高版本时,jConnect将使用数据库的缺省字符集并会在客户端自动调整以执行任何必要的转换.
对于从6.
05开始的jConnect版本,如果jConnect无法将用户数据成功转换为协商的字符集,则在服务器支持Unicode字符时,它会向服务器发送未经转换的Unicode字符,否则会抛出异常.
也可以使用IsqlApp应用程序的-Jcharset命令行选项指定字符集.
若要确定AdaptiveServer上安装了哪些字符集,请在服务器上发出以下SQL查询:selectnamefromsyscharsetsgo对于PureConverter类,如果客户端Java虚拟机(VM)不支持指定的CHARSET,那么连接将失败并引发SQLException,指出必须将CHARSET设置为AdaptiveServer和客户端都支持的字符集.
如果使用TruncationConverter类,则无论指定的CHARSET是否是7位ASCII码,都将进行字符截断.
因此,如果您的应用程序需要处理非ASCII数据(例如任何亚洲语言),则不应使用TruncationConverter,因为这会导致数据损坏.
提高字符集转换性能如果使用多字节字符集并需要提高驱动程序性能,可以使用jConnect示例提供的SunIoConverter类.
有关详细信息,请参见第136页的"SunIoConverter字符集转换".
另外,如果您的应用程序仅处理7位ASCII数据,则可以使用TruncationConverter来提高性能.
支持的字符集表2-4列出了jConnect支持的Sybase字符集.
表中还列出了每个支持的字符集的对应的JDK字节转换程序.
虽然jConnect支持UCS-2,但目前Sybase数据库或OpenServer都不支持UCS-2.
第2章编程信息程序员参考37AdaptiveServer12.
5和更高版本支持一个Unicode版本(称为UTF-16编码).
表2-4:支持的Sybase字符集SybCharset名称JDK字节转换程序ascii_7ASCIIbig5Big5big5hk(针对JDK1.
3及更高版本)Big5_HKSCScp037Cp037cp437Cp437cp500Cp500cp850Cp850cp852Cp852cp855Cp855cp857Cp857cp860Cp860cp863Cp863cp864Cp864cp866Cp866cp869Cp869cp874Cp874cp932MS932cp936GBKcp949Cp949cp950Cp950cp1250Cp1250cp1251Cp1251cp1252Cp1252cp1253Cp1253cp1254Cp1254cp1255Cp1255cp1256Cp1256cp1257Cp1257cp1258Cp1258deckanjiEUC_JPeucgbEUC_CNeucjisEUC_JPeuckscEUC_KR处理国际化和本地化38jConnectforJDBC处理不受支持的字符集jConnect不支持以下Sybase字符集,因为JDK字节转换程序与这些Sybase字符集都不类似:cp1047euccnsgreek8roman8roman9turkish8可以对TruncationConverter类使用这些字符集,只要应用程序只使用这些字符的7位ASCII子集即可.
gb18030GB18030ibm420Cp420ibm918Cp918iso_1ISO8859_1iso88592ISO8859-2is088595ISO8859_5iso88596ISO8859_6iso88597ISO8859_7iso88598ISO8859_8iso88599ISO8859_9iso15ISO8859_15_FDISkoi8KOI8_RmacMacRomanmac_cyrMacCyrillicmac_eeMacCentralEuropemacgreekMacGreekmacturkMacTurkishsjisMS932tis620MS874ucs2Unicodeutf8UTF8SybCharset名称JDK字节转换程序第2章编程信息程序员参考39取代缺省字符集映射使用JAVA_CHARSET_MAPPING连接属性可取代AdaptiveServer的缺省字符集映射.
示例1将服务器字符集cp949映射到ms949:props.
put("CHARSET","cp949");/*Servercharacterset*/props.
put("JAVA_CHARSET_MAPPING","ms949");/*Javacharactersetmapping*/大多数AdaptiveServer字符集与其所映射到的Java字符集同名.
有关映射到Java字符集而使用不同名称的字符集,请参见第37页的表2-4.
欧洲货币符号支持jConnect支持使用欧洲货币符号(或"euro"),并支持欧洲货币符号与UCS-2Unicode间的相互转换.
euro已添加到以下Sybase字符集中:cp1250、cp1251、cp1252、cp1253、cp1254、cp1255、cp1256、cp1257、cp1258、cp874、iso885915和utf8.
若要使用euro符号:使用PureConvertor或CheckPureConverter类,它是一个纯Java多字节字符集转换程序.
有关详细信息,请参见第35页的"jConnect字符集转换程序".
检验是否在服务器上安装了新的字符集.
AdaptiveServer和SQLAnywhere都支持euro符号.
在客户端上选择合适的字符集.
有关详细信息,请参见第36页的"设置CHARSET连接属性".
处理数据库本节讨论与jConnect相关的数据库问题,包括以下主题:实施高可用性故障切换支持执行服务器到服务器的远程过程调用使用AdaptiveServer的宽表支持访问数据库元数据处理数据库40jConnectforJDBC对结果集使用游标使用包括COMPUTE子句的Transact-SQL查询批处理更新支持通过存储过程的结果集更新数据库使用数据类型仅数据锁定表中的可变长度行大对象(LOB)支持大对象定位符支持实施高可用性故障切换支持jConnect支持AdaptiveServer故障切换功能.
注释高可用性系统中的Sybase故障切换与连接故障切换功能不同.
如果希望同时使用这两个功能,Sybase强烈建议您仔细阅读本节内容.
概述Sybase故障切换允许配置两台AdaptiveServer作为协同服务器.
如果主协同服务器发生故障,该服务器的设备、数据库和连接可以由辅助协同服务器接管.
可以对称或非对称地配置高可用性系统:非对称配置包括两台AdaptiveServer,它们在物理上位于不同的计算机上,但彼此相连,以便当一台服务器出现故障时,可以由另一台服务器承担它的工作负荷.
辅助AdaptiveServer充当"热备份",它只有在出现故障切换时才工作.
对称配置也包括两台在不同计算机上运行的AdaptiveServer.
但当出现故障切换时,其中每一个AdaptiveServer都可以充当另一个AdaptiveServer的主协同服务器或辅助协同服务器.
在此配置中,每一个AdaptiveServer都具有完整的功能,都具有各自的系统设备、系统数据库、用户数据库和用户登录.
在上述两种设置中,两台计算机都被配置为双向访问,这样使两台计算机都可以看到并访问对方的磁盘.
第2章编程信息程序员参考41可以在jConnect中启用故障切换,然后将客户端应用程序连接到进行过故障切换配置的AdaptiveServer.
如果主服务器故障切换到辅助服务器,客户端应用程序也会自动切换到辅助服务器并重新建立网络连接.
注释有关详细信息,请参见AdaptiveServerEnterprise中针对AdaptiveServer的《在高可用性系统中使用Sybase故障切换》手册.
要求、依赖性和限制必须配置两个AdaptiveServer才能进行故障切换.
当客户端发生故障切换时,只保留在发生故障切换前提交给数据库的更改.
必须将REQUEST_HA_SESSIONjConnect连接属性设置为"true"(请参见第9页的"连接属性").
发生故障切换时jConnect事件通知不起作用.
请参见第72页的"使用事件通知".
请关闭所有不再使用的语句.
jConnect会存储有关语句的信息以启用故障切换.
未关闭的语句将导致内存泄漏.
在jConnect中实现故障切换可使用以下两种方法在jConnect中实现故障切换支持:使用两个连接属性(REQUEST_HA_SESSION和SECONDARY_SERVER_HOSTPORT),并按以下方式设置:将REQUEST_HA_SESSION设置为"true".
将SECONDARY_SERVER_HOSTPORT设置为辅助服务器监听的主机名和端口号.
请参见第9页的"连接属性"和"SECONDARY_SERVER_HOSTPORT"连接属性.
使用JNDI连接到服务器.
请参见"使用JNDI连接到服务器".
在JNDI所需的目录服务信息文件中加入一个主服务器条目和一个辅助服务器条目.
主服务器条目有一个引用辅助服务器条目的属性(HAOID).
使用LDAP作为JNDI的服务提供程序时,此HA属性可以有以下三种可能的形式:处理数据库42jConnectforJDBCa相对区分名(RDN)–此形式假定与此属性值结合使用的搜索库(通常由java.
naming.
provider.
url属性提供)足以标识辅助服务器.
例如,假定主服务器位于"hostname:4200"上,而辅助服务器位于"hostname:4202"上:dn:servername=haprimary,o=Sybase,c=US1.
3.
6.
1.
4.
1.
897.
4.
2.
5:TCP#1#hostname42001.
3.
6.
1.
4.
1.
897.
4.
2.
15:servername=hasecondaryobjectclass:sybaseServerdn:servername=hasecondary,o=Sybase,c=US1.
3.
6.
1.
4.
1.
897.
4.
2.
5:TCP#1#hostname4202objectclass:sybaseServerb区分名(DN)–此形式假定HA属性的值唯一标识辅助服务器,因此可能复制也可能不复制在搜索库中找到的值.
例如:dn:servername=haprimary,o=Sybase,c=US1.
3.
6.
1.
4.
1.
897.
4.
2.
5:TCP#1#hostname42001.
3.
6.
1.
4.
1.
897.
4.
2.
15:servername=hasecondary,o=Sybase,c=USou=Accountingobjectclass:sybaseServerdn:servername=hasecondary,o=Sybase,c=US,ou=Accounting1.
3.
6.
1.
4.
1.
897.
4.
2.
5:TCP#1#hostname4202objectclass:sybaseServer请注意,hasecondary位于树的其它分支上(请参见附加的ou=Accounting限定符).
cFullLDAPURL–此形式对搜索库没有任何假定.
HA属性应是用于标识辅助服务器的完全限定LDAPURL(它甚至可以指向不同的LDAP服务器).
例如:dn:servername=hafailover,o=Sybase,c=US1.
3.
6.
1.
4.
1.
897.
4.
2.
5:TCP#1#hostname42001.
3.
6.
1.
4.
1.
897.
4.
2.
15:ldap://ldapserver:386/servername=secondary,o=Sybase,c=USou=Accountingobjectclass:sybaseServerdn:servername=secondary,o=Sybase,c=US,ou=Accounting1.
3.
6.
1.
4.
1.
897.
4.
2.
5:TCP#1#hostname4202objectclass:sybaseServerd在JNDI所需的目录服务信息文件中,将REQUEST_HA_SESSION连接属性设置为"true",以使每次建立连接时都启用故障切换会话.
第2章编程信息程序员参考43使用REQUEST_HA_SESSION连接属性表明连接客户端希望与配置为用于故障切换的AdaptiveServer开始一个故障切换会话.
将此属性设置为true指示jConnect将尝试进行故障切换登录.
如果没有设置此连接属性,即使正确配置了服务器,也不会启动故障切换会话.
REQUEST_HA_SESSION的缺省值是false.
像设置其它任何连接属性一样设置此连接属性.
建立连接后将不能重置此属性.
如果希望请求故障切换会话时具有更大的灵活性,可以对客户端应用程序进行编码,使其在运行期设置REQUEST_HA_SESSION.
以下示例演示为LDAP目录服务下的数据库服务器"SYBASE11"输入的连接信息,其中"tahiti"是主服务器,"moorea"是辅助协同服务器:dn:servername=SYBASE11,o=MyCompany,c=US1.
3.
6.
1.
4.
1.
897.
4.
2.
5:TCP#1#tahiti34561.
3.
6.
1.
4.
1.
897.
4.
2.
10:REPEAT_READ=false&PACKETSIZE=10241.
3.
6.
1.
4.
1.
897.
4.
2.
10:CONNECTION_FAILOVER=false1.
3.
6.
1.
4.
1.
897.
4.
2.
11:pubs21.
3.
6.
1.
4.
1.
897.
4.
2.
9:Tds1.
3.
6.
1.
4.
1.
897.
4.
2.
15:servername=SECONDARY1.
3.
6.
1.
4.
1.
897.
4.
2.
10:REQUEST_HA_SESSION=truedn:servername=SECONDARY,o=MyCompany,c=US1.
3.
6.
1.
4.
1.
897.
4.
2.
5:TCP#1#moorea6000使用JNDI和LDAP请求连接:jConnect使用LDAP服务器的目录确定主服务器和辅助服务器的名称和位置:/*gettheconnection*/Connectioncon=DriverManager.
getConnection("jdbc:sybase:jndi:ldap://ldap_server1:389"+"/servername=Sybase11,o=MyCompany,c=US",props);或者指定搜索库:props.
put(Context.
PROVIDER_URL,"ldap://ldap_server1:389/o=MyCompany,c=US");Connectioncon=DriverManager.
getConnection("jdbc:sybase:jndi:servername=Sybase11",props);处理数据库44jConnectforJDBC登录到主服务器如果AdaptiveServer没有配置为用于故障切换或者不能批准故障切换会话,客户端将无法登录并会显示以下警告:'Theserverdeniedyourrequesttousethehigh-availabilityfeature.
Pleasereconfigureyourdatabase,ordonotrequestahigh-availabilitysession.
'故障切换到辅助服务器发生故障切换时将抛出SQL例外JZ0F2:'Sybasehigh-availabilityfailoverhasoccurred.
Thecurrenttransactionisaborted,buttheconnectionisstillusable.
Retryyourtransaction.
'然后客户端使用JNDI自动重新连接到辅助数据库.
注意:客户端连接到的数据库的标识和任何提交的事务都会得到保留.
部分读取的结果集、游标和存储过程调用将丢失.
发生故障切换时,应用程序可能需要重新启动过程或返回到上一个完成的事务或活动.
故障恢复到主服务器有时客户端会从辅助服务器故障恢复到主服务器.
何时发生故障恢复是由系统管理员决定的,他在辅助服务器上发出sp_failback之后,客户端即可期望在主服务器上发生同样的行为和结果,如第44页的"故障切换到辅助服务器"所述.
执行服务器到服务器的远程过程调用在一台服务器上运行的Transact-SQL语言命令和存储过程可以执行位于另一台服务器上的存储过程.
应用程序已连接到的服务器登录到远程服务器,并执行服务器到服务器的远程过程调用.
应用程序可以指定一个"通用"口令供服务器间通信使用,即用于所有服务器间连接的口令.
连接打开后,服务器便可使用此口令登录到任何远程服务器.
缺省情况下,jConnect使用当前连接的口令作为服务器间通信的缺省口令.
第2章编程信息程序员参考45但如果同一用户在两台服务器上的口令不同,且该用户打算执行服务器到服务器的远程过程调用,则应用程序必须为每个要使用的服务器显示定义口令.
jConnect包括一个属性,可以用来设置通用的"远程"口令或在不同的服务器上设置不同的口令.
jConnect允许使用SybDriver类中的setRemotePassword方法设置并配置此属性:PropertiesconnectionProps=newProperties();publicfinalvoidsetRemotePassword(StringserverName,Stringpassword,PropertiesconnectionProps)若要使用此方法,应用程序必须先导入SybDriver类,然后再调用此方法:importcom.
sybase.
jdbcx.
SybDriver;SybDriversybDriver=(SybDriver)Class.
forName("com.
sybase.
jdbc4.
jdbc.
SybDriver").
newInstance();sybDriver.
setRemotePassword(serverName,password,connectionProps);注释若要为不同的服务器设置不同的远程口令,请为每台服务器重复上述调用过程.
此调用将给定的"服务器名-口令"对添加到给定Properties对象中,该对象可以由应用程序在DriverManager.
getConnection(server_url,props)中传递给DriverManager.
如果serverName为null,则将password设置为通用口令,供后续到所有服务器(不包括由前面的setRemotePassword调用明确指定的服务器)的连接使用.
如果应用程序设置了REMOTEPWD属性,jConnect将不再设置缺省的通用口令.
使用AdaptiveServer的宽表支持AdaptiveServer提供的限制和参数要大于以前版本的数据库服务器.
例如:表可以包含1,024列.
Varchar和varbinary列可以包含超过255个字节的数据.
在调用存储过程或者作为PreparedStatement的参数进行调用时,最多可以发送和检索2048个参数.
处理数据库46jConnectforJDBC在连接到AdaptiveServer15.
7ESD#1及更高版本时,最多可以发送和检索32767个PreparedStatement参数.
若要确保jConnect从数据库请求宽表支持,JCONNECT_VERSION的缺省设置必须为6或更高版本.
注释如果将JCONNECT_VERSION设置为低于6,jConnect仍可继续使用AdaptiveServer12.
5版和更高版本.
但如果尝试从需要宽表支持才能完全检索数据的表中选择数据,将可能遇到意外的错误或数据截断情形.
从不支持宽表的Sybase服务器访问数据时,也可以将JCONNECT_VERSION设置为6或更高版本.
在这种情况下,服务器只是忽略宽表支持请求.
除了大量列和参数之外,宽表支持还提供扩展结果集元数据.
例如,在jConnect6.
0之前的版本中,ResultSetMetaData方法getCatalogName、getSchemaName和getTableName都返回"NotImplemented"SQLException,因为服务器没有提供元数据.
启用宽表支持后,服务器将发送回此信息,上述三个方法将返回有用的信息.
访问数据库元数据为了支持JDBCDatabaseMetaData方法,Sybase提供了一组存储过程,jConnect可以调用这些存储过程以获取数据库的元数据.
为使JDBC元数据方法能正常工作,必须在服务器上安装这些存储过程.
如果Sybase服务器上尚未安装用于提供元数据的存储过程,可以使用随jConnect提供的存储过程脚本进行安装:sql_server.
sql在AdaptiveServer12.
0版之前的数据库中安装存储过程.
sql_server12.
sql在AdaptiveServer12.
0.
x版的数据库中安装存储过程.
sql_server12.
5.
sql在AdaptiveServer12.
5.
x版的数据库中安装存储过程.
sql_server15.
0.
sql为AdaptiveServer15.
0到15.
5版安装存储过程.
sql_server15.
7.
sql为AdaptiveServer15.
7.
2或更高版本安装存储过程.
sql_server15.
7.
0.
2.
sql为AdaptiveServer15.
7ESD#2或更高版本安装存储过程.
第2章编程信息程序员参考47sql_asa.
sql–在SQLAnywhere9.
x数据库中安装存储过程sql_asa10.
sql–在SQLAnywhere10.
x数据库中安装存储过程sql_asa11.
sql–在SQLAnywhere11.
x数据库中安装存储过程.
sql_asa12.
sql–在SQLAnywhere12.
x数据库中安装存储过程.
注释这些脚本的最新版本与所有版本的jConnect都兼容.
有关安装存储过程的详细说明,请参见Sybase《jConnectforJDBC安装指南》和Sybase《jConnectforJDBC发行公告》.
此外,若要使用元数据方法,在建立连接时必须将USE_METADATA连接属性设置为"true"(缺省值).
不能获取有关数据库中临时表的元数据.
注释DatabaseMetaData.
getPrimaryKeys方法可查找在表定义(CREATETABLE)中声明或使用altertable(ALTERTABLEADDCONSTRAINT)声明的主键.
它不查找使用sp_primarykey定义的键.
对结果集使用游标jConnect实现许多JDBC2.
0游标和更新方法.
这些方法使得使用游标以及根据结果集中的值更新表的数据行变得更加容易.
在JDBC2.
0中,ResultSet的主要特点在于其类型和并发性.
类型和并发值是java.
sql.
ResultSet接口的一部分,由该接口的javadoc描述.
表2-5描述了jConnect中提供的java.
sql.
ResultSet的特点.
请求时,如果服务器是AdaptiveServer15.
0或更高版本,则jConnect会打开服务器端可滚动游标.
表2-5:jConnect中提供的java.
sql.
ResultSet选项本节包括以下主题:并发类型TYPE_FORWARD_ONLYTYPE_SCROLL_INSENSITIVETYPE_SCROLL_SENSITIVECONCUR_READ_ONLY支持支持不可用CONCUR_UPDATABLE支持不可用不可用处理数据库48jConnectforJDBC创建游标使用JDBC1.
x方法进行定位型更新和删除使用JDBC2.
0方法进行定位型更新和删除对PreparedStatement对象使用游标在jConnect中使用TYPE_SCROLL_INSENSITIVE结果集创建游标使用jConnect创建游标有两种方法:SybStatement.
setCursorName可使用SybStatement.
setCursorName显式指定游标名称.
SybStatement.
setCursorName的签名是:voidsetCursorName(Stringname)throwsSQLException;SybStatement.
setFetchSize可使用SybStatement.
setFetchSize创建游标并指定每次读取操作从数据库返回的行数.
SybStatement.
setFetchSize的签名是:voidsetFetchSize(introws)throwsSQLException;使用setFetchSize创建游标时,jConnect驱动程序会为游标命名.
若要获取游标名称,请使用ResultSet.
getCursorName.
另一种创建游标的方法是在连接上使用以下JDBC方法指定希望语句返回的ResultSet的类型:StatementcreateStatement(intresultSetType,intresultSetConcurrency)throwsSQLException类型和并发值与表2-5中列出的、在ResultSet接口中找到的类型和并发值相对应.
如果请求的是不受支持的ResultSet,将在连接上链接一个SQL警告.
执行返回的Statement时,您将收到与所请求的类型最接近的ResultSet类型.
有关此方法的行为的详细信息,请参见JDBC规范.
如果不使用createStatement,则ResultSet的缺省类型是:如果只调用Statement.
executeQuery,则返回的ResultSet是类型和并发值分别为TYPE_FORWARD_ONLY和CONCUR_READ_ONLY的SybResultSet.
如果调用setCursorName,则从executeQuery返回的ResultSet是类型和并发值分别为TYPE_FORWARD_ONLY和CONCUR_UPDATABLE的SybCursorResultSet.
第2章编程信息程序员参考49如果调用setFetchSize,则从executeQuery返回的ResultSet是类型和并发值分别为TYPE_FORWARD_ONLY和CONCUR_READ_ONLY的SybCursorResultSet.
若要检验ResultSet对象的类型是否是您所需要的类型,请使用以下两种ResultSet方法:intgetConcurrency()throwsSQLException;intgetType()throwsSQLException;创建和使用游标1使用Statement.
setCursorName或SybStatement.
setFetchSize创建游标.
2调用Statement.
executeQuery为语句打开游标并返回游标结果集.
3调用ResultSet.
next读取行并在结果集中定位游标.
下面的示例分别使用上述两种方法创建游标并返回结果集.
它还使用ResultSet.
getCursorName获取通过SybStatement.
setFetchSize创建的游标的名称.
//WithconnasaConnectionobject,createa//Statementobjectandassignitacursorusing//Statement.
setCursorName().
Statementstmt=conn.
createStatement();stmt.
setCursorName("author_cursor");//Usethestatementtoexecuteaqueryandreturn//acursorresultset.
ResultSetrs=stmt.
executeQuery("SELECTau_id,au_lname,au_fnameFROMauthorsWHEREcity='Oakland'");while(rs.
next()){.
.
.
}//Createasecondstatementobjectanduse//SybStatement.
setFetchSize()tocreateacursor//thatreturns10rowsatatime.
SybStatementsyb_stmt=conn.
createStatement();syb_stmt.
setFetchSize(10);//Usethesyb_stmttoexecuteaqueryandreturn//acursorresultset.
SybCursorResultSetrs2=(SybCursorResultSet)syb_stmt.
executeQuery("SELECTau_id,au_lname,au_fnameFROM处理数据库50jConnectforJDBCauthorsWHEREcity='Pinole'");while(rs2.
next()){.
.
.
}//Getthenameofthecursorcreatedthroughthe//setFetchSize()method.
Stringcursor_name=rs2.
getCursorName();.
.
.
//ForjConnect6.
0,createathirdstatement//objectusingthenewmethodonConnection,//andobtainaSCROLL_INSENSITIVEResultSet.
//Note:younolongerhavetodowncastthe//StatementortheResultSet.
Statementstmt=conn.
createStatement(ResultSet.
TYPE_SCROLL_INSENSITIVE,ResultSet.
CONCUR_READ_ONLY);ResultSetrs3=stmt.
executeQuery("SELECT.
.
.
[whatever]");//ExecuteanyoftheJDBC2.
0methodsthat//arevalidforreadonlyResultSets.
rs3.
next();rs3.
previous();rs3.
relative(3);rs3.
afterLast();.
.
.
使用JDBC1.
x方法进行定位型更新和删除下面的示例演示如何使用JDBC1.
x中的方法进行定位型更新.
该示例创建两个Statement对象,一个用于选择游标结果集中的行,另一个用于通过结果集中的行更新数据库.
//Createtwostatementobjectsandcreateacursor//fortheresultsetreturnedbythefirst//statement,stmt1.
Usestmt1toexecuteaquery//andreturnacursorresultset.
Statementstmt1=conn.
createStatement();Statementstmt2=conn.
createStatement();stmt1.
setCursorName("author_cursor");ResultSetrs=stmt1.
executeQuery("SELECTau_id,au_lname,au_fnameFROMauthorsWHEREcity='Oakland'第2章编程信息程序员参考51FORUPDATEOFau_lname");//Getthenameofthecursorcreatedforstmt1so//thatitcanbeusedwithstmt2.
Stringcursor=rs.
getCursorName();//Usestmt2toupdatethedatabasefromthe//resultsetreturnedbystmt1.
Stringlast_name=newString("Smith");while(rs.
next()){if(rs.
getString(1).
equals("274-80-9391")){stmt2.
executeUpdate("UPDATEauthors"+"SETau_lname="+last_name+"WHERECURRENTOF"+cursor);}}在结果集中删除下面的示例使用从上述代码中获得的Statement对象stmt2执行定位型删除:stmt2.
executeUpdate("DELETEFROMauthorsWHERECURRENTOF"+cursor);使用JDBC2.
0方法进行定位型更新和删除本节介绍一些JDBC2.
0方法,可用于更新当前游标行中的列以及通过结果集中的当前游标行更新数据库.
每个方法后面都有一个示例.
在结果集中更新列JDBC2.
0提供了多个方法,用于在客户端更新内存中的结果集的列值.
然后可使用更新的值对基础数据库执行更新、插入或删除操作.
所有这些方法都在SybCursorResultSet类中实现.
下面是jConnect中提供的一些JDBC2.
0更新方法:voidupdateAsciiStream(StringcolumnName,java.
io.
InputStreamx,intlength)throwsSQLException;voidupdateBoolean(intcolumnIndex,booleanx)throwsSQLException;voidupdateFloat(intcolumnIndex,floatx)throwsSQLException;voidupdateInt(StringcolumnName,intx)throwsSQLException;voidupdateInt(intcolumnIndex,intx)throwsSQLException;处理数据库52jConnectforJDBCvoidupdateObject(StringcolumnName,Objectx)throwsSQLException;用于通过结果集更新数据库的方法JDBC2.
0指定了两种方法,用于根据结果集中的当前值更新或删除数据库中的行.
这些方法在形式上比JDBC1.
x中的Statement.
executeUpdate简单,并且不需要使用游标名称.
它们在SybCursorResultSet中实现:voidupdateRow()throwsSQLException;voiddeleteRow()throwsSQLException;注释结果集的并发必须是CONCUR_UPDATABLE.
否则上述方法将引发例外.
对于insertRow,必须指定所有要求非空条目的表列.
DatabaseMetaData提供的方法决定这些更改何时可见.
示例下面的示例将创建一个用于返回游标结果集的Statement对象.
对于结果集中的每一行,列值在内存中更新,然后数据库通过该行的新列值得到更新.
//CreateaStatementobjectandsetfetchsizeto//25.
ThiscreatesacursorfortheStatement//objectUsethestatementtoreturnacursor//resultset.
SybStatementsyb_stmt=(SybStatement)conn.
createStatement(ResultSet.
TYPE_SCROLL_INSENSITIVE,ResultSet.
CONCUR_UPDATABLE);syb_stmt.
setFetchSize(25);SybCursorResultSetsyb_rs=(SybCursorResultSet)syb_stmt.
executeQuery("SELECT*fromT1WHERE.
.
.
")//Updateeachrowintheresultsetaccordingto//codeinthefollowingwhileloop.
jConnect//fetches25rowsatatime,untilfewerthan25//rowsareleft.
Itslastfetchtakesany//remainingrows.
while(syb_rs.
next()){//Updatecolumns2and3ofeachrow,where//column2isavarcharinthedatabaseand//column3isaninteger.
syb_rs.
updateString(2,"xyz");syb_rs.
updateInt(3,100);//Now,updatetherowinthedatabase.
syb_rs.
updateRow();第2章编程信息程序员参考53}//CreateaStatementobjectusingthe//JDBC2.
0methodimplementedinjConnect6.
0Statementstmt=conn.
createStatement(ResultSet.
TYPE_FORWARD_ONLY,ResultSet.
CONCUR_UPDATABLE);//InjConnect6.
0,downcastingtoSybCursorResultSetisnot//necessary.
UpdateeachrowintheResultSetinthesame//mannerasabovewhile(rs.
next()){rs.
updateString(2,"xyz");rs.
updateInt(3,100);rs.
updateRow();//UsetheStatementtoreturnanupdatableResultSetResultSetrs=stmt.
executeQuery("SELECT*FROMT1WHERE.
.
.
");}从ResultSet中删除行若要从游标结果集中删除某一行,可按如下方式使用SybCursorResultSet.
deleteRow:while(syb_rs.
next()){intcol3=getInt(3);if(col3>100){syb_rs.
deleteRow();}}在ResultSet中插入行下面的示例说明如何使用JDBC2.
0API执行插入操作.
不需要使用SybCursorResultSet.
//preparetoinsertrs.
moveToInsertRow();//populatenewrowwithcolumnvaluesrs.
updateString(1,"Newentryforcol1");rs.
updateInt(2,42);//insertnewrowintodbrs.
insertRow();//returntocurrentrowinresultsetrs.
moveToCurrentRow();处理数据库54jConnectforJDBC在游标关闭时释放锁AdaptiveServer15.
7扩展了declarecursor语法,使其包括release_locks_on_close选项,用以在游标关闭时在隔离级别2和3释放共享游标锁.
jConnect对release-lock-on-close的语义提供相应支持.
要在jConnect连接上应用,请将RELEASE_LOCKS_ON_CURSOR_CLOSE连接属性设置为true.
RELEASE_LOCKS_ON_CURSOR_CLOSE的缺省值为false.
此设置只有在连接到支持release_locks_on_close的服务器时才会生效.
有关release_locks_on_close的信息,请参见AdaptiveServerEnterprise《参考手册:命令》.
selectforupdate支持AdaptiveServer15.
7支持selectforupdate,它可以为同一事务内的后续更新锁定行,并支持可更新游标的排它锁.
请参见AdaptiveServerEnterprise《Transact-SQL用户指南》中的第2章"查询:从表中选择数据".
当forupdate子句添加到select语句以及客户端内打开的任何可更新游标中后,此功能便可自动供客户端使用.
对PreparedStatement对象使用游标PreparedStatement对象在创建后可以多次使用,每次使用时可为其输入参数指定相同或者不同的值.
如果为PreparedStatement对象使用游标,则每次使用完游标后必须将其关闭,下次使用时再将其重新打开.
关闭游标的结果集(ResultSet.
close)时也会关闭该游标.
执行游标的预准备语句(PreparedStatement.
executeQuery)时会打开该游标.
下面的示例演示如何创建PreparedStatement对象,如何为其指定游标,以及如何执行两次PreparedStatement对象(关闭然后重新打开游标).
//Createapreparedstatementobjectwitha//parameterizedquery.
PreparedStatementprep_stmt=conn.
prepareStatement("SELECTau_id,au_lname,au_fname"+"FROMauthorsWHEREcity="+"FORUPDATEOFau_lname");//Createacursorforthestatement.
prep_stmt.
setCursorName("author_cursor");//Assigntheparameterinthequeryavalue.
第2章编程信息程序员参考55//Executethepreparedstatementtoreturna//resultset.
prep_stmt.
setString(1,"Oakland");ResultSetrs=prep_stmt.
executeQuery();//Dosomeprocessingontheresultset.
while(rs.
next()){.
.
.
}//Closetheresult,whichalsoclosesthecursor.
rs.
close();//Executethepreparedstatementagainwithanew//parametervalue.
prep_stmt.
setString(1,"SanFrancisco");rs=prep_stmt.
executeQuery();//reopenscursor处理数据库56jConnectforJDBC在jConnect中使用TYPE_SCROLL_INSENSITIVE结果集jConnect仅支持TYPE_SCROLL_INSENSITIVE结果集.
jConnect使用TabularDataStream(TDS)(即Sybase专有协议)与Sybase数据库服务器进行通信.
AdaptiveServer15.
0或更高版本支持TDS可滚动游标.
对于不支持TDS可滚动游标的服务器,在每次调用ResultSet.
next时,jConnect都会在客户端按需高速缓存行数据.
但到达结果集的末尾时,整个结果集将存储到客户端内存中.
因为这可能导致性能降低,所以Sybase建议您仅在使用AdaptiveServer15.
0或结果集相当小时才使用TYPE_SCROLL_INSENSITIVE结果集.
注释在jConnect中使用TYPE_SCROLL_INSENSITIVEResultSets时,如果服务器不支持TDS可滚动游标,则只能在读取完ResultSet的最后一行后才能调用isLast方法.
在未达到最后一行时调用isLast会导致抛出UnimplementedOperationException.
jConnect在sample2目录中提供了ExtendResultSet;此示例使用JDBC1.
0接口提供了一个受限制的TYPE_SCROLL_INSENSITIVEResultSet.
此实现使用标准JDBC1.
0方法生成无滚动功能的只读结果集,即基础数据的一个静态视图,它不会即时反映在结果集为打开状态时所进行的更改.
ExtendedResultSet在客户端高速缓存所有ResultSet行.
对较大的结果集使用此类时应谨慎.
sample.
ScrollableResultSet接口:是JDBC1.
0java.
sql.
ResultSet的扩展.
定义了与JDBC2.
0java.
sql.
ResultSet具有相同签名的其它方法.
只包含部分JDBC2.
0方法.
未包含其中用于修改ResultSet的方法.
来自JDBC2.
0API的方法有:booleanprevious()throwsSQLException;booleanabsolute(introw)throwsSQLException;booleanrelative(introws)throwsSQLException;booleanfirst()throwsSQLException;booleanlast()throwsSQLException;voidbeforeFirst()throwsSQLException;voidafterLast()throwsSQLException;booleanisFirst()throwsSQLException;第2章编程信息程序员参考57booleanisLast()throwsSQLException;booleanisBeforeFirst()throwsSQLException;booleanisAfterLast()throwsSQLException;intgetFetchSize()throwsSQLException;voidsetFetchSize(introws)throwsSQLException;intgetFetchDirection()throwsSQLException;voidsetFetchDirection(intdirection)throwsSQLException;intgetType()throwsSQLException;intgetConcurrency()throwsSQLException;intgetRow()throwsSQLException;若要使用示例类,请使用任意JDBC1.
0java.
sql.
ResultSet创建一个ExtendedResultSet.
以下为相关的代码段(假定为Java1.
1环境)://importthesamplefilesimportsample.
*;//importtheJDBC1.
0classesimportjava.
sql.
*;//connecttosomedbusingsomedriver;//createastatementandaquery;//GetareferencetoaJDBC1.
0ResultSetResultSetrs=stmt.
executeQuery(_query);//CreateaScrollableResultSetwithitScrollableResultSetsrs=newExtendedResultSet(rs);//invokemethodsfromtheJDBC2.
0APIsrs.
beforeFirst();//orinvokemethodsfromtheJDBC1.
0APIif(srs.
next())Stringcolumn1=srs.
getString(1);图2-1是一个类框图,显示了示例类和JDBCAPI之间的关系.
处理数据库58jConnectforJDBC图2-1:类框图有关详细信息,请参见JDBC2.
0API,网址为:http://www.
oracle.
com/technetwork/java/javase/jdbc.
使用包括COMPUTE子句的Transact-SQL查询jConnectforJDBC支持包括COMPUTE子句的Transact-SQL查询.
COMPUTE子句允许使用一个select语句显示明细和摘要结果.
摘要行显示在特定组的明细行的下面.
例如:selecttype,price,advancefromtitlesorderbytypecomputesum(price),sum(advance)bytypejava.
sql.
ResultSet(JDBC1.
0API)sample.
ScrollableResultSet(添加来自JDBC2.
0API的一些方法)sample.
ExtendedResultSet(java.
sql.
ResultSet的包装)扩展实现第2章编程信息程序员参考59typepriceadvanceUNDECIDEDNULLNULLComputeResult:NULLNULLtypepriceadvancebusiness2.
9910,125.
00business11.
955,000.
00business19.
995,000.
00business19.
995,000.
00ComputeResult:54.
9225,125.
00.
.
.
.
.
.
(24rowsaffected)在jConnect执行包括COMPUTE子句的select语句时,jConnect会向客户端返回多个结果集,结果集的数量取决于可用的唯一分组的数量.
每个组包含一个用于明细行的结果集和一个用于摘要的结果集.
客户端必须处理所有结果集才能完全处理返回的行,否则返回的第一个结果集中将只包括第一个数据组的明细行.
有关COMPUTE子句的详细信息,请参见AdaptiveServerEnterprise《Transact-SQL用户指南》.
有关处理多个结果集的详细信息,请参见OracleTechnologyNetworkforJavaWeb站点上提供的JDBCAPI文档.
批处理更新支持批处理更新允许一个Statement对象向基础数据库提交多个语句,这些语句作为一个单元(一批)一起进行处理.
添加到批处理的任何语句必须仅返回更新计数,不得返回ResultSet.
有关对Statement、PreparedStatement和CallableStatement使用批处理更新的示例,请参见sample2子目录中的BatchUpdates.
java.
jConnect还支持动态PreparedStatements的批处理.
处理数据库60jConnectforJDBC实现说明jConnect按照JDBC2.
0API中指定的方式实现批处理更新,但有下列例外:EXECUTE_BATCH_PAST_ERRORS连接属性控制故障在批处理执行中的处理方式.
缺省情况下,EXECUTE_BATCH_PAST_ERRORS设置为false,jConnect会在出现第一个故障后停止处理.
BatchUpdateException.
getUpdateCounts返回长度为M");System.
exit(1);}//createa4"x10"envelopeEnvelopee=newEnvelope(4,10);try{//connecttothedatabasewiththeFriendstable.
conn=DriverManager.
getConnection(实施高级功能86jConnectforJDBC"jdbc:sybase:Tds:localhost:5000","username","password");//lookuptheaddressofthespecifiedpersonfirstName=args[0];lastName=args[1];PreparedStatementps=conn.
prepareStatement("SELECTaddressFROMfriendsWHERE"+"firstname=ANDlastname=");ps.
setString(1,firstName);ps.
setString(2,lastName);ResultSetrs=ps.
executeQuery();if(rs.
next()){Addressa=(Address)rs.
getObject(1);//setthedestinationaddressontheenvelopee.
setAddress(firstName,lastName,a);}conn.
close();}catch(SQLExceptionsqe){sqe.
printStackTrace();System.
exit(2);}//ifeverythingwassuccessful,printtheenvelopee.
print();}privatevoidsetAddress(Stringfname,Stringlname,Addressa){street=a.
streetNumber+""+a.
street+""+a.
apartmentNumber;city=a.
city;zip=""+a.
zipCode;}privatevoidprint(){//Printthenameandaddressontheenvelope.
.
.
.
}}可在jConnect安装目录下的sample2子目录中找到更详细的HandleObject.
java示例.
第2章编程信息程序员参考87使用动态类装载SQLAnywhere和AdaptiveServer允许将Java类指定为:SQL列的数据类型Transact-SQL变量的数据类型SQL列的缺省值在早期版本中,只有出现在jConnectCLASSPATH中的类才是可访问的,也就是说,如果jConnect应用程序试图访问不在本地CLASSPATH中的类的实例,就将产生java.
lang.
ClassNotFound例外.
jConnect6.
05及更高版本通过实现DynamicClassLoader(DCL)来直接从SQLAnywhere或AdaptiveServer服务器装载类,并在使用类时视其位于本地CLASSPATH中.
会继承超类中的所有安全性功能.
Java2中实现的装载程序委托模型仍然存在–jConnect首先尝试从CLASSPATH中装载请求的类;如果失败,jConnect会尝试DynamicClassLoader.
有关使用Java和AdaptiveServer的详细信息,请参见《AdaptiveServerEnterprise中的Java》.
使用DynamicClassLoader若要使用DCL功能:1创建并配置类装载程序.
jConnect应用程序的代码应该类似如下所示:Propertiesprops=newProperties();//URLoftheserverwheretheclasseslive.
StringclassesUrl="jdbc:sybase:Tds:myase:1200";//Connectionpropertiesforconnectingtoaboveserver.
props.
put("user","grinch");props.
put("password","meanone");.
.
.
//AsktheSybDriverforanewclassloader.
DynamicClassLoaderloader=driver.
getClassLoader(classesUrl,props);2使用CLASS_LOADER连接属性,使得新的类装载程序可用于执行查询的语句.
创建类装载程序后,即可将其传递给后续连接,如下所示(接着第1步中的代码示例)://Stashtheclassloadersothatotherconnection(s)//canknowaboutit.
实施高级功能88jConnectforJDBCprops.
put("CLASS_LOADER",loader);//Additionalconnectionpropertiesprops.
put("user","joeuser");props.
put("password","joespassword");//URLoftheserverwenowwanttoconnectto.
Stringurl="jdbc:sybase:Tds:jdbc.
sybase.
com:4446";//Makeaconnectionandgo.
Connectionconn=DriverManager.
getConnection(url,props);假定Java类定义如下所示:classAddr{Stringstreet;Stringcity;Stringstate;}假定SQL表定义如下所示:createtableemployee(char(100)name,intempid,Addraddress)3如果客户端应用程序CLASSPATH中缺少Addr类,请使用下面的客户端代码:Statementstmnt=conn.
createStatement();//RetrievesomerowsfromthetablethathasaJavaclass//asoneofitsfields.
ResultSetrs=stmnt.
executeQuery("select*fromemployeewhereempid='19'");if(rs.
next(){//Eventhoughtheclassisnotinourclasspath,//weshouldbeabletoaccessitsinstance.
Objectobj=rs.
getObject("address");//Theclasshasbeenloadedfromtheserver,solet'stakealook.
Classc=obj.
getClass();//SomeJavaReflectioncanbedoneheretoaccessthefieldsofobj.
.
.
.
}CLASS_LOADER连接属性提供了一个方便的机制,可在许多连接中共享一个类装载程序.
第2章编程信息程序员参考89应确保在许多连接中共享一个类装载程序不会导致类冲突.
例如,假定org.
foo.
Bar类的两个不同且不兼容的实例存在于两个不同的数据库中,当使用同一装载程序访问这两个类时,就可能引发问题.
在检查来自第一个连接的结果集时装载第一个类.
当检查来自第二个连接的结果集时,已经装载了这个类.
因此,将不会装载第二个类,而jConnect不能检测此情况.
不过,Java具有一种内置机制,可确保类的版本与非序列化对象的版本信息匹配.
Java至少会检测并报告上述情况.
类及其实例不需要驻留在同一数据库或服务器中,但装载程序和后续连接没有理由不引用同一数据库或服务器.
使用非序列化下面的示例说明了如何非序列化本地文件中的对象.
该序列化对象是一个驻留在服务器但不存在于CLASSPATH中的类的实例.
SybResultSet.
getObject()使用DynamicObjectInputStream(装载来自DynamicClassLoader的类定义的ObjectInputStream的子类),而不是缺省系统("boot")类装载程序.
//Makeastreamonthefilecontainingthe//serializedobject.
FileInputStreamfileStream=newFileInputStream("serFile");//Makea"deserializer"onit.
Noticethat,apart//fromtheadditionalparameter,thisisthesame//asObjectInputStreamDynamicObjectInputStreamstream=newDynamicObjectInputStream(fileStream,loader);//Astheobjectisdeserialized,itsclassis//retrievedthroughtheloaderfromourserver.
Objectobj=stream.
readObject();stream.
close();预装载.
jar文件jConnect6.
05或更高版本具有一个名为PRELOAD_JARS的连接属性.
将.
jar文件定义为以逗号分隔的.
jar文件名的列表时,这些文件会被全部装载.
在这种情况下,"JAR"会引用服务器使用的"保留的JARname".
它是在安装Java程序中指定的.
jar文件名,例如:installjavanewjar'myJarName'fromfile'/tmp/mystuff.
jar'实施高级功能90jConnectforJDBC如果设置PRELOAD_JARS,则.
jar文件会与类装载程序关联,因此不需要为每个连接预装载这些文件.
您只需为一个连接指定PRELOAD_JARS.
以后尝试预装载相同的.
jar文件可能会影响性能,因为不必要地从服务器检索.
jar文件数据.
注释SQLAnywhere不能将.
jar文件作为一个实体返回,因此jConnect会依次迭代检索每个类.
不过,AdaptiveServer可检索整个.
jar文件,并装载其包含的所有类.
高级功能DynamicClassLoader中有许多公共方法.
有关详细信息,请参见JDBC_HOME/docs/en/javadocs中的javadocs信息.
附加功能包括能够在期望进行一系列类装载时使装载程序的数据库连接保持"活动"状态,并能按照类名称显式装载单个类.
还可使用继承自java.
lang.
ClassLoader的公共方法.
java.
lang.
Class中处理装载类的方法也是可用的;不过,使用这些方法时要小心,因为其中某些方法会对使用哪些类装载程序进行假定.
尤其应使用Class.
forName的3参数版本,否则会使用系统("boot")类装载程序.
请参见第75页的"处理错误消息".
JDBC4.
0规范支持支持以下JDBC4.
0规范:连接管理自动SQL驱动程序装载数据库元数据国家字符集转换包装模式标量函数CHAR_LENGTH、CHARACTER_LENGTH、CURRENT_DATE、CURRENT_TIME、CURRENT_TIMESTAMP、EXTRACT和OCTET_LENGTH、POSITION有关JDBC4.
0规范的信息,请参见OracleTechnologyNetworkforJava(http://www.
oracle.
com/technetwork/index.
html).
第2章编程信息程序员参考91JDBC3.
0规范支持本节介绍当前jConnect7.
0版本中所支持的JDBC3.
0功能.
保存点支持增加了Savepoint接口,其中包含设置、释放事务或将事务回退到指定保存点的方法.
在事务中使用保存点JDBC2.
0中的事务支持允许对事务进行控制并回退事务中的每个更改.
在JDBC3.
0中,保存点带来了更大的控制力:Savepoint接口允许将一个事务分成几个逻辑断点,以此对回退的事务量加以控制.
设置和回退到某个保存点JDBC3.
0API增加了方法Connection.
setSavepoint,该方法在当前事务内设置一个保存点,并返回一个Savepoint对象.
重载Connection.
rollback方法来采用Savepoint对象参数.
释放保存点Connection.
releaseSavepoint方法以Savepoint对象作为参数并将其从当前事务中删除.
释放Savepoint后,如果尝试在回退操作中引用它,则会发生SQLException.
当事务被提交或整个事务回退时,在事务中创建的任何保存点都自动释放并变成无效保存点.
如果将事务回退到某个保存点,则它会自动释放任何其它的在该保存点之后创建的有问题的保存点并使之失效.
注释可以使用DatabaseMetaData.
supportsSavepoints方法确定JDBCAPI实现是否支持保存点.
参数元数据检索添加接口ParameterMetaData,该接口描述预准备语句参数的数量、类型和属性,并支持新的和修改的DatabaseMetaData方法.
自动生成键检索增加了从包含自动生成值的列中检索值的方式.
JDBC3.
0能够满足获取自动生成键值或自动递增键值的日常需求.
实施高级功能92jConnectforJDBC确定生成键的值若要通知驱动程序您要检索自动生成的键,请将常量Statement.
RETURN_GENERATED_KEYS作为Statement.
execute()方法的第二个参数传递.
执行该语句后,调用Statement.
getGeneratedKeys()检索生成的键.
结果集将包含检索到的每个生成键的行.
注释AdaptiveServer无法返回生成键的结果集.
如果执行一批insert命令,则调用Statement.
getGeneratedKeys()会只返回最后一个生成键的值.
有关检索自动生成键的详细信息(包括示例代码),请在OracleJavaWeb站点上搜索"检索自动生成的键".
可以拥有多个打开的ResultSet对象添加了getMoreResults(int),它采用的参数指定Statement对象所返回的ResultSet对象是否应在返回任何后续ResultSet对象前关闭.
作为更改的一部分,JDBC3.
0规范允许Statement接口支持多个打开的ResultSets,从而取消了JDBC2规范限制,即,返回多个结果的语句在任何指定时间只能打开一个ResultSet.
为支持多个打开的结果,Statement接口增加了方法getMoreResults()的一个过载版本.
getMoreResults(int)方法采用整数标志,当调用getResultSet()方法时,该标志指定以前打开的ResultSets的行为.
该接口定义的标志如下所示:CLOSE_ALL_RESULTS–当调用getMoreResults()时,关闭以前打开的所有ResultSet对象.
CLOSE_CURRENT_RESULT–当调用getMoreResults()时,关闭当前ResultSet对象.
KEEP_CURRENT_RESULT–当调用getMoreResults()时,不关闭当前ResultSet对象.
按照名称将参数传递到CallableStatement对象增加了允许字符串标识将为CallableStatement对象设置的参数的方法.
可以使用CallableStatement接口按照参数名称指定参数,而不使用过去指定参数索引的方法.
您会发现当过程中包含很多具有缺省值的参数时新方法非常有效.
可以使用命名参数来仅指定没有缺省值的值.
第2章编程信息程序员参考93可保持游标支持增加了指定ResultSet对象可保持性的能力.
可保持游标(或结果)是一种当包含该游标的事务被提交后不能自动关闭的对象.
JDBC3.
0增加了对指定游标可保持性的支持.
要想指定ResultSet的可保持性,必须在使用createStatement()、prepareStatement()或prepareCall()方法准备语句时完成这一工作.
可保持性可以为下列常量之一:HOLD_CURSORS_OVER_COMMIT–ResultSet对象(游标)不关闭;当隐式或显式执行commit操作时,它们保持打开状态.
CLOSE_CURSORS_AT_COMMIT–ResultSet对象(游标)在隐式或显式执行commit操作时关闭.
如果在提交事务时关闭游标,则通常会产生较好的性能.
除非在完成事务后需要游标,否则最好在执行commit操作时关闭游标.
因为规范没有定义ResultSet的缺省可保持性,所以其行为将取决于实现.
JDBC2.
0选件工具包扩展支持JDBC2.
0OptionalPackage(《JDBC2.
0选件工具包》)(旧称JDBC2.
0StandardExtensionAPI(《JDBC2.
0标准扩展API》))中定义了多个JDBC2.
0驱动程序可实现的功能.
jConnect6.
05版及更高版本已实现了以下选件工具包扩展功能:用于命名数据库的JNDI(使用jConnect支持的任何SybaseDBMS)连接池(使用jConnect支持的任何SybaseDBMS)分布式事务管理支持仅用于AdaptiveServer.
注释Sybase建议使用JNDI1.
2,它可与Java1.
1.
6及更高版本兼容.
用于命名数据库的JNDI参考JDBC2.
0OptionalPackage(《JDBC2.
0选件工具包》)(旧称JDBC2.
0StandardExtensionAPI(《JDBC2.
0标准扩展API》))的第5章"JNDIandtheJDBCAPI"(JNDI与JDBCAPI).
实施高级功能94jConnectforJDBC相关接口javax.
sql.
DataSourcejavax.
naming.
Referenceablejavax.
naming.
spi.
ObjectFactory此功能为JDBC客户端提供了按标准方法获取数据库连接的替代方法.
不再调用Class.
forName("com.
sybase.
jdbc4.
jdbc.
SybDriver"),然后将JDBCURL传递到DriverManager的getConnection()方法,客户端可使用逻辑名访问JNDI命名服务器来检索javax.
sql.
DataSource对象.
此对象负责装载驱动程序,并与它代表的物理数据库建立连接.
客户端代码更简单并且是可重用的,因为特定于供应商的信息已放入DataSource对象中.
DataSource对象的Sybase实现是com.
sybase.
jdbcx.
SybDataSource(有关详细信息,请参见javadocs).
此实现通过使用JavaBean组件的设计模式支持以下标准属性:databaseNamedataSourceNamedescriptionnetworkProtocolpasswordportNumberserverNameuser注释roleName不受支持.
jConnect提供javax.
naming.
spi.
ObjectFactory接口的实现,因此DataSource对象可根据命名服务器条目的属性构造.
给定javax.
naming.
Reference,或javax.
naming.
Name和javax.
naming.
DirContext时,此factory可构造com.
sybase.
jdbcx.
SybDataSource对象.
若要使用此factory,请将java.
naming.
object.
factory系统属性设置为包括com.
sybase.
jdbc4.
SybObjectFactory.
第2章编程信息程序员参考95用法可以在不同的应用程序中,以不同的方式使用DataSource.
下面的几小节中介绍所有选项并提供一些代码示例,以指导您完成该过程.
有关详细信息,请参见JDBC2.
0OptionalPackage(《JDBC2.
0选件工具包》)(旧称JDBC2.
0StandardExtensionAPI(《JDBC2.
0标准扩展API》))以及OracleJavaWeb站点上的JNDI文档.
1a.
管理员进行的配置:LDAPjConnect自4.
0版本开始已经支持LDAP连接.
因此,建议的方法(不要求自定义软件)是使用LDAP数据交换格式(LDIF)将DataSources配置为LDAP条目.
例如:dn:servername:myASE,o=MyCompany,c=US1.
3.
6.
1.
4.
1.
897.
4.
2.
5:TCP#1#mymachine40001.
3.
6.
1.
4.
1.
897.
4.
2.
10:PACKETSIZE=1024&user=me&password=secret1.
3.
6.
1.
4.
1.
897.
4.
2.
11:userdb1b.
由客户端访问这是典型的JDBC客户端应用程序.
唯一的区别是获取对DataSource对象的引用的方式是通过访问命名服务器,而不是通过访问DriverManager并提供JDBCURL.
获取连接后,客户端代码就和所有其它JDBC客户端代码相同了.
代码非常通用,且设置对象factory属性(可设置为环境的一部分)时仅引用Sybase.
jConnect安装包含了示例程序sample2/SimpleDataSource.
java以说明DataSource的使用.
此示例仅用于参考,也就是说,除非适当地配置环境并编辑此示例,否则不能运行它.
SimpleDataSource.
java包含以下重要代码:importjavax.
naming.
*;importjavax.
sql.
*;importjava.
sql.
*;//setnecessaryJNDIpropertiesforyourenvironment(sameasabove)PropertiesjndiProps=newProperties();//usedbyJNDItobuildtheSybDataSourcejndiProps.
put(Context.
OBJECT_FACTORIES,"com.
sybase.
jdbc4.
jdbc.
SybObjectFactory");//nameserverthatJNDIshouldtalktojndiProps.
put(Context.
PROVIDER_URL,"ldap:some_ldap_server:238/"+"o=MyCompany,c=Us");//usedbyJNDItoestablishthenamingcontextjndiProps.
put(Context.
INITIAL_CONTEXT_FACTORY,"com.
sun.
jndi.
ldap.
LdapCtxFactory");//obtainaconnectiontoyournameserver实施高级功能96jConnectforJDBCContextctx=newInitialContext(jndiProps);DataSourceds=(DataSource)ctx.
lookup("servername=myASE");//obtainsaconnectiontotheserverasconfiguredearlier.
//inthiscase,thedefaultusernameandpasswordwillbeusedConnectionconn=ds.
getConnection();//dostandardJDBCmethods.
.
.
如果已经在虚拟机中定义属性,则不必将Properties显式传递给InitialContext构造函数,也就是说,要么在将Java设置为浏览器属性的一部分时传递,要么使用下面的方法传递:java-Djava.
naming.
object.
factory=com.
sybase.
jdbc4.
jdbc.
SybObjectFactory有关设置环境属性的详细信息,请参见JavaVM文档.
2a.
编程配置此阶段通常由为其公司执行数据库系统管理或应用程序集成的人员来完成.
目的是定义一个数据源,然后以一个逻辑名部署到命名服务器.
如果需要重新配置服务器(例如,移到其它计算机、端口等等),管理员运行此配置实用程序(概述如下),并将此逻辑名重新分配给新的数据源配置.
因此,客户端代码不会更改,因为它只认识此逻辑名.
importjavax.
sql.
*;importcom.
sybase.
jdbcx.
*;.
.
.
.
.
//createaSybDataSource,andconfigureitSybDataSourceds=newcom.
sybase.
jdbc4.
jdbc.
SybDataSource();ds.
setUser("my_username");ds.
setPassword("my_password");ds.
setDatabaseName("my_favorite_db");ds.
setServerName("db_machine");ds.
setPortNumber(4000);ds.
setDescription("ThisDataSourcerepresentstheAdaptiveServerEnterpriseserverrunningondb_machineatport2638.
Thedefaultusernameandpasswordhavebeensetto'me'and'mine'respectively.
Uponconnection,theuserwillaccessthemy_favorite_dbdatabaseonthisserver.
");Propertiesprops=newProperties()props.
put("REPEAT_READ","false");props.
put("REQUEST_HA_SESSION","true");ds.
setConnectionProperties(props);//storetheDataSourceobject.
Typicallythisis//donebysettingJNDIpropertiesspecifictothe//typeofJNDIserviceprovideryouareusing.
//Then,initializethecontextandbindtheobject.
Contextctx=newInitialContext();ctx.
bind("java:comp/env/jdbc/myASE",ds);第2章编程信息程序员参考97设置DataSource后,需要决定信息的存储位置和存储方式.
SybDataSource提供了java.
io.
Serializable和javax.
naming.
Referenceable来帮助您作出决定,但仍需管理员根据使用的JNDI服务提供程序来决定如何存储数据.
2b.
由客户端访问客户端通过采用配置DataSource的方法来设置DataSource对象的JNDI属性,从而检索该对象.
客户端需要一个可转换该对象的可用对象factory,因为它会被存储(例如,序列化)到Java对象中.
Contextctx=newInitialContext();DataSourceds=(DataSource)ctx.
lookup("java:comp/env/jdbc/myASE");Connectionconn=ds.
getConnection();连接池参考JDBC2.
0OptionalPackage(《JDBC2.
0选件工具包》)(旧称JDBC2.
0StandardExtensionAPI(《JDBC2.
0标准扩展API》))的第6章"ConnectionPooling"(连接池).
相关接口javax.
sql.
ConnectionPoolDataSourcejavax.
sql.
PooledConnection概述传统数据库应用程序可与用于应用程序的每次会话的数据库创建一个连接.
不过,使用此应用程序时,基于Web的数据库应用程序可能需要多次打开和关闭新连接.
处理基于Web的数据库连接的一个有效方法是使用连接池,它可维护打开的数据库连接并管理在不同用户请求间共享的连接,从而维护性能并减少空闲连接的数目.
对于每个连接请求,连接池首先确定池中是否有空闲连接.
如果有,连接池会返回空闲连接,而不是与数据库建立新连接.
提供com.
sybase.
jdbc4.
jdbc.
ConnectionPoolDataSource类来与连接池实现交互.
使用ConnectionPoolDataSource时,池实现会监听PooledConnection.
当您关闭连接或有错误破坏了连接时,会通知该实现.
此时,池实现会决定如何处理PooledConnection.
实施高级功能98jConnectforJDBC如果没有连接池,事务会:1创建与数据库的连接.
2向数据库发送查询.
3获得结果集.
4显示结果集.
5破坏连接.
有连接池时,序列大致如下:1查看连接"池"中是否存在未用连接.
2如果有,则使用此连接;否则创建新连接.
3向数据库发送查询.
4获得结果集.
5显示结果集.
6将连接返回"池".
用户仍然调用"close()",但连接保持打开状态,且池会得到close请求的通知.
与每次客户端需要建立与数据库的连接时都创建一个新的连接相比,重新使用连接的开销要少.
为允许第三方实现连接池,jConnect实现让ConnectionPoolDataSource接口生成PooledConnections,类似于DataSource接口生成Connections的方法.
池实现使用ConnectionPoolDataSource的getPooledConnection()方法创建"真正"的数据库连接.
然后,池实现将自己注册为针对PooledConnection的监听器.
目前,当客户端请求连接时,池实现就会调用可用PooledConnection上的getConnection().
当客户端完成连接并调用close时,池实现就会通过ConnectionEventListener接口得到通知,告知连接空闲,可以重用.
如果客户端因为某种原因破坏了数据库连接,池实现也会通过ConnectionEventListener接口得到通知,这样池实现就会将连接从池中删除.
有关详细信息,请参见JDBC2.
0OptionalPackage(《JDBC2.
0选件工具包》)(旧称JDBC2.
0StandardExtensionAPI(《JDBC2.
0标准扩展API》))中的"AppendixB"(附录B).
第2章编程信息程序员参考99管理员进行的配置:LDAP此方法与"用于命名数据库的JNDI"中描述的"1a.
管理员进行的配置:LDAP"相似,只是向LDIF条目中输入了附加行.
在下面的示例中,添加的代码行以粗体显示以供参考.
dn:servername=myASE,o=MyCompany,c=US1.
3.
6.
1.
4.
1.
897.
4.
2.
5:TCP#1#mymachine40001.
3.
6.
1.
4.
1.
897.
4.
2.
10:PACKETSIZE=1024&user=me&password=secret1.
3.
6.
1.
4.
1.
897.
4.
2.
11:userdb1.
3.
6.
1.
4.
1.
897.
4.
2.
18:ConnectionPoolDataSource通过中间层客户端进行访问此过程初始化三个属性(如第78页所示的INITIAL_CONTEXT_FACTORY、PROVIDER_URL和OBJECT_FACTORIES),并检索ConnectionPoolDataSource对象.
有关更完整的代码示例,请参见sample2/SimpleConnectionPool.
java.
基本区别是:.
.
.
ConnectionPoolDatabasecpds=(ConnectionPoolDataSource)ctx.
lookup("servername=myASE");PooledConnectionpconn=cpds.
getPooledConnection();分布式事务管理支持此功能为AdaptiveServer提供了用于执行分布式事务的标准JavaAPI.
注释此功能设计用于大型多层环境.
参考请参见JDBC2.
0OptionalPackage(《JDBC2.
0选件工具包》)(旧称JDBC2.
0StandardExtensionAPI(《JDBC2.
0标准扩展API》))的第7章"DistributedTransactions"(分布式事务).
相关接口javax.
sql.
XADataSourcejavax.
sql.
XAConnectionjavax.
transaction.
xa.
XAResource实施高级功能100jConnectforJDBC背景和系统要求因为在SybaseAdaptiveServer12.
0和更高版本中jConnect会直接与资源管理器通信,所以安装必须具有分布式事务管理支持.
任何想参与分布式事物的用户都必须具有"dtm_tm_role"授权,否则事务将失败.
若要使用分布式事务,必须在/sp目录中安装存储过程.
请参见《jConnectforJDBC安装指南》第1章中的"安装存储过程".
图2-2:12.
x版本中的分布式事务管理支持管理员进行的配置:LDAP此方法与第93页的"用于命名数据库的JNDI"中描述的"1a.
管理员进行的配置:LDAP"相似,只是向LDIF条目中输入了附加行.
在下面的示例中,添加的代码行显示为粗体.
dn:servername:myASE,o=MyCompany,c=US1.
3.
6.
1.
4.
1.
897.
4.
2.
5:TCP#1#mymachine40001.
3.
6.
1.
4.
1.
897.
4.
2.
10:PACKETSIZE=1024&user=me&password=secret1.
3.
6.
1.
4.
1.
897.
4.
2.
11:userdb1.
3.
6.
1.
4.
1.
897.
4.
2.
18:XADataSource通过中间层客户端进行访问此过程初始化三个属性(INITIAL_CONTEXT_FACTORY、PROVIDER_URL和OBJECT_FACTORIES),并检索XADataSource对象.
例如:.
.
.
XADataSourcexads=(XADatasource)ctx.
lookup("servername=myASE");XAConnectionxaconn=xads.
getXAConnection();或覆盖用户名和口令的缺省设置:.
.
.
XADataSourcexads=(XADatasource)ctx.
lookup("servername=myASE");XAConnectionxaconn=xads.
getXAConnection("my_username","my_password");客户端应用程序中间层组件jConnectASE12.
xDTMJTATDS第2章编程信息程序员参考101对JDBC标准的约束与说明本节讨论JDBC的jConnect实现是怎样偏离JDBC标准的.
涉及以下主题:不受支持的JDBC4.
0规范要求使用Connection.
isClosed和IS_CLOSED_TEST对未处理的结果使用Statement.
close调整多线程使用ResultSet.
getCursorName执行存储过程不受支持的JDBC4.
0规范要求此版本不支持以下内容:java.
sql.
RowIDJDBC4.
0中引入的XMLAPI使用Connection.
isClosed和IS_CLOSED_TEST根据JDBC2.
1规范的第11.
1节:"仅能确保Connection.
isClosed方法在调用Connection.
close后返回true.
通常情况下不能调用Connection.
isClosed来确定数据库连接有效还是无效.
典型客户端可通过捕获试图执行操作时引发的例外来确定连接无效.
"jConnect对isClosed方法提供了一种缺省的解释,这与规范中定义的行为不同.
调用Connection.
isClosed时,jConnect首先检验是否已对此连接调用了Connection.
close.
如果已调用close,则jConnect会为isClosed返回true.
但是,如果未调用Connection.
close,则jConnect接下来将尝试在数据库上执行sp_mda存储过程.
sp_mda存储过程是jConnect用户在数据库上使用jConnect时必须安装的元数据的一部分.
调用sp_mda的目的是使jConnect可执行已知(或至少是期望)驻留在数据库服务器上的过程.
如果存储过程正常执行,则jConnect会为isClosed返回false,因为我们已经检验过数据库连接是有效的,且正在工作.
但是,如果调用sp_mda引发SQLException,则jConnect会捕获该例外并为isClosed返回true,因为连接似乎有问题.
对JDBC标准的约束与说明102jConnectforJDBC如果想强制jConnect更加遵循isClosed()的标准JDBC行为,则可将IS_CLOSED_TEST连接属性设置为特殊值"INTERNAL".
INTERNAL设置表示只有在已调用Connection.
close时,或者当jConnect检测到禁用了连接的IOException时,jConnect才会为isClosed返回true.
也可指定在isClosed被调用时使用除sp_mda外的其它查询.
例如,如果想让jConnect在调用isClosed时尝试select1,可将IS_CLOSED_TEST连接属性设置为select1.
对未处理的结果使用Statement.
close关于首先调用Statement.
execute,然后对该同一语句对象调用close,而没有处理Statement返回的所有结果(更新计数和ResultSets)时驱动程序应具有的行为,JDBC规范的表述有点模糊.
例如,假定数据库上有一个进行七次行插入的存储过程.
应用程序于是使用Statement.
execute执行该存储过程.
在这种情况下,Sybase数据库向应用程序返回七个更新计数(为每个插入的行返回一个计数).
根据常规JDBC应用程序逻辑,应该使用getMoreResults、getResultSet和getUpdateCount方法在循环中处理这些更新计数.
这些在JavaSEdocumentation(http://www.
oracle.
com/technetwork/java/index.
html)上的java.
sql.
*软件包的javadocs中解释得很清楚.
不过,应用程序程序员可能会在通览返回的所有更新计数前错误地选择调用Statement.
close.
在这种情况下,jConnect会向数据库发送cancel,而这会造成无法预料的和不希望的负面影响.
在这个特殊的示例中,如果应用程序在数据库完成插入前调用Statement.
close,则数据库可能不会执行所有插入.
例如,它可能会在插入5行后就停止,因为存储过程尚未结束就在数据库上取消了.
这种情况下就不会向您报告丢失的插入.
在仍然具有未处理的结果时试图关闭Statement时,jConnect的更高版本会抛出SQLException,但在这之前,仍然强烈建议jConnect程序员遵循以下指南:调用Statement.
close时,如果您未处理完所有结果(更新计数和ResultSets)时向服务器发送了cancel.
在只执行select语句的情况下,这完全可以.
但是,在执行insert/update/delete操作的情况下,这会导致某些操作不能如期望的那样完成.
因此,执行除select之外的其它操作时,切勿在还有未处理结果时调用close.
第2章编程信息程序员参考103因此,如果调用Statement.
execute,请用getUpdateCount、getMoreResults和getResultSet方法确认处理了所有结果.
调整多线程如果多个线程同时调用同一Statement实例(CallableStatement或PreparedStatement)上的方法(Sybase不建议这样做),您必须手动同步对Statement上的方法的调用;jConnect不会自动执行此过程.
例如,如果有两个在同一Statement实例上运行的线程(一个线程发送查询,另一个线程处理警告),则必须同步对Statement上的方法的调用,否则会发生冲突.
使用ResultSet.
getCursorName有些JDBC驱动程序可为任何SQL查询生成游标名,这样总是可以返回一个字符串.
不过,调用了ResultSet.
getCursorName时jConnect不会返回名称,除非您:调用相应的Statement上的setFetchSize或setCursorName,或者将SELECT_OPENS_CURSOR连接属性设置为"true",且查询的格式为SELECT.
.
.
FORUPDATE.
例如:selectau_idfromauthorsforupdate如果不调用相应Statement上的setFetchSize或setCursorName,或不将SELECT_OPENS_CURSOR连接属性设置为"true",则会返回null.
根据JDBC2.
0API文档(请参见第11章"Clarifications"(说明)),所有其它SQL语句都不需要打开游标及返回名称.
有关如何在jConnect中使用游标的详细信息,请参见第47页的"对结果集使用游标".
执行存储过程如果执行用问号代表参数值的CallableStatement对象中的存储过程,会比对参数既使用问号又使用实际值获得更好的性能.
而且,如果混合使用实际值和问号,就不能对存储过程使用输出参数.
下面的示例将sp_stmt创建为CallableStatement对象,以执行存储过程MyProc:对JDBC标准的约束与说明104jConnectforJDBCCallableStatementsp_stmt=conn.
prepareCall("{callMyProc(MyProc中的两个参数用问号表示.
可以使用CallableStatement接口中的registerOutParameter方法将其中的一个或所有两个参数注册为输出参数.
在下面的示例中,sp_stmt2是CallableStatement对象,用于执行存储过程MyProc2.
CallableStatementsp_stmt2=conn.
prepareCall({"callMyProc2(,'javelin')}");在sp_stmt2中,其中一个给定参数值为实际值,另一个为问号.
不能将两个参数中的任一个注册为输出参数.
若要使用参数的名称绑定来通过RPC命令执行存储过程,请使用以下两个过程之一:使用语言命令,用PreparedStatement类将输入参数直接从Java变量传递给语言命令.
如以下代码段所示://PreparethestatementSystem.
out.
println("Preparingthestatement.
.
.
");StringstmtString="exec"+procname+"@p3=,@p1=";PreparedStatementpstmt=con.
preparedStatement(stmtString);//Setthevaluespstmt.
setString(1,"xyz");pstmt.
setInt(2,123);//SendthequerySystem.
out.
println("Executingthequery.
.
.
");ResultSetrs=pstmt.
executeQuery();对于jConnect6.
05及更高版本,请使用com.
sybase.
jdbcx.
SybCallableStatement接口,如下面的示例所示:importcom.
sybase.
jdbcx.
*;.
.
.
.
//preparethecallforthestoredproceduretoexecuteasanRPCStringexecRPC="{call"+procNameSybCallableStatementscs=(SybCallableStatement)con.
prepareCall(execRPC);//setthevaluesandnametheparameters//also(optional)registerforanyoutputparametersscs.
setString(1,"xyz");scs.
setParameterName(1,"@p3");scs.
setInt(2,123);第2章编程信息程序员参考105scs.
setParameterName(2,"@p1");//executetheRPC//mayalsoprocesstheresultsusinggetResultSet()//andgetMoreResults()//seethesamplesformoreinformationonprocessingresultsResultSetrs=scs.
executeQuery();对JDBC标准的约束与说明106jConnectforJDBC程序员参考107第3章安全性本章介绍jConnect的安全性问题.
概述jConnect提供了以下选项来保护客户端与服务器之间的通信:SSL–使用SSL加密客户端和服务器应用程序之间的通信,包括登录交换.
Kerberos–使用Kerberos为AdaptiveServer鉴定Java应用程序或Java应用程序的用户,而不需要通过网络发送用户名或口令.
还可以使用Kerberos设置单点登录(SSO)环境,并提供Java应用程序的数字标识和AdaptiveServerEnterprise的数字标识之间的相互鉴定.
注释Kerberos可用于加密通信并提供数据完整性检查,但尚未对jConnect实现这些功能.
Kerberos和SSL也可一起使用,这样可以提供SSO以及客户端和服务器应用程序之间传输的数据加密的优点.
主题页码概述107实现自定义套接字插件108Kerberos112实现自定义套接字插件108jConnectforJDBC限制Kerberos和SSL可以与AdaptiveServer结合使用;SQLAnywhere当前不支持SSL或Kerberos安全机制.
Sybase建议在jConnect中使用SSL或Kerberos前先阅读其相关文档.
本章中的信息假定要使用的服务器已经进行配置,可正常使用SSL、Kerberos或上述两者.
有关Kerberos、SSL和配置AdaptiveServerEnterprise的详细信息,请参见第124页的"相关文档".
还请参见有关设置Kerberos的白皮书.
该文档的URL可在jConnectforJDBCReleaseBulletin(《jConnectforJDBC发行公告》)中找到.
实现自定义套接字插件本节讨论如何将自定义套接字实现插入应用程序以自定义客户端和服务器间的通信.
javax.
net.
ssl.
SSLSocket是一个套接字示例,可以通过自定义使其实现加密功能.
com.
sybase.
jdbcx.
SybSocketFactory是包含返回java.
net.
Socket的createSocket(String,int,Properties)方法的Sybase扩展接口.
若要在jConnect中使用自定义套接字工厂,应用程序必须通过定义createSocket()方法来实现此接口.
jConnect使用新套接字完成其后续输入/输出操作.
实现SybSocketFactory的类将创建套接字并提供一般框架以添加公共套接字级功能,如下所示:/***ReturnsasocketconnectedtoaServerSocketonthenamedhost,*atthegivenport.
*@paramhosttheserverhost*@paramporttheserverport*@parampropsPropertiespassedinthroughtheconnection*@returnsSocket*@exceptionIOException,UnknownHostException*/publicjava.
net.
SocketcreateSocket(Stringhost,intport,Propertiesprops)throwsIOException,UnknownHostException;传入属性将允许SybSocketFactory的实例使用连接属性实现智能套接字.
第3章安全性程序员参考109在实现SybSocketFactory以产生套接字时,通过向应用程序传递创建套接字的不同种类的工厂或伪工厂可以使相同的应用程序代码使用不同种类的套接字.
可以使用在套接字结构中使用的参数自定义工厂.
例如,可以使用已配置的不同的网络超时或安全参数自定义工厂以返回套接字.
返回到应用程序的套接字可以是java.
net.
Socket的子类,以直接公开一些功能(如压缩、安全性、记录标记、统计信息收集或防火墙贯通)的新API(javax.
net.
SocketFactory).
注释SybSocketFactory是过度简化的javax.
net.
SocketFactory,可以使应用程序从java.
net.
*过渡到javax.
net.
*在jConnect中使用自定义套接字1提供一个实现com.
sybase.
jdbcx.
SybSocketFactory的Java类.
请参见第109页的"创建和配置自定义套接字".
2设置SYBSOCKET_FACTORY连接属性以使jConnect可以使用您的实现获取套接字.
若要在jConnect中使用自定义套接字,请将SYBSOCKET_FACTORY连接属性设置为以下内容之一:实现com.
sybase.
jdbcx.
SybSocketFactory的类名称DEFAULT(这将实例化新的java.
net.
Socket)有关如何设置SYBSOCKET_FACTORY的说明,请参见第9页的"连接属性".
创建和配置自定义套接字jConnect获得自定义套接字后将使用该套接字连接到服务器.
对套接字的任何配置都必须在jConnect获得该套接字之前完成.
本节介绍如何使用jConnect插入SSL套接字实现(如javax.
net.
ssl.
SSLSocket).
以下示例显示SSL的实现如何创建、配置和返回SSLSocket实例.
在该示例中,MySSLSocketFactory类实现SybSocketFactory并扩展javax.
net.
ssl.
SSLSocketFactory以实现SSL.
它包含两个createSocket方法:一个用于SSLSocketFactory,另一个用于SybSocketFactory,功能如下:创建SSL套接字实现自定义套接字插件110jConnectforJDBC调用SSLSocket.
setEnableCipherSuites以指定可用于加密的密码成套程序返回jConnect要使用的套接字示例publicclassMySSLSocketFactoryextendsSSLSocketFactoryimplementsSybSocketFactory{/***Createasocket,settheciphersuitesitcanuse,return*thesocket.
*Demonstrateshowcithersuitescouldbehard-codedintothe*implementation.
**Seejavax.
net.
SSLSocketFactory#createSocket*/publicSocketcreateSocket(Stringhost,intport)throwsIOException,UnknownHostException{//Prepareanarraycontainingtheciphersuitesthatareto//beenabled.
StringenableThese[]={"SSL_DH_DSS_EXPORT_WITH_DES40_CBC_SHA","SSL_RSA_EXPORT_WITH_RC2_CBC_40_MD5","SSL_DH_RSA_EXPORT_WITH_DES40_CBC_SHA"};Sockets=SSLSocketFactory.
getDefault().
createSocket(host,port);((SSLSocket)s).
setEnabledCipherSuites(enableThese);returns;}/***ReturnanSSLSocket.
*Demonstrateshowtosetciphersuitesbasedonconnection*propertieslike:*Properties_props=newProperties();*Setotherurl,password,etc.
properties.
*_props.
put(("CIPHER_SUITES_1",*"SSL_DH_DSS_EXPORT_WITH_DES40_CBC_SHA");*_props.
put("CIPHER_SUITES_2",*"SSL_RSA_EXPORT_WITH_RC2_CBC_40_MD5");*_props.
put("CIPHER_SUITES_3",第3章安全性程序员参考111*"SSL_DH_RSA_EXPORT_WITH_DES40_CBC_SHA");*_conn=_driver.
getConnection(url,_props);**Seecom.
sybase.
jdbcx.
SybSocketFactory#createSocket*/publicSocketcreateSocket(Stringhost,intport,Propertiesprops)throwsIOException,UnknownHostException{//checktoseeifciphersuitesaresetintheconnection//properitesVectorcipherSuites=newVector();StringcipherSuiteVal=null;intcipherIndex=1;do{if((cipherSuiteVal=props.
getProperty("CIPHER_SUITES_"+cipherIndex++))==null){if(cipherIndexfilename在UNIX系统中,输入:shhttpd.
sh-Dverbose=1>filename&其中,filename是调试消息输出文件.
管理jConnect应用程序所使用的内存132jConnectforJDBC您的Web服务器可能不支持connect方法.
小程序仅能够连接到可下载这些小程序的主机.
HTTP网关和Web服务器必须在同一主机上运行.
在这种情况下,小程序可以通过HTTP网关(HTTP网关能够将请求路由到相关数据库)控制的端口连接到同一主机.
若要查看该过程是如何实现的,请查阅位于jConnect安装目录下的sample2子目录中的Isql.
java和gateway.
html源文件.
搜索"proxy".
管理jConnect应用程序所使用的内存以下情形及其解决方案可能有助于解决jConnect应用程序使用越来越多内存的问题.
在jConnect应用程序中,应当显式关闭最近一次使用的所有Statement对象以及子类(例如,PreparedStatement、CallableStatement)以阻止语句累积在内存中.
仅关闭ResultSet是不够的.
例如,下面的语句会导致出现问题:ResultSetrs=_conn.
prepareCall(_query).
execute();.
.
.
rs.
close();而应当使用如下语句:PreparedStatementps=_conn.
prepareCall(_query);ResultSetrs=ps.
executeQuery();.
.
.
rs.
close();ps.
close();根据所连接到的AdaptiveServer或SQLAnywhere数据库版本的不同,可能不存在对可滚动游标或可更新式可滚动游标的内在支持.
为了在后端服务器原本不支持可滚动游标或可更新式可滚动游标的情况下对这些游标提供支持,jConnect会根据需要,在每次调用ResultSet.
next时在客户端上高速缓存行数据.
但到达结果集的末尾时,整个结果集将存储到客户端内存中.
由于这可能会导致性能降低,因此,Sybase建议仅当结果集相当小的时候,才使用TYPE_SCROLL_INSENSITIVE结果集.
在该版本中,jConnect可确定AdaptiveServer连接是否支持本机可滚动游标功能,并使用该功能代替客户端高速缓存.
因此,大多数应用程序都可以在访问无序行的过程中获得显著性能提高并可降低客户端内存要求.
第4章故障排除程序员参考133解决存储过程错误本节介绍如何解决在尝试使用jConnect和存储过程时可能出现的问题.
RPC返回比已注册参数少的输出参数SQLState:JZ0SG-RPC未返回与应用程序注册的参数相同数量的输出参数.
出现该错误的原因在于,通过调用CallableStatement.
registerOutParam注册的参数多于在存储过程中声明为"OUTPUT"的参数.
确保已将所有相应参数声明为"OUTPUT".
注意内容如下的代码行:createprocedureyourproc(@p1intOUTPUT,.
.
.
注释如果在使用SQLAnywhere时出现此错误,请升级到SQLAnywhere版本5.
5.
04或更高版本.
在返回输出参数时出现获取/状态错误如果查询没有返回行数据,则应该使用CallableStatement.
executeUpdate或execute方法而不应使用executeQuery方法.
根据JDBC标准的要求,如果executeQuery没有结果集,jConnect会抛出一个SQL例外.
在非链式事务模式中执行存储过程Sybase错误7713-只能在非链式事务模式中执行存储过程.
当JDBC试图将连接置于autocommit(true)模式时会出现该错误.
应用程序可使用Connection.
setAutoCommit(false)或通过使用"setchainedon"语言命令将连接更改为链式模式.
如果存储过程不是在兼容模式中创建的,则会出现该错误.
若要修复该问题,请使用:sp_procxmodeprocedure_name,"anymode"解决自定义套接字执行错误134jConnectforJDBC解决自定义套接字执行错误如果试图在调用sun.
security.
ssl.
SSLSocketImpl.
setEnabledCipherSuites时设置SSL套接字,则可能会接收到类似如下的例外:java.
lang.
IllegalArgumentException:SSL_SH_anon_EXPORT_WITH_RC4_40_MDS检验SSL库是否位于系统库路径中.
程序员参考135第5章性能和调优本章介绍如何在使用jConnect时优化或改善性能.
改善jConnect性能以下多种方法用于优化使用jConnect的应用程序的性能:使用TextPointer.
sendData方法将文本和图像发送到AdaptiveServer数据库.
请参见第62页的"更新数据库中的图像数据".
创建在会话过程中重复使用的动态SQL语句的预编译PreparedStatement对象.
请参见第137页的"对动态SQL中的预准备语句的性能调优".
使用批处理更新通过减少网络通信量来改善性能;具体地说,就是所有查询被发送到一个组的服务器,而且返回到客户端的所有响应被发送到一个组中.
请参见第59页的"批处理更新支持".
对于可能会移动图像数据、大的行集以及过长的文本数据的会话,使用PACKETSIZE连接属性设置最大可用包大小.
对于TDS-tunneled的HTTP,设置最大TDS包大小并配置Web服务器以支持HTTP1.
1Keep-Alive功能.
此外,将SkipDoneProc服务器小程序参数设置为"true".
使用协议游标(LANGUAGE_CURSOR连接属性的缺省设置).
有关详细信息,请参见第145页的"LANGUAGE_CURSOR连接属性".
如果使用TYPE_SCROLL_INSENSITIVE结果集,应只在结果集很小时才使用它们.
有关详细信息,请参见第56页的"在jConnect中使用TYPE_SCROLL_INSENSITIVE结果集".
在后续章节中将介绍改善性能的其它需要考虑的事项.
主题页码改善jConnect性能135对动态SQL中的预准备语句的性能调优137游标性能144改善jConnect性能136jConnectforJDBCBigDecimal范围重设JDBC1.
0规范要求getBigDecimal有一个范围因子.
然后,当从服务器返回BigDecimal对象时,必须使用getBigDecimal已使用的原范围因子对其重新进行范围设置.
若要减少范围重设所需的时间,请使用JDBC2.
0getBigDecimal方法(jConnect在SybResultSet类中实现,且不需要scale值):publicBigDecimalgetBigDecimal(intcolumnIndex)throwsSQLException例如:SybResultSetrs=(SybResultSet)stmt.
executeQuery("SELECTnumeric_columnfromT1");while(rs.
next()){BigDecimalbdrs.
getBigDecimal("numeric_column");.
.
.
}REPEAT_READ连接属性如果将REPEAT_READ连接属性设置为"false",则可改善从数据库中检索结果集的性能.
但是,当REPEAT_READ为"false"时:必须按照列索引顺序读取列值.
如果要按名称而不是按列编号访问列将是很困难的.
不能多次读取行中的列值.
SunIoConverter字符集转换如果使用多字节字符集并需要改善驱动程序性能,可以使用jConnect示例提供的SunIoConverter类.
此转换程序以OracleCorporation提供的sun.
io类为基础.
第5章性能和调优程序员参考137SunIoConverter类不是字符集转换程序功能的纯Java实现,而且因此未集成到标准jConnect产品中.
不过,Sybase已提供了该转换程序以供参考之用,并且可与jConnect驱动程序一起使用来改善字符集转换性能.
注释根据Sybase的测试,SunIoConverter类在所测试的所有虚拟机上都改善了性能.
不过,OracleCorporation保留在JDK未来版本中删除或更改sun.
io类的权利.
因此,此SunIoConverter类可能会与JDK的更高版本不兼容.
若要使用SunIoConverter类,必须先安装jConnect示例应用程序.
安装完毕后,设置CHARSET_CONVERTER_CLASS连接属性,使其指向jConnect安装目录的sample2子目录中的SunIoConverter类.
有关安装jConnect及其组件(包括示例应用程序)的完整指导,请参见SybasejConnectforJDBCInstallationGuide(《SybasejConnectforJDBC安装指南》).
若正在使用缺省字符集为iso_1的数据库或仅前7位ASCII,则通过使用TruncationConverter可获得显著的性能优势.
请参见第35页的"jConnect字符集转换程序".
对动态SQL中的预准备语句的性能调优在EmbeddedSQL中,动态语句是需要在运行期编译而不是静态编译的SQL语句.
通常,动态语句包含输入参数,但这不是必需的.
在SQL中,prepare命令用于预编译动态语句并将其保存,以使其在会话期间不必重新编译便可重复执行.
如果语句在一个会话中使用多次,预编译将比每次使用时将其发送到数据库并进行编译提供更好的性能.
语句越复杂,性能优势就越显著.
如果可能仅使用几次语句,预编译可能会降低效率,因为在数据库中的预编译、保存以及随后的释放都会增加开销.
预编译要执行的动态SQL语句并将其保存到内存中会耗用时间和资源.
如果在会话中不太可能多次使用同一个语句,执行数据库prepare的开销可能会大大超过其性能优势.
另外需要考虑的是,只要数据库中预准备了动态SQL语句,它就非常类似于存储过程.
在某些情况下,创建存储过程并使其驻留在服务器中可能会比在应用程序中定义预准备语句更可取.
这将在第138页的"选择预准备语句和存储过程"中讨论.
对动态SQL中的预准备语句的性能调优138jConnectforJDBC可以使用jConnect优化Sybase数据库中动态SQL语句的性能,方法如下:在同一语句在会话中可能多次执行的情况下,创建包含预编译语句的PreparedStatement对象.
在同一语句在会话中很少使用的情况下,创建包含未编译SQL语句的PreparedStatement对象.
如以下各节所述,设置DYNAMIC_PREPARE连接属性并创建PreparedStatement对象的最佳方法可能取决于应用程序是否需要跨JDBC驱动程序移植,或者所编写的应用程序是否允许特定于jConnect的JDBC扩展.
jConnect提供了动态SQL语句的性能调优功能.
选择预准备语句和存储过程如果创建包含预编译动态SQL语句的PreparedStatement对象,一旦该语句在数据库中编译,它实际上就变成了存储过程,驻留在内存中,并附加到与会话相关的数据结构中.
在决定是否维护数据库中的存储过程或在应用程序中创建包含已编译SQL语句的PreparedStatement对象时,资源需求以及数据库和应用程序维护都是需要考虑的重要因素:存储过程一旦被编译,就跨所有的连接在全局都可用.
相反,PreparedStatement对象中的动态SQL语句在每个使用它的会话中都需要进行编译和释放.
如果应用程序访问多个数据库,使用存储过程意味着相同的存储过程需要在所有的目标数据库上都可用.
这样便产生了数据库维护问题.
如果对动态SQL语句使用PreparedStatement对象,就可避免出现这一问题.
如果应用程序为调用存储过程创建了CallableStatement对象,则可在该存储过程中封装SQL代码和表引用.
然后可修改基础数据库或SQL代码而无需更改应用程序.
可移植应用程序中的预准备语句如果在来自不同供应商的数据库上运行应用程序,而且想要一些PreparedStatement对象包含预编译语句,而其它对象包含未编译语句,进行如下处理:在访问Sybase数据库时,确保已将DYNAMIC_PREPARE连接属性设置为"true".
第5章性能和调优程序员参考139若要返回包含预编译语句的PreparedStatement对象,请以标准方式使用Connection.
prepareStatement:PreparedStatementps_precomp=Connection.
prepareStatement(sql_string);若要返回包含未编译语句的PreparedStatement对象,请使用Connection.
prepareCall.
Connection.
prepareCall返回CallableStatement对象,但因为CallableStatement是PreparedStatement的一个子类,所以您可以将CallableStatement对象向上转换为PreparedStatement对象,如下所示:PreparedStatementps_uncomp=Connection.
prepareCall(sql_string);确保PreparedStatement对象ps_uncomp包含未编译语句,因为仅执行Connection.
prepareStatement以返回包含预编译语句的PreparedStatement对象.
具有jConnect扩展的预准备语句如果不考虑跨驱动程序的可移植性,可编写使用SybConnection.
prepareStatement的代码,以指定PreparedStatement对象是否包含预编译或未编译语句.
在这种情况下,如何编码预准备语句可取决于应用程序中的大多数动态语句在会话中可能执行多次还是仅执行几次.
如果大多数动态语句不常执行对于大多数动态SQL语句在会话中可能仅执行一两次的应用程序:将连接属性DYNAMIC_PREPARE设置为"false".
若要返回包含未编译语句的PreparedStatement对象,请以标准方式使用Connection.
prepareStatement:PreparedStatementps_uncomp=Connection.
prepareStatement(sql_string);若要返回包含预编译语句的PreparedStatement对象,请使用SybConnection.
prepareStatement并将dynamic设置为"true",如下所示:PreparedStatementps_precomp=(SybConnection)conn.
prepareStatement(sql_string,true);对动态SQL中的预准备语句的性能调优140jConnectforJDBC如果大多数动态语句在会话中执行多次如果应用程序中的大多数动态语句在会话中可能执行多次,则进行如下处理:将连接属性DYNAMIC_PREPARE设置为"true".
若要返回包含预编译语句的PreparedStatement对象,请以标准方式使用Connection.
prepareStatement:PreparedStatementps_precomp=Connection.
prepareStatement(sql_string);若要返回包含未编译语句的PreparedStatement对象,则可以使用Connection.
prepareCall(请参见可移植应用程序中的预准备语句)或SybConnection.
prepareStatement,并将dynamic设置为"false":PreparedStatementps_uncomp=(SybConnection)conn.
prepareStatement(sql_string,false);PreparedStatementps_uncomp=Connection.
prepareCall(sql_string);Connection.
prepareStatementjConnect执行Connection.
prepareStatement,因此可对其进行设置,以返回PreparedStatement对象中的预编译SQL语句或未编译SQL语句.
如果设置Connection.
prepareStatement返回PreparedStatement对象中的预编译SQL语句,它会将动态SQL语句发送到数据库中进行预编译,并且如同直接执行prepare命令时一样,被准确地保存下来.
如果设置Connection.
prepareStatement返回未编译SQL语句,它将返回PreparedStatement对象中的未编译SQL语句,而不将其发送到数据库中.
Connection.
prepareStatement返回的SQL语句的类型由连接属性DYNAMIC_PREPARE确定,而且适用于整个会话.
对于Sybase特定应用程序,jConnect6.
05及更高版本在jConnectSybConnection类下提供了prepareStatement方法.
SybConnection.
prepareStatement允许用户指定是否要对各动态SQL语句进行预编译,而不受DYNAMIC_PREPARE连接属性会话级设置的影响.
第5章性能和调优程序员参考141DYNAMIC_PREPARE连接属性DYNAMIC_PREPARE是用于启用动态SQL预准备语句的布尔值连接属性:如果将DYNAMIC_PREPARE设置为"true",则在会话期间每次调用Connection.
prepareStatement都将试图返回PreparedStatement对象中的预编译语句.
在这种情况下,PreparedStatement执行时,它所包含的语句已在数据库中进行了预编译,拥有动态赋值的占位符,而且仅需执行该语句.
如果将连接的DYNAMIC_PREPARE设置为"false",则由Connection.
prepareStatement返回的PreparedStatement对象不包含预编译语句.
在这种情况下,每次执行PreparedStatement时,它所包含的动态SQL语句必须发送到数据库中进行编译和执行.
DYNAMIC_PREPARE的缺省值为"true".
在以下示例中,DYNAMIC_PREPARE设置为"false"以禁用动态SQL语句预编译.
在该示例中,props是用于指定连接属性的Properties对象.
.
.
.
props.
put("DYNAMIC_PREPARE","false")Connectionconn=DriverManager.
getConnection(url,props);将DYNAMIC_PREPARE设置为"true"时,应注意:并非所有的动态语句均可在prepare命令下预编译.
SQL-92标准对可用于prepare命令的语句做了一些限制,而且每个数据库供应商可能会有各自不同的约束.
如果数据库因为不能预编译和不能保存通过Connection.
prepareStatement发送到该数据库的语句而产生错误,jConnect会捕获该错误,并返回包含未编译动态SQL语句的PreparedStatement对象.
每次执行PreparedStatement对象时,该语句都会重新发送到数据库进行编译和执行.
在会话结束或显式关闭预编译语句的PreparedStatement对象之前,预编译语句将一直驻留在数据库的内存中.
PreparedStatement对象的碎片收集不能从数据库中删除预准备语句.
作为一般规则,应当在最后一次使用PreparedStatement对象之后显式关闭它,以避免预准备语句在会话期间累积在服务器的内存中并降低性能.
对动态SQL中的预准备语句的性能调优142jConnectforJDBCSybConnection.
prepareStatement如果应用程序允许特定于jConnect的JDBC扩展,则可使用SybConnection.
prepareStatement扩展方法返回PreparedStatement对象中的动态SQL语句:PreparedStatementSybConnection.
prepareStatement(Stringsql_stmt,booleandynamic)throwsSQLExceptionSybConnection.
prepareStatement会根据dynamic参数的设置,返回包含预编译或未编译SQL语句的PreparedStatement对象.
如果dynamic为"true",则SybConnection.
prepareStatement返回具有预编译SQL语句的PreparedStatement对象.
如果dynamic为"false",则它会返回具有未编译SQL语句的PreparedStatement对象.
以下示例显示了如何使用SybConnection.
prepareStatement返回包含预编译语句的PreparedStatement对象:PreparedStatementprecomp_stmt=((SybConnection)conn).
prepareStatement("SELECT*FROMauthorsWHEREau_fnameLIKE",true);在该示例中,连接对象conn被转换为SybConnection对象,以允许使用SybConnection.
prepareStatement.
传递给SybConnection.
prepareStatement的SQL字符串在数据库中预编译,即使连接属性DYNAMIC_PREPARE设置为"false".
如果数据库因为不能预编译通过SybConnection.
prepareStatement发送到该数据库的语句而产生错误,则jConnect会抛出SQLException,并且调用无法返回PreparedStatement对象.
这与Connection.
prepareStatement不同,后者会捕获SQL错误,并且如果产生上述错误,它会返回包含未编译语句的PreparedStatement对象.
ESCAPE_PROCESSING_DEFAULT连接属性缺省情况下,jConnect会分析提交到数据库的所有SQL语句,以查找有效的JDBC函数转义.
如果应用程序不在其SQL调用中使用JDBC函数转义,可将此连接属性设置为"false"以回避此分析过程.
这样做可以稍微改善性能.
第5章性能和调优程序员参考143jConnect中的优化批处理jConnect实施内部算法以加快PreparedStatement对象的批处理操作速度.
此算法在HOMOGENEOUS_BATCH连接属性设置为true时被调用.
注释只有客户端应用程序连接到支持同类批处理的服务器时,此功能才可用.
AdaptiveServerEnterprise15.
7引入了对同类批处理的支持.
以下示例说明了使用addBatch和executeBatch方法的PreparedStatement批处理操作:Stringsql="updatememberssetlastname=wheremember_id=";prep_stmt=connection.
prepareStatement(sql);prep_stmt.
setString(1,"Forrester");prep_stmt.
setLong(2,45129);prep_stmt.
addBatch();prep_stmt.
setString(1,"Robinson");prep_stmt.
setLong(2,45130);prep_stmt.
addBatch();prep_stmt.
setString(1,"Servo");prep_stmt.
setLong(2,45131);prep_stmt.
addBatch();prep_stmt.
executeBatch();其中,connection表示连接实例,prep_stmt表示预准备语句实例,而表示预准备语句的参数占位符.
游标性能144jConnectforJDBC大对象(LOB)列的同类批处理如果HOMOGENEOUS_BATCH和ENABLE_LOB_LOCATORS属性设置为true,客户端应用程序就无法将LOB和非LOB预准备语句setter方法混合在同一批处理中.
例如,以下语句是无效的:Stringsql="updatemembersSETcatchphrase=WHEREmember_id=";prep_stmt=connection.
prepareStatement(sql);prep_stmt.
setString(1,"Pushthebutton,Frank!
");prep_stmt.
setLong(2,45129);prep_stmt.
addBatch();Clobmyclob=con.
createClob();myclob.
setString(1,"Hi-keeba!
");prep_stmt.
setClob(1,myclob);prep_stmt.
setLong(2,45130);prep_stmt.
addBatch();pstmt.
executeBatch();其中,catchphrase表示类型为text的列.
此代码失败的原因是setString方法和setClob方法用在同一列的同一批处理中.
游标性能当在SybCursorResultSet类中使用Statement.
setCursorName方法或setFetchSize()方法时,jConnect会在数据库中创建游标.
使用其它方法可以使jConnect打开、读取和更新游标.
jConnect可通过将SQL语句发送到数据库或通过将游标命令编码为TDS通信协议内部的标识来创建和操纵游标.
第一种类型的游标是"语言游标",第二种类型的游标是"协议游标".
协议游标能够提供比语言游标更高的性能.
另外,并非所有数据库都支持语言游标.
例如,SQLAnywhere数据库就不支持语言游标.
在jConnect中,缺省条件是所有游标都是协议游标.
不过,LANGUAGE_CURSOR连接属性提供了通过数据库中的语言命令创建和操纵游标的选项.
第5章性能和调优程序员参考145LANGUAGE_CURSOR连接属性LANGUAGE_CURSOR在jConnect中是一个布尔值连接属性,用于确定将游标创建为协议游标还是语言游标:如果LANGUAGE_CURSOR设置为"false",则在会话期间创建的所有游标均为能够提供更好性能的协议游标.
jConnect通过将游标命令作为TDS协议中的标识发送来创建和操纵游标.
缺省情况下,LANGUAGE_CURSOR设置为"false".
如果LANGUAGE_CURSOR设置为"true",则在会话期间创建的所有游标均为语言游标.
jConnect通过将SQL语句发送到数据库进行分析和编译来创建和操纵游标.
将LANGUAGE_CURSOR设置为"true"无任何已知优点,但如果将其设置为"false"时应用程序显示意外行为,在这种情况下可将其设置为"true".
游标性能146jConnectforJDBC程序员参考147第6章迁移jConnect应用程序本章介绍如何将应用程序从jConnect5.
x和6.
x迁移到jConnect7.
x.
向jConnect7.
x迁移应用程序使用以下过程升级到jConnect7.
x.
迁移到jConnect7.
x1如果代码使用Sybase扩展,或者您要在代码中显式导入任何jConnect类,则可以根据需要更改软件包导入语句.
例如,将导入语句importcom.
sybase.
jdbc.
*和importcom.
sybase.
jdbc2.
jdbc.
*更改为importcom.
sybase.
jdbcx.
*有关使用Sybase扩展API的信息,请参见第148页的"更改Sybase扩展".
2将JDBC_HOME设置为jConnect驱动程序的顶层安装目录:JDBC_HOME=jConnect-7_03更改CLASSPATH环境变量以反映新的安装.
类路径必须包括以下内容:JDBC_HOME/classes/jconn4.
jar主题页码向jConnect7.
x迁移应用程序147更改Sybase扩展148更改Sybase扩展148jConnectforJDBC4更改用于装载驱动程序的源代码,并重新编译该应用程序以使用新的驱动程序:Class.
forName("com.
sybase.
jdbc4.
jdbc.
SybDriver");5检验jConnect7.
0驱动程序是否为CLASSPATH环境变量中指定的第一个jConnect驱动程序.
更改Sybase扩展jConnect版本4.
1及更高版本包括软件包com.
sybase.
jdbcx,该软件包含JDBC的所有Sybase扩展.
在jConnect4.
1以前的版本中,可在com.
sybase.
jdbc和com.
sybase.
utils软件包中找到这些扩展.
com.
sybase.
jdbcx软件包为不同版本的jConnect提供一致的接口.
所有Sybase扩展都定义为Java接口,从而可以在不影响使用这些接口建立的应用程序的情况下更改底层实现.
当开发使用Sybase扩展的新应用程序时,可使用com.
sybase.
jdbcx.
该软件包中的接口允许以最小的更改将应用程序升级到jConnect4.
0以后的版本.
某些Sybase扩展已经过更改以容纳com.
sybase.
jdbcx接口.
扩展更改示例如果应用程序使用SybMessageHandler,代码的区别如下:jConnect4.
0代码:importcom.
sybase.
jdbc.
SybConnection;importcom.
sybase.
jdbc.
SybMessageHandler;.
.
Connectioncon=DriverManager.
getConnection(url,props);SybConnectionsybCon=(SybConnection)con;sybCon.
setMessageHandler(newConnectionMsgHandler());第6章迁移jConnect应用程序程序员参考149jConnect6.
0代码:importcom.
sybase.
jdbcx.
SybConnection;importcom.
sybase.
jdbcx.
SybMessageHandler;.
.
Connectioncon=DriverManager.
getConnection(url,props);SybConnectionsybCon=(SybConnection)con;sybCon.
setSybMessageHandler(newConnectionMsgHandler());有关如何使用Sybase扩展的更多示例,请参见随jConnect一起提供的示例.
方法名称表6-1列出了方法在新接口中的新名称.
表6-1:方法名称更改Debug类不再支持对Debug类的直接静态引用,但在com.
sybase.
utils软件包中存在此不受支持的引用.
要使用jConnect调试功能,应使用SybDriver类的getDebug方法获得对Debug类的引用.
例如:importcom.
sybase.
jdbcx.
SybDriver;importcom.
sybase.
jdbcx.
Debug;.
.
.
SybDriversybDriver=SybDriver)Class.
forName("com.
sybase.
jdbc4.
jdbc.
SybDriver")newInstance();DebugsybDebug=sybDriver.
getDebug();sybDebug.
debug(true,"ALL",System.
out);jConnectjavadoc文档中有Sybase扩展的完整列表,该文档位于jConnect安装目录的docs/目录中.
Class原有名称新名称SybConnectiongetCapture()createCapture()SybConnectionsetMessageHandler()setSybMessageHandler()SybConnectiongetMessageHandler()getSybMessageHandler()SybStatementsetMessageHandler()setSybMessageHandler()SybStatementgetMessageHandler()getSybMessageHandler()更改Sybase扩展150jConnectforJDBC程序员参考151第7章Web服务器网关本章介绍Web服务器网关并说明如何在jConnect中使用这些网关.
关于Web服务器网关如果数据库服务器与Web服务器运行在不同的主机上,或者正在开发的Internet应用程序必须通过防火墙连接到安全的数据库服务器,则需要一个网关充当代理,以提供到数据库服务器的路径.
为使用安全套接字层(SSL)协议连接到服务器,jConnect提供了一个Java服务器小程序,该小程序可安装在支持javax.
servlet接口的任何Web服务器上.
该服务器小程序启用jConnect支持加密并将Web服务器用作网关.
注释jConnect支持客户端系统上的SSL.
有关详细信息,请参见第108页的"实现自定义套接字插件".
使用TDS贯通jConnect使用TDS与数据库服务器通信.
HTTP贯通TDS可用于转发请求.
从客户端到后端数据库的请求经过了整个网关,并在请求的正文中包含TDS.
请求的标头指示请求包中包含的TDS的长度.
TDS是一种面向连接的协议,但HTTP不是.
为支持安全性功能(如为Internet应用程序加密),jConnect使用TDS贯通服务器小程序来维护各HTTP请求间的逻辑连接.
服务器小程序在初始登录请求的过程中生成一个会话ID,并且每个后续请求的标头中都包含此会话ID.
使用会话ID可以标识活动会话甚至恢复会话,只要服务器小程序拥有一个使用该特定会话ID的开放式连接即可.
主题页码关于Web服务器网关151使用要求155使用TDS贯通服务器小程序157关于Web服务器网关152jConnectforJDBCTDS贯通服务器小程序提供的逻辑连接使jConnect能够支持两个系统间的加密通信,例如,jConnect客户端将CONNECT_PROTOCOL连接属性设置为"https"后可连接到运行TDS贯通服务器小程序的Web服务器.
配置jConnect和网关有几个用于设置Web服务器和AdaptiveServer的选项.
下面是关于四种常见配置的示例,显示了在何处安装jConnect驱动程序以及何时使用带有TDS贯通服务器小程序的网关.
Web服务器和AdaptiveServer在同一主机上在两层配置中,Web服务器和AdaptiveServer安装在同一主机上:在Web服务器主机上安装jConnect.
不需要任何网关.
图7-1:Web服务器和AdaptiveServer在同一主机上专用JDBCWeb服务器和AdaptiveServer在同一主机上在此配置中,主Web服务器在一台单独的主机上.
另一台主机由专用于AdaptiveServer访问的Web服务器和AdaptiveServer共享.
来自主服务器的链接发送请求,要求SQL访问专用Web服务器.
在另一台主机上安装:在第二台(AdaptiveServer)主机上安装jConnect.
不需要任何网关.
Web服务器客户端下载的小程序和jConnect驱动程序浏览器主机AdaptiveServerURL下载小程序和jConnect小程序和jConnectTDS5.
0第7章Web服务器网关程序员参考153图7-2:专用JDBCWeb服务器和AdaptiveServer在同一主机上Web服务器和AdaptiveServer在不同的主机上在三层配置中,AdaptiveServer和Web服务器在不同的主机上.
jConnect需要一个网关来充当AdaptiveServer的代理.
在Web服务器主机上安装jConnect.
安装TDS贯通服务器小程序或其它网关.
Web服务器客户端下载的小程序和jConnect驱动程序浏览器主机BAdaptiveServerURL小程序和jConnect主Web服务器主机A非SQL小程序URL下载小程序和jConnectTDS5.
0关于Web服务器网关154jConnectforJDBC图7-3:Web服务器和AdaptiveServer在不同的主机上通过防火墙连接到服务器若要连接到受防火墙保护的服务器,必须使用带有TDS贯通服务器小程序的Web服务器来支持在Internet上传输数据库请求响应.
在Web服务器主机上安装jConnect.
需要一台支持javax.
servlet接口的Web服务器.
客户端下载的小程序和jConnect驱动程序浏览器URL主机B下载小程序和jConnectTDS5.
0主Web服务器主机AAdaptiveServer小程序和jConnectTDS-TS或其它网关HTTP贯通TDS第7章Web服务器网关程序员参考155图7-4:通过防火墙连接到服务器使用要求以下几节介绍Web服务器网关的使用要求.
客户端下载的小程序和jConnect驱动程序浏览器URL主机B下载小程序和jConnectTDS5.
0主机AAdaptiveServer小程序和jConnectHTTP/HTTPS贯通TDSWeb服务器支持javax.
servletTDS服务器小程序防火墙使用要求156jConnectforJDBC阅读index.
html文件使用Web浏览器查看jConnect安装目录中的index.
html文件.
index.
html中提供了指向jConnect文档和示例代码的链接.
注释如果在安装有jConnect的同一台计算机上使用Netscape,请确保浏览器无权访问CLASSPATH环境变量.
请参见SybasejConnectforJDBCInstallationGuideandReleaseBulletin(《SybasejConnectforJDBC安装指南和发行公告》)第3章中的"RestrictionsonSettingCLASSPATHWhenYouUseNetscape"(使用Netscape时设置CLASSPATH的限制).
查看index.
html文件1打开Web浏览器.
2输入与安装相匹配的URL.
例如,如果浏览器和Web服务器运行在同一主机上,则输入:http://localhost:8000/index.
html如果浏览器和Web服务器运行在不同的主机上,则输入:http://host:port/index.
html其中,host是运行Web服务器的主机的名称,port是侦听端口.
运行示例Isql小程序在浏览器中装载index.
html文件后:运行示例小程序1单击"运行示例JDBC小程序"(RunSampleJDBCApplets).
此操作将带您进入"jConnect示例程序"(jConnectSamplePrograms)页面.
2向下移动"示例程序"(SamplePrograms)页面以找到"可执行的示例"(ExecutableSamples)下的表.
3在该表中找到"Isql.
java"(Isql.
java)并单击行末的"运行"(Run).
示例Isql.
java小程序提示对示例数据库执行简单查询并显示结果.
小程序显示缺省的AdaptiveServer主机名、端口号、用户名(guest)、口令(sybase)、数据库和查询.
小程序使用缺省值连接到Sybase示例数据库.
单击"执行"(Go)后将返回结果.
第7章Web服务器网关程序员参考157故障排除在UNIX上,如果小程序未能按预期显示,则可以修改小程序的屏幕维度:修改小程序的屏幕维度1使用文本编辑器编辑下面的内容:$JDBC_HOME/sample2/gateway.
html2将第7行的高度参数更改为650.
可尝试使用不同的高度设置.
3在浏览器上重装Web页.
使用TDS贯通服务器小程序要使用TDS贯通服务器小程序,需要一台支持javax.
servlet接口的Web服务器(如OracleCorporationJavaWeb服务器).
安装Web服务器时,把jConnectTDS贯通服务器小程序添加到活动服务器小程序列表中.
还可以通过设置服务器小程序参数来定义连接超时和最大包大小.
使用TDS贯通服务器小程序时,从客户端到后端服务器的请求贯通网关,这样的请求包括GET或POST命令、TDS会话ID(在初始请求后)、后端地址和请求状态.
TDS在请求正文中.
两个标头字段表示TDS流的长度和网关指派的会话ID.
当客户端发送请求时,Content-Length标头字段表示TDS内容的大小,请求命令为POST.
如果由于客户端正在检索来自服务器的响应数据的下一部分内容或正在关闭连接,从而造成请求中没有任何TDS数据,此时请求命令为GET.
以下示例演示了如何使用TDS贯通HTTPS协议在客户端和HTTPS网关之间传递信息;该示例显示了一个到名为"DBSERVER"的后端服务器的端口号为"1234"的连接.
使用TDS贯通服务器小程序158jConnectforJDBC表7-1:客户端到网关的登录请求.
无会话ID.
表7-2:网关到客户端.
标头包含由TDS服务器小程序指派的会话ID.
表7-3:客户端到网关.
所有后续请求的标头都包含会话ID.
表7-4:网关到客户端.
所有后续响应的标头都包含会话ID.
检查要求若要对TDS贯通的HTTP使用jConnect服务器小程序,需要:一台支持javax.
servlet接口的Web服务器.
若要安装该服务器,请遵循它提供的操作说明.
安装服务器小程序jConnect安装包括classes目录下的gateway2子目录.
该子目录包含TDS贯通服务器小程序所需的文件.
查询POST/tdsServerHost=dbserver&ServerPort=1234&Operation=moreHTTP/1.
0标头内容长度:605内容(TDS)登录请求查询200SUCCESSHTTP/1.
0标头内容长度:210TDS会话:TDS00245817298274292内容(TDS)登录确认EED查询POST/tdsTDS-Session=TDS00245817298274292&Operation=moreHTTP/1.
0标头内容长度:32内容(TDS)查询"SELECT*fromauthors"查询200SUCCESSHTTP/1.
0标头内容长度:2048TDS会话:TDS00245817298274292内容(TDS)行格式与某些来自查询响应的行第7章Web服务器网关程序员参考159将jConnectgateway包复制到Web服务器的servlets目录下的gateway2子目录中.
复制好服务器小程序后,按照Web服务器操作说明激活服务器小程序.
设置服务器小程序参数将服务器小程序添加到Web服务器时,可输入可选参数定制性能:SkipDoneProc[true|false]–Sybase数据库通常会在查询执行期间执行中间处理步骤时返回行计数信息.
通常,客户端应用程序会忽略此数据.
如果将SkipDoneProc设置为"true",服务器小程序会随即从响应中删除此额外信息,这将减少网络使用和客户端上的处理要求.
这在使用HTTPS/SSL时尤其有效,因为不需要的数据在被忽略前不会被加密/解密.
TdsResponseSize–为贯通的HTTPS设置最大TDS包大小.
如果只有几个用户有大量数据,较大的TdsResponseSize会更加有效.
如果有许多执行小事务的用户,请使用较小的TdsResponseSize.
TdsSessionIdleTimeout–定义在服务器连接自动关闭前该连接能够维持空闲状态的时间量(以毫秒为单位).
TdsSessionIdleTimeout缺省值为600,000(10分钟).
如果交互式客户端程序可能长时间处于空闲状态而您又不希望中断该连接,则增加TdsSessionIdleTimeout.
还可从jConnect客户端使用SESSION_TIMEOUT连接属性设置连接超时值.
这在存在可能长时间处于空闲状态的特定应用程序时很有用.
在这种情况下,可通过SESSION_TIMEOUT连接属性为连接而不是为服务器小程序设置更长的超时值.
Debug–打开调试程序.
请参见第125页的"使用jConnect进行调试".
输入服务器小程序参数(以逗号分隔的字符串).
例如:TdsResponseSize=[size],TdsSessionIdleTimeout=[timeout],Debug=true有关输入服务器小程序参数的完整指导,请参见Web服务器文档.
使用TDS贯通服务器小程序160jConnectforJDBC调用服务器小程序jConnect根据proxy连接属性的路径扩展,确定何时使用安装有TDS贯通服务器小程序的网关.
jConnect能够识别proxy的服务器小程序路径扩展并调用指定网关上的服务器小程序.
用下面的格式定义连接URL:http://host:port/TDS-servlet-pathjConnect通过调用Web服务器上的TDS贯通服务器小程序使TDS贯通HTTP.
服务器小程序的路径必须是服务器别名列表中为Web服务器定义的路径.
跟踪活动的TDS会话可查看活动TDS会话的相关信息,其中包括每个会话的服务器连接.
使用Web浏览器打开管理URL:http://host:port/TDS-servlet-pathOperation=list例如,如果服务器为"myserver",TDS服务器小程序路径为/tds,则输入:http://myserver:8080/tdsOperation=list这将显示活动TDS会话的列表.
单击会话可查看更多信息(包括服务器连接).
终止TDS会话可使用上述URL终止任何活动的TDS会话.
在第一页上单击会话列表中的某个活动会话,然后单击"终止会话"(TerminateThisSession).
恢复TDS会话必要时,可通过设置SESSION_ID连接属性来恢复现有的开放式连接.
指定SESSION_ID时,jConnect会跳过协议的登录阶段,并使用指定的会话ID恢复与网关的连接.
如果指定的会话ID不在服务器小程序中,jConnect会在用户第一次尝试使用连接时抛出SQL异常.
程序员参考161附录AjConnect示例程序该附录是jConnect示例程序的指南:运行IsqlAppIsqlApp允许从命令行发出isql命令,而且允许运行jConnect示例程序.
IsqlApp的语法如下:IsqlApp[-Uusername][-Ppassword][-Sservername][-Ggateway][-p{http|https}][-Ddebug_class_list][-v][-Iinput_command_file][-ccommand_terminator][-Ccharset][-Llanguage][-Kservice_principal_name][-FJAAS_login_config_file_path][-TsessionID][-V]主题页码运行IsqlApp161运行jConnect示例程序和代码163参数说明-U用于连接到服务器的登录ID.
-P指定的登录ID的口令.
-S要连接的服务器的名称.
-G网关地址.
对于HTTP协议,URL是:http://host:port.
若要使用支持加密的HTTPS协议,URL应为https://host:port/servlet_alias.
运行IsqlApp162jConnectforJDBC注释必须在每个选项标志后面输入一个空格.
若要获取命令行选项的完整描述,请输入:javaIsqlApp-help下面的示例显示了如何通过端口"3756"连接到主机"myserver"上的数据库,并运行名为"myscript"的isql脚本:-p指定是要使用HTTP协议还是使用支持加密的HTTPS协议.
-D为所有类或指定的类打开调试程序,类之间用逗号分隔.
例如,-DALL显示所有类的调试输出.
-DSybConnection,Tds仅显示SybConnection和Tds类的调试输出.
-v打开详细输出以显示或打印输出.
-I让IsqlApp接受来自文件而不是来自键盘的命令.
在此参数之后,指定用于IsqlApp输入的文件的名称.
文件必须包含命令终结符(缺省为"go").
-c允许指定一个关键字(如"go"),当独占一行输入该关键字时可终止命令.
这使得在使用终结符关键字之前可以输入多行命令.
如果不指定命令终结符,每个新行都会终止命令.
-C为通过TDS的字符串指定字符集.
如果不指定字符集,IsqlApp将使用服务器的缺省字符集.
-L为jConnect消息和从服务器返回的错误消息指定显示语言.
-K表示用户想要通过Kerberos登录到AdaptiveServer.
此参数设置服务主体名称.
例如:-KmyASE该示例表示您希望执行Kerberos登录,且服务器的服务主体名称为myASE.
有关详细信息,请参见第3章"安全性".
-F指定JAAS登录配置文件的路径.
如果使用-K选项,则必须设置此属性.
例如:-F/foo/bar/exampleLogin.
conf请参见jConnect安装的sample2目录中的ConnectKerberos.
java示例.
有关详细信息,请参见第3章"安全性".
-T如果设置了此参数,jConnect将假定某个应用程序正试图在由TDS贯通网关保持打开的现有TDS会话上重新开始通信.
jConnect将跳过登录协商并将所有来自应用程序的请求转发到指定的会话ID.
-V启用特定于版本的使用特性.
请参见第6页的"使用JCONNECT_VERSION".
参数说明附录AjConnect示例程序程序员参考163javaIsqlApp-Usa-Psapassword-Sjdbc:sybase:Tds:myserver:3756-I$JDBC_HOME/sp/myscript-crun注释提供了对isql命令进行GUI访问的小程序,如下所示:$JDBC_HOME/sample2/gateway.
html(UNIX)%JDBC_HOME%\sample2\gateway.
html(Windows)运行jConnect示例程序和代码jConnect包含多个示例程序,这些示例程序说明了本章所涉及的多个主题,旨在帮助您理解jConnect如何处理各种JDBC类和方法.
此外,本节还提供一个示例代码段作为参考.
示例应用程序安装jConnect时,还可以安装示例程序.
这些示例包含源代码,因此可以查看jConnect是如何实现各种JDBC类和方法的.
有关安装示例程序的完整指导,请参见jConnectforJDBC安装指南.
注释jConnect示例程序仅用于示范.
示例程序安装在jConnect安装目录的sample2子目录下.
sample2子目录中的文件index.
html包含可用示例的完整列表以及每个示例的说明.
index.
html还允许将示例程序作为小程序查看和运行.
运行示例小程序使用Web浏览器,就可以将有些示例程序作为小程序运行.
这使您可在查看输出结果的同时查看源代码.
如果想要以小程序形式运行示例程序,请在Web浏览器中输入http://localhost:8000/sample2/index.
html,以启动Web服务器网关.
运行jConnect示例程序和代码164jConnectforJDBC与SQLAnywhere一起运行示例程序所有示例程序均与AdaptiveServer兼容,但只有有限数目的示例程序与SQLAnywhere兼容.
若要获得与SQLAnywhere兼容的示例程序的当前列表,请参见sample2子目录中的index.
html.
若要运行可用于SQLAnywhere的示例程序,必须在SQLAnywhere服务器上安装pubs2_any.
sql脚本.
此脚本位于sample2子目录中.
在Windows系统中,进入DOS命令窗口并输入:javaIsqlApp-Udba-Ppassword-Sjdbc:sybase:Tds:[hostname]:[port]-I%JDBC_HOME%\sample2\pubs2_any.
sql-cgo在UNIX系统中,输入:javaIsqlApp-Udba-Ppassword-Sjdbc:sybase:Tds:[hostname]:[port]-I$JDBC_HOME/sample2/pubs2_any.
sql-cgo示例代码以下示例代码说明了如何调用jConnect驱动程序、建立连接、发出SQL语句,以及处理结果.
importjava.
io.
*;importjava.
sql.
*;publicclassSampleCode{publicstaticvoidmain(Stringargs[]){try{/**Opentheconnection.
MaythrowaSQLException.
*/DriverManager.
registerDriver((Driver)Class.
forName("com.
sybase.
jdbc4.
jdbc.
SybDriver").
newInstance());Connectioncon=DriverManager.
getConnection("jdbc:sybase:Tds:myserver:3767","sa","");/**Createastatementobject,thecontainerfortheSQL*statement.
MaythrowaSQLException.
附录AjConnect示例程序程序员参考165*/Statementstmt=con.
createStatement();/**Createaresultsetobjectbyexecutingthequery.
*MaythrowaSQLException.
*/ResultSetrs=stmt.
executeQuery("Select1");/**Processtheresultset.
*/if(rs.
next()){intvalue=rs.
getInt(1);System.
out.
println("Fetchedvalue"+value);}rs.
close()stmt.
close()con.
close()}//endtry/**Exceptionhandling.
*/catch(SQLExceptionsqe){System.
out.
println("Unexpectedexception:"+sqe.
toString()+",sqlstate="+sqe.
getSQLState());System.
exit(1);}//endcatchcatch(Exceptione){e.
printStackTrace();System.
exit(1);}//endcatchSystem.
exit(0);}}运行jConnect示例程序和代码166jConnectforJDBC程序员参考167附录BSQL例外与警告消息下表列出了在使用jConnect时会遇到的SQL例外与警告消息.
SQL状态消息/说明/操作010AF严重警告:断言失败,请使用devclasses确定此严重错误的起因.
消息=_____.
说明:jConnect驱动程序中的内部断言失败.
操作:使用devclasses调试类确定显示此消息的原因并向Sybase技术支持部门报告此问题.
010CPAutoCommit选项已更改为true.
此事务上的所有待执行语句(如果有)都已提交.
操作:参见消息文本.
010DF在登录时设置数据库失败.
错误消息:______.
说明:jConnect无法连接到在连接URL中指定的数据库.
操作:确保URL中的数据库名称正确无误.
此外,如果连接到SQLAnywhere,请使用SERVICENAME连接属性指定数据库.
010DP忽略重复的连接属性_____.
说明:某个连接属性被定义了两次.
可能是在驱动程序连接属性列表中用不同的大小写形式对该连接属性定义了两次,例如"password"和"PASSWORD".
连接属性名不区分大小写,因此,jConnect不会在名称相同但大小写不同的属性名间进行区分.
也可以同时在连接属性列表和URL中定义中连接属性.
在这种情况下,连接属性列表中的属性值优先.
操作:确保应用程序只定义一次连接属性.
不过,或许您想利用属性列表中定义的连接属性优先于URL中定义的属性这一特性.
这时,可以放心地忽略此警告.
010HA服务器拒绝了使用高可用性功能的请求.
请重新配置数据库,或不要请求高可用性会话.
说明:服务器拒绝了jConnect试图建立高可用性连接的操作.
操作:重新配置服务器使其支持高可用性故障切换,或者不要将REQUEST_HA_SESSION设置为"true".
010HD这种数据库服务器不支持Sybase的高可用性故障切换.
说明:jConnect试图连接到的数据库不支持高可用性故障切换.
操作:应当只连接到支持高可用性故障切换的数据库服务器.
010HN客户端未指定SERVICE_PRINCIPAL_NAME连接属性.
因此,jConnect使用主机名_____作为服务主体名称操作:确保通过连接属性显式指定服务主体名称.
168jConnectforJDBC010HTHostname属性被截断,最大长度为30.
说明:您为HOSTNAME连接属性提供的字符串超过30个字符,或者运行jConnect应用程序的主机拥有长度超过30字节的名称.
操作:无需任何操作,因为这只是提醒您jConnect将把名称截断到30个字节.
然而,如果希望避免此警告,应将HOSTNAME设置为长度小于等于30个字节.
010KF服务器拒绝了Kerberos登录.
这很可能是因为发生了通用安全服务(GSS)例外.
请检查Kerberos环境和配置.
操作:检查Kerberos环境,确保已正确鉴定到KDC.
有关详细信息,请参见第3章"安全性".
010MX找不到有关此数据库的元数据访问程序信息.
请安装jConnect文档中所述的必需表.
试图检索元数据信息时出错:_____说明:服务器可能不具有返回元数据信息所需的存储过程.
操作:确保服务器上安装有用于提供元数据的存储过程.
请参见《jConnectforJDBC安装指南》第3章中的"安装存储过程".
010P4收到并忽略了一个输出参数.
说明:执行的查询返回一个输出参数,但应用程序的结果处理代码未读取该参数,因此将其忽略.
操作:如果应用程序需要输出参数数据,则必须重写该应用程序以便能获取数据.
这可能需要使用CallableStatement来执行查询,并添加对registerOutputParameter和getXXX的调用.
也可以将DISABLE_UNPROCESSED_PARAM_WARNINGS连接属性设置为"true",从而禁止jConnect返回此警告,这样做或许还可以提高性能.
010P6收到一行并忽略该行.
说明:正在处理的结果集中出现类型为0xD1的意外对象,该对象被忽略.
操作:检查生成结果集的查询,如有需要予以更正.
010PF无法装载在PRELOAD_JARS连接属性中指定的一个或多个jar文件.
说明:如果在使用DynamicClassLoader时将PRELOAD_JARS连接属性设置为以逗号分隔的.
jar文件名列表,就会出现此问题.
当DynamicClassLoader打开与要装载的类所在服务器的连接时,会尝试"预装载"此连接属性中提到的所有.
jar文件.
如果服务器上不存在指定的一个或多个.
jar文件名,则会出现上述错误消息.
操作:验证在应用程序的PRELOAD_JARS连接属性中提到的所有.
jar文件是否均位于服务器上且均可访问.
010PO属性LITERAL_PARAM已设置为"false",因为DYNAMIC_PREPARE的设置为"true".
说明:如要使用预编译的动态语句,则必须允许向这些语句发送参数(在语句带参数的情况下).
将LITERAL_PARAMS设置为"true"会强制以送往服务器的SQL中的文本值的形式发送所有参数.
所以不能将这两个属性都设置为"true".
操作:为避免出现此警告,在要使用动态SQL时,不要将LITERAL_PARAMS设置为"true".
有关详细信息,请参见第137页的"对动态SQL中的预准备语句的性能调优".
SQL状态消息/说明/操作附录BSQL例外与警告消息程序员参考169010RC不支持请求的ResultSet类型和并发.
它们已被转换.
说明:您所请求的结果集类型和并发组合不受支持.
已转换所请求的值.
有关jConnect中可用结果集类型和并发的详细信息,请参见第47页的"对结果集使用游标".
操作:请求受支持的结果集类型和并发组合.
010SJ找不到有关此数据库的元数据访问程序信息.
请安装jConnect文档中所述的必需表.
说明:服务器上没有配置元数据信息.
操作:如果应用程序需要元数据,请安装jConnect中附带的用于返回元数据的存储过程(参见jConnectforJDBCInstallationGuide(《jConnectforJDBC安装指南》)的第3章中的"InstallingStoredProcedures"(安装存储过程)).
如果不需要元数据,请将USE_METADATA属性设置为"false".
010SK数据库无法设置连接选项_____.
说明:连接的数据库不支持应用程序尝试的操作.
操作:可能需要升级数据库,或者确保安装了最新版本的元数据信息.
010SL发现此数据库的元数据访问程序信息已过时.
请数据库管理员装载最新的脚本.
说明:服务器上的元数据信息已过时,需要更新.
操作:安装jConnect中附带的用于返回元数据的存储过程(请参见《jConnectforJDBC安装指南》第3章中的"安装存储过程").
010SM此数据库不支持最初提议的功能集,正在重试.
说明:AdaptiveServerEnterprise11.
9.
2版及更低版本有一个错误,该错误使它们在服务器没有客户端请求的功能时拒绝客户端登录.
此警告说明jConnect检测到这种情况,且正以服务器可接受的最多功能数重试该连接.
当jConnect遇到这项错误时,它会两次连接服务器.
操作:客户端可以放心地忽略此警告;但若想消除此警告并确保jConnect只进行一次连接尝试,客户端可以将ELIMINATE_010SM连接属性设置为"true".
注意:在连接到AdaptiveServer12.
0及更高版本时,不应将此属性设置为"true".
010SN写入文件权限被拒绝.
文件:_____.
错误消息:_____说明:因VM中的安全冲突,对PROTOCOL_CAPTURE连接属性中指定的文件的写入权限被拒绝.
当一个小程序尝试写入指定文件时,会出现此消息.
操作:如果要通过小程序写入文件,必须确保该小程序可以访问目标文件系统.
010SP无法打开文件进行写入.
文件:_____.
错误消息:_____操作:确保文件名正确无误且文件可写.
010SQ连接或登录被拒绝,正在通过主机/端口地址重试连接.
说明:CONNECTION_FAILOVER连接属性被设置为"true",jConnect无法连接到要连接的服务器列表中的某个数据库服务器.
因此,jConnect现在尝试连接到列表中的下一个服务器.
操作:只要jConnect能连接到另一数据库服务器,就无需任何操作.
不过,您应当确定jConnect为何无法连接到导致连接警告的特定服务器.
SQL状态消息/说明/操作170jConnectforJDBC010TP服务器无法转换该连接的初始字符集_____.
将使用服务器提议的字符集_____,且jConnect执行了转换.
说明:服务器无法使用最初由jConnect请求的字符集,已经用不同的字符集响应.
jConnect接受这一更改并执行必要的字符集转换.
本消息只用来提供信息,无其它影响.
操作:为避免出现此消息,可将CHARSET连接属性设置为服务器支持的字符集.
010TQjConnect无法确定服务器的缺省字符集.
这可能是元数据问题引起的.
请安装jConnect文档中所述的必需表.
该连接缺省采用ascii_7字符集,该字符集只能处理0x00到0x7F之间的字符.
说明:jConnect无法确定服务器的缺省字符集.
当发生这种情况时,只有前127个ASCII码字符能够确保得以正确转换.
因此,这时jConnect恢复到7位ASCII码.
本消息只用来提供信息,无其它影响.
操作:安装jConnect中附带的用于返回元数据的存储过程(请参见《jConnectforJDBC安装指南》第3章中的"安装存储过程).
010UF尝试执行usedatabase命令失败.
错误消息:_____说明:jConnect无法连接到在连接URL中指定的数据库.
两种可能的原因是:URL中输入的名称有误.
USE_METADATA设置为"true"(缺省设置),但未安装用于返回元数据的存储过程.
结果,jConnect尝试对URL中的数据库执行usedatabase命令,但命令失败.
这可能是由于您尝试访问AdaptiveAnywhere数据库.
SQLAnywhere数据库不支持usedatabase命令.
操作:确保URL中的数据库名称正确无误.
确保服务器上安装了用于返回元数据的存储过程(参见jConnectforJDBCInstallationGuide(《jConnectforJDBC安装指南》)的第3章中的"InstallingStoredProcedures"(安装存储过程)和jConnectforJDBCReleaseBulletin(《jConnectforJDBC发行公告》).
若要尝试访问SQLAnywhere数据库,则不要在URL中指定数据库名称,或者将USE_METADATA设置为"false".
010UP忽略无法识别的连接属性_____.
说明:您试图在URL中设置一个jConnect目前无法识别的连接属性.
jConnect将忽略该无法识别的属性.
操作:检查应用程序中的URL定义,确保其只引用有效的jConnect驱动程序连接属性.
0100V正在使用的TDS协议版本过旧.
版本:_____说明:服务器不支持所需TDS协议版本.
jConnect要求5.
0版或更高版本.
操作:使用支持所需TDS版本的服务器.
有关详细信息,请参见jConnect安装指南中的系统要求部分.
01S07AdaptiveServer可能会舍入或截断纳秒值.
说明:遇到一个精度高于1/300秒的时间值.
由于AdaptiveServer不支持如此高的精度,jConnect拒绝了这个值.
操作:确保时间值的精度不高于1/300秒.
SQL状态消息/说明/操作附录BSQL例外与警告消息程序员参考17101S08全局事务中已经征用该连接.
当前本地事务上所有挂起的语句(如果有)都已经回退.
说明:jConnect发出回退命令以清除所有当前本地事务.
如果在调用XAResource.
start()方法后征用全局事务,则会出现这种情况.
操作:如果在调用XAResource.
start()方法之前有本地事务处于活动状态,则需要提交或回退这些本地事务.
01S09该连接中的全局事务处于活动状态时不能使用本地事务方法说明:发出警告,指出正在全局事务中执行本地操作.
对连接调用commit()方法就属于一种本地操作.
其它不能使用的操作有:rollback()、rollback(Savepoint)、setSavepoint()、setSavepoint(String)、releaseSavepoint(Savepoint)和setAutoCommit().
操作:本地操作需要与全局事务分开.
确保先完成所有本地事务及其操作,然后再启动全局事务.
01S10本地事务方法_____不能用在系统12以前的XAConnection中.
说明:您所使用的本地事务方法对SybaseSQLAnywhere12之前的版本无效.
操作:不要使用该方法.
01S11WARNING:数据可能会被截断.
说明:用户指定的流或LOB长度大于ResultSet.
updateXXX方法中的限制(Integer.
MAX_VALUE).
操作:确保长度在限制范围内.
01S12无法继续执行HOMOGENEOUS_BATCH协议,后退到正常批处理.
说明:如果将DYNAMIC_PREPARE设置为false,ASE不会发送参数元数据.
如果HOMOGENEOUS_BATCH设置为true,jConnect需要此信息进行优化.
因此,jConnect会恢复为正常批处理.
操作:仅以预编译的动态SQL预准备语句(将DYNAMIC_PREPARE设置为true)使用优化的批处理(将HOMOGENEOUS_BATCH设置为true).
01S13连接的ASE服务器不支持记录BCP所需要的设置选项"logbulkcopy".
在不进行记录的情况下后退到正常的批量装载与设置ENABLE_BULK_LOAD=BCP相等.
说明:连接的ASE版本不支持带记录功能的批量装载(15.
7ESD#1之前的版本).
因此,jConnect已恢复到正常批处理.
操作:以正确的ASE版本(15.
7ESD#1或更高版本)使用ENABLE_BULK_LOAD=LOG_BCP设置.
01ZZZ口令已过期.
请以新口令设置NEWPASSWORD属性或使用sp_password更改口令.
说明:用于连接ASE的口令已过期.
操作:再次设置口令.
JZ001用户名属性"_____"过长.
最大长度为30.
操作:不要超出30字节的最大长度限制.
JZ002口令属性"_____"过长.
最大长度为30.
操作:不要超出30字节的最大长度限制.
SQL状态消息/说明/操作172jConnectforJDBCJZ003错误的URL格式.
URL:_____操作:检验URL格式.
请参见第26页的"URL连接属性参数".
如果使用的是PROXY连接属性并且该属性的格式有误,则在尝试连接时会产生JZ003例外.
该级联代理的PROXY格式为:ip_address:port_numberTDS贯通服务器小程序的PROXY格式为:http[s]://host:port/tunneling_servlet_aliasJZ004DriverManager.
getConnection(.
.
.
,Properties)中缺少Username属性操作:提供必需的用户属性.
JZ006捕获到IOException:_____说明:从低层检测到意外的I/O错误.
当捕获这种I/O例外时,它们将通过ERR_IO_EXCEPTIONJZ006sqlstate作为SQL例外被再次抛出.
这些错误通常是由网络通信问题引起的.
如果I/O例外导致数据库连接被关闭,则jConnect会将JZ0C1例外链接到JZ006.
客户端应用程序可以查找链中的JZ0C1例外,以查看该连接是否仍然可用.
操作:检查原始I/O异常消息的文本,并从该处继续.
JZ008无效的列索引值_____.
说明:请求的列索引值小于1或大于最大可用值.
操作:检查对getXXX方法的调用和原始查询的文本,或确保调用rs.
next.
JZ009转换时发生错误.
错误消息:_____说明:可能的部分原因有:尝试在两个不兼容的数据类型间进行转换,例如将date转换为int.
试图将包含非数值字符的字符串转换为数值类型.
存在格式错误,例如time/date字符串格式有误.
操作:确保JDBC规范支持尝试进行的类型转换.
确保字符串格式正确无误.
如果字符串包含非数值字符,不要试图将其转换为数值类型.
JZ00A为数值指定的精度和标度无效.
说明:使用setBigDecimal方法时,将BigDecimal值设置为以下几个精度值范围:小于1、负数、小于标度值的精度,或大于127的精度值.
操作:检查查询并予以更正,以指定合法的精度/标度值.
JZ00B数值溢出.
说明:试图将BigInteger作为TDS数值发送,而该值过大;或者试图将Javalong作为int发送,而该值过大.
操作:不能在Sybase中存储这些值.
对于long,请考虑使用Sybase数值类型.
尚无法解决Bignum的问题.
SQL状态消息/说明/操作附录BSQL例外与警告消息程序员参考173JZ00C指定的精度和标度不匹配数值_____.
说明:在使用setBigDecimal方法时,BigDecimal值的精度或标度超出指定范围.
操作:确保指定的精度和标度与BigDecimal值相匹配.
JZ00E视图在已调用setCursorName()的语句中调用execute()或executeUpdate().
操作:不要尝试在已设置游标名称的语句中调用execute或executeUpdate.
请单独使用一条语句删除或更新游标.
有关详细信息,请参见第47页的"对结果集使用游标"JZ00F已通过setCursorName()设置了游标名.
操作:不要为同一语句设置两次游标名称.
关闭当前游标语句的结果集.
JZ00G未为此行更新设置任何列值.
说明:您试图更新一行,但未在该行中更改任何列值.
操作:要更改行中的列值,应在调用updateRow前调用updateXX方法.
JZ00H结果集不可更新.
使用Statement.
setResultSetConcurrencyType().
操作:要将结果集从只读更改为可更新,应使用Statement.
setResultSetConcurrencyType方法或向SQLselect语句添加forupdate子句.
JZ00I无效精度.
指定的精度必须>=0.
说明:标度值必须大于零.
操作:确保标度值非负.
JZ00L登录失败.
检查链接到此例外的SQLWarnings来查找原因.
操作:查看消息文本;根据给出的登录失败原因继续操作.
JZ00M登录超时.
检查数据库服务器是否在指定的主机和端口号上运行.
同时检查可能导致数据库服务器挂起的其它情况(例如tempdb已满).
操作:按照错误消息中提供的建议进行操作.
JZ010无法将Object值非序列化.
错误文本:_____操作:确保数据库中的Java对象实施Serializable接口并位于本地CLASSPATH变量中.
JZ011在分析数值连接属性_____时发生数字格式例外.
说明:为数值连接属性指定了非整数值.
操作:为连接属性指定整数值.
JZ012内部错误.
请将错误报告给Sybase技术支持.
连接属性_____的访问类型有误.
操作:与Sybase技术支持部门联系.
JZ013获取JNDI条目时出错:_____操作:更正JNDIURL,或在目录服务中创建一个新条目.
JZ014您不能运行setTransactionIsolation(Connection.
TRANSACTION_NONE).
这一级别不能进行设置,只能由服务器返回.
操作:检查调用Connection.
setTransactionIsolation的应用程序代码,并检验传递给方法的值.
SQL状态消息/说明/操作174jConnectforJDBCJZ015为GSSMANAGER_CLASS连接属性设置了非法值.
属性值必须是扩展org.
ietf.
jgss.
GSSManager的String或Object.
操作:检查为GSSMANAGER_CLASS属性设置的值.
JZ017保存点无效.
说明:为回退或释放指定的保存点不存在.
操作:检查查询并予以更正,指定存在的保存点.
JZ018无法将此方法应用于此类型的保存点.
说明:getSavepointId()方法不适用于命名保存点(没有ID),getSavepointName()方法不适用于未命名保存点(没有名称).
操作:检查查询并予以更正.
JZ019获取SERVERNAME时出错:_____.
说明:用jdbc:sybase:jndi:file设置的URL未指定sql.
ini文件(Windows)或interfaces文件(UNIX)或者服务器名.
操作:检查URL命令并予以更正.
JZ021未找到指定的_____文件.
说明:未找到在连接URL中指定的sql.
ini文件(Windows)或interfaces文件(UNIX).
操作:检查连接URL并予以更正.
JZ022指定的_____文件格式未知.
说明:sql.
ini文件(Windows)或interfaces文件(UNIX)中的连接URL字符串格式不正确.
操作:检查连接URL字符串并予以更正.
JZ024指定服务器:_____在interfaces/sql.
ini文件中没有条目:_____.
说明:在连接URL中指定的服务器名在sql.
ini文件(Windows)或interfaces文件(UNIX)中没有对应条目.
操作:检查连接URL字符串并予以更正.
JZ025interfaces/sql.
ini中指定服务器的TLI格式无效.
说明:TLI格式interfaces文件(UNIX)中的服务器详细信息不正确.
操作:检查设置并予以更正.
JZ026interfaces/sql.
ini文件:_____中服务器:_____的指定协议:_____不受支持.
说明:在sql.
ini文件(Windows)或interfaces文件(UNIX)中指定的协议不受支持(tli、tcp和nlwnsck以外的协议).
操作:仅指定受支持的协议.
JZ027interfaces/sql.
ini文件:_____中服务器:_____的指定SECMECH条目:_____不受支持.
说明:在Kerberos连接URL中指定的值无效.
操作:检查URL并予以更正.
SQL状态消息/说明/操作附录BSQL例外与警告消息程序员参考175JZ028为JCE_PROVIDER_CLASS连接属性设置的值非法.
属性值必须是作为字符串或java.
security.
Provider实例传递的完全限定的提供程序类名称.
操作:指定合法值.
JZ029查找ALTERNATE_SERVER_NAME的地址时出错.
说明:jConnect无法使用SQLAnywhereUDP发现协议查找以ALTERNATE_SERVER_NAME属性指定的服务器.
操作:检查以ALTERNATE_SERVER_NAME连接属性指定的服务器名并予以更正.
JZ030方法_____不受支持.
说明:您所使用的公共API目前不受支持.
JZ031打开_____的对象失败.
说明:jConnect无法打开自定义类的对象,因为该自定义类不在类路径中.
操作:将类添加到类路径中.
JZ032Date或Timestamp参数超出BigDateTime/BigTime范围.
服务器只能支持0001/01/0112:00:00:000000AM到9999/12/3111:59:59.
999999PM之间的BigDateTime值或12:00:00:000000AM到11:59:59.
999999PM之间的BigTime值.
操作:参见消息文本.
JZ033服务器返回未知的Blob类型.
说明:jConnect无法将列的ASE数据类型映射到BLOB数据类型.
操作:确保ASE列可以转换为BLOB数据类型.
JZ034连接的服务器无法处理大对象[LOB].
说明:连接的ASE版本不支持LOB方法.
操作:使用常规流方法访问LOB.
JZ035要处理大对象[LOB],请将连接属性"ENABLE_LOB_LOCATOR"设置为true.
操作:参见消息文本.
JZ036对此大对象[LOB]的引用在数据库中不再有效.
检查是否调用了free()或检查事务是否已结束.
操作:参见消息文本.
JZ037offset/position/start的值应该在[1,len]的范围内,其中len表示大对象[LOB]的长度.
操作:参见消息文本.
JZ038对象长度应>=0.
说明:在操作(getBytes、truncate、getSubString)中对LOB对象指定的大小为负操作:仅指定非负值.
SQL状态消息/说明/操作176jConnectforJDBCJZ040_____操作失败.
_____已关闭.
说明:读取(写入)操作失败,因为输入流或LOB读取程序(输出流或LOB写入程序)已关闭.
操作:检查应用程序找出冲突原因并予以更正.
JZ041_____操作在_____上失败.
说明:read(write)(available())操作失败,因为输入流或读取程序(输出流或写入程序)(输入流)已关闭.
操作:检查应用程序找出冲突原因并予以更正.
JZ042如果ENABLE_LOB_LOCATOR和HOMOGENEOUS_BATCH设置为TRUE,大对象setter与其它setter便不能混合.
java.
sql.
Types_____已和java.
sql.
Types_____混合.
操作:参见消息文本.
JZ043对于"ENABLE_BULK_LOAD属性"的任何可能变体,LOB对象均不受支持,而为false.
请考虑使用其它setterAPI插入数据.
操作:参见消息文本.
JZ044在SEND_BATCHPARAMS_IMMEDIATE设置为TRUE的情况下,无法在批处理中创建服务器端的定位符.
尝试使用客户端的LOB或将SEND_BATCHPARAMS_IMMEDIATE设置为FALSE.
操作:参见消息文本.
JZ0BD方法参数中使用了越界值或无效值.
操作:检验方法中的参数值是否正确无误.
JZ0BI消息:setFetchSize:获取大小应该在以下范围内设置:00.
操作:参见消息文本.
JZ0BP批处理更新语句中不允许使用输出参数.
操作:检查应用程序代码,并确保未尝试在批处理中声明输出参数.
JZ0BR游标所在的行不支持_____方法.
说明:尝试调用的ResultSet方法对当前行位置无效(例如,调用insertRow时游标不在插入行上).
操作:不要调用对当前行位置无效的ResultSet方法.
JZ0BS不支持批处理语句.
操作:在数据库中通过最新版本安装或更新jConnect元数据存储过程.
JZ0BT_____类型的ResultSet不支持_____方法.
说明:您尝试调用的ResultSet方法对此类型的ResultSet无效.
操作:不要尝试调用对ResultSet类型无效的ResultSet方法.
SQL状态消息/说明/操作附录BSQL例外与警告消息程序员参考177JZ0C0连接已关闭.
说明:应用程序已对此连接对象调用Connection.
close,无法再使用此连接.
操作:修正代码,在连接关闭时清空连接对象引用.
JZ0C1出现IOException,此错误将使连接关闭.
说明:出现了不可恢复的IOException例外,连接已被关闭.
该连接不能再用于其它任何数据库操作.
如果出现此例外,则它总会与JZ006例外一起出现在一个例外链中(前面解释过).
操作:确定导致连接中断的IOException的起因.
JZ0CL在使用PRELOAD_JARS属性时必须定义CLASS_LOADER属性.
操作:在将PRELOAD_JARS设置为非空值时,请务必指定一个CLASS_LOADER.
JZ0D4SybaseJDBCURL_____中无法识别的协议.
说明:您使用非TDS协议指定了连接URL,但目前jConnect只支持TDS协议.
操作:检查URL定义.
如果URL指定TDS作为子协议,请确保该条目使用以下格式和大小写形式:jdbc:sybase:Tds:host:port如果URL指定JNDI作为子协议,请确保它的开头为:jdbc:sybase:jndi:JZ0D5装载协议_____时出错.
操作:检查CLASSPATH系统变量的设置.
JZ0D6setVersion中指定了无法识别的版本号_____.
选择SybDriver.
VERSION_*值之一,并确保所用jConnect版本等于或高于指定的版本.
操作:参见消息文本.
JZ0D7装载url提供程序_____时出错.
错误消息:_____操作:检查JNDIURL,确保其正确无误.
JZ0D8初始化URL提供程序时出错:_____操作:检查JNDIURL,确保其正确无误.
JZ0EM数据结束.
操作:请向Sybase技术支持部门报告此错误.
JZ0F1请求了Sybase高可用性故障切换连接,但协同服务器地址丢失.
说明:将REQUEST_HA_SESSION连接属性设置为"true"时,必须同时指定故障切换服务器.
操作:可以用SECONDARY_SERVER_HOSTPORT连接属性指定辅助服务器,或者用JNDI设置辅助服务器(请参见第40页的"实施高可用性故障切换支持").
SQL状态消息/说明/操作178jConnectforJDBCJZ0F2已发生Sybase高可用性故障切换.
当前事务已中止,但连接仍可用.
请重试事务.
说明:之前连接的后端数据库服务器已关闭,但您已经切换到一个辅助服务器.
数据库连接仍可用.
操作:客户端代码应捕获这一例外,再从上次提交点重新启动事务.
如果正确处理了此例外,就可以对同一连接对象继续执行JDBC调用.
JZ0FP为参数____传递的值不正确说明:为当前结果集的状态指定的参数值无效.
操作:确保指定合法的有效值(CLOSE_CURRENT_RESULT、KEEP_CURRENT_RESULT、CLOSE_ALL_RESULTS).
JZ0GC将____作为GSSManager转换时出错.
请检查设置给GSSMANAGER_CLASS连接属性的值.
该值必须为一个String,它要指定GSSManager实现的完全限定的类名称.
或者必须是一个扩展org.
ietf.
jgss.
GSSManager的Object.
操作:参见消息文本.
JZ0GK_____阵列不得为空值,且必须仅包含一个键.
说明:自动生成的键列名/索引阵列为NULL或含有多个键.
在阵列中只允许使用一个键,因为它与IDENTITY列相关.
操作:检查查询并予以更正.
JZ0GN将类___作为GSSManager例示时出错.
例外是____.
请检查CLASSPATH并确保GSSMANAGER_CLASS属性值引用了GSSManager实现的完全限定类名称.
操作:确保CLASSPATH环境变量包含第三方GSSManager实现所需的所有.
jar文件.
JZ0GS出现通用安全服务API例外.
主要错误代码为___.
主要错误消息为___.
次要错误代码为___.
次要错误消息为____.
操作:检查主要和次要错误代码及错误消息.
检查Kerberos配置.
有关详细信息,请参见第3章"安全性".
JZ0H0无法启动事件处理程序的线程;事件名称=_____.
操作:请向Sybase技术支持部门报告此错误.
JZ0H1收到事件通知但没有找到事件处理程序;事件名称=_____.
操作:请向Sybase技术支持部门报告此错误.
JZ0HC分析十六进制数时遇到非法字符"_____".
说明:用于表示二进制值的字符串包含了十六进制数限定范围(0–9、a–f)以外的字符.
操作:检查字符串中的字符值,确保它们在要求的范围内.
JZ0I3未知属性.
此消息表明存在内部产品问题.
请向Sybase技术支持部门报告此错误.
操作:表明存在内部产品问题.
请向Sybase技术支持部门报告此错误.
JZ0I5指定了无法识别的CHARSET属性:_____.
说明:您为CHARSET连接属性指定了一个不受支持的字符集编码.
操作:为该连接属性输入有效的字符集代码.
请参见第35页的"jConnect字符集转换程序".
SQL状态消息/说明/操作附录BSQL例外与警告消息程序员参考179JZ0I6将UNICODE转换为服务器使用的字符集时出错.
错误消息:_____操作:在jConnect客户端为CHARSET连接属性选择另外的字符集代码,所选字符集代码应支持要发送到服务器的所有字符.
可能也需要在服务器上安装另一个字符集.
此外,如果您使用的是jConnect6.
05或更高版本以及AdaptiveServerEnterprise12.
5或更高版本,则可以在向服务器发送数据时使用unichar/univarchar数据类型.
请参见第33页的"使用jConnect传递Unicode数据".
JZ0I7代理网关没有响应.
说明:无法建立连接,因为以PROXY连接属性指定的代理网关无响应.
操作:检查PROXY设置并予以更正.
JZ0I8代理网关连接被拒绝.
网关响应:%1s.
说明:代理网关连接因指定原因被拒绝.
操作:检查代理网关设置.
JZ0I9此InputStream已关闭.
说明:您试图读取一个来自getAsciiStream、getUnicodeStream或getBinaryStream的InputStream,但该InputStream已关闭.
该流被关闭的原因可能是您移到了另一列或取消了结果集,且没有足够的资源来缓存数据.
操作:增加高速缓存大小,或按顺序读取列.
JZ0IA试图发送_____时出现截断错误.
说明:在发送字符串之前进行字符集转换时发生截断错误.
被转换的字符串的长度超过了分配给它的大小.
操作:在jConnect客户端为CHARSET连接属性选择其它字符集代码,所选字符集代码应支持要发送到服务器的所有字符.
可能也需要在服务器上安装另一个字符集.
JZ0IB服务器的_____缺省字符集不能映射到客户端Java环境中的可用编码.
由于jConnect无法进行客户端转换,因此连接无法使用,正在关闭.
尝试使用较新的Java版本,或尝试在类路径中包含Java安装的i18n.
jar或charsets.
jar文件.
操作:参见消息文本.
JZ0IR不能对已通过java.
io.
Reader在结果集中更新过的列调用getXXX.
操作:删除对使用Reader更新过的ResultSet列的getXXX调用.
JZ0IS不能对已在结果集中更新过的列调用getXXXStream.
说明:更新结果集中的一个列之后,您试图用以下SybResultSet方法之一读取更新后的列值:getAsciiStream、getUnicodeStream、getBinaryStream.
jConnect不支持这种用法.
操作:不要试图从正在更新的列中获取输入流.
JZ0J0偏移和/或长度值超出了实际的文本/图像长度.
操作:检查所用的偏移和/或长度值是否正确无误.
JZ0LA实例化Cipher对象失败.
所装载的任何JCE提供程序均不实施转换%1s.
说明:以JCE_PROVIDER_CLASS连接属性指定的JCE提供程序的实施不在类路径中.
操作:确保实施位于类路径中.
SQL状态消息/说明/操作180jConnectforJDBCJZ0LC不能对正在使用语言游标读取行的ResultSet调用____方法.
尝试将LANGUAGE_CURSOR连接属性设置为false.
说明:应用程序试图对一个通过语言游标创建的ResultSet调用某种ResultSet游标滚动方法.
操作:参见错误消息.
JZ0MDResultSet元数据不可用.
说明:J2EE_TCK_COMPLIANT属性已设置,但结果集元数据不可用.
操作:安装元数据存储过程.
JZ0NCwasNull调用前没有其它调用来获取列.
说明:只能在获取列的调用(例如getInt或者getBinaryStream)后调用wasNull.
操作:更改代码,移动对wasNull的调用.
JZ0NE错误的URL格式.
URL:_____.
错误消息:_____操作:检查URL的格式.
确保端口号仅包含数值字符.
JZ0NF无法装载SybSocketFactory.
确保类名称拼写无误,软件包被完全指定,类在类路径中可用,而且有公共的零参数构造函数.
操作:参见消息文本.
JZ0NK生成的键不可用,因为使用了Statement.
NO_GENERATED_KEYS或者未自动生成任何键.
说明:getGeneratedKeys()方法无法返回自动生成的键,因为语句是通过.
NO_GENERATED_KEYS执行的或者该语句未产生自动生成的键.
操作:仅对以.
RETURN_GENERATED_KEYS执行的语句或应该自动生成键的语句使用getGeneratedKeys().
JZ0NS方法____不受支持,不应调用.
操作:参见消息文本.
JZ0P1异常的结果类型.
说明:数据库返回的结果不能由语句返回给应用程序,或者应用程序此时需要的不是该结果.
通常这表明应用程序在错误地使用JDBC执行查询或存储过程.
如果JDBC应用程序连接到一个OpenServer应用程序,这可能表明该OpenServer应用程序中有错误,该错误导致OpenServer发送异常结果序列.
操作:使用com.
sybase.
utils.
Debug(true,"ALL")调试工具,尝试确定异常结果及其发生原因.
JZ0P4协议错误.
此消息表明存在内部产品问题.
请向Sybase技术支持部门报告此错误.
操作:参见消息文本.
SQL状态消息/说明/操作附录BSQL例外与警告消息程序员参考181JZ0P7没有对列进行高速缓存;请使用RE-READABLE_COLUMNS属性.
说明:当REPEAT_READ连接属性设置为"false"时,尝试再次读取列或以错误顺序读取列.
当REPEAT_READ为"false"时,只能读取一次某行的列值,且必须按列索引升序顺序读取.
例如,在读取一行的第3列后,就不能再次读取该列的值,也不能读取该行第2列.
操作:将REPEAT_READ设置为"true",或者不要试图重新读取某列值并确保按列索引升序顺序读取列.
JZ0P8请求的RSMDA列类型名称未知.
说明:jConnect无法在ResultSetMetaData.
getColumnTypeName方法中确定列类型的名称.
操作:确保数据库具有用于元数据的最新存储过程.
JZ0P9检测到COMPUTEBY查询.
该类型的结果不受支持,已被取消.
说明:执行的查询返回的COMPUTE结果不受jConnect支持.
操作:更改查询或存储过程,使其不使用COMPUTEBY.
JZ0PA查询已被取消,相同的响应被放弃.
说明:可能有连接中的另一语句执行了取消操作.
操作:检查各语句中的SQL例外和警告链,以找出原因.
JZ0PB服务器不支持请求的操作.
说明:当jConnect建立与服务器的连接时,它会将需要服务器支持的功能通知服务器,服务器再将自身支持的功能通知jConnect.
当应用程序请求的操作在最初的功能协商中被拒绝时,会发出此错误消息.
例如,如果数据库不支持动态SQL语句预编译,而代码调用SybConnection.
prepareStatement(sql_stmt,dynamic),并且dynamic设置为"true",那么jConnect将生成此消息.
操作:修改代码,使其不请求不受支持的功能.
JZ0PC查询中参数的数量和大小要求宽表支持.
但是服务器不提供这种支持,或者查询请求不是在登录序列中发出的.
如果想请求宽表支持,请尝试将JCONNECT_VERSION属性设置为>=6.
说明:您正试图执行一个拥有大量参数的语句,但服务器没有进行相应配置来处理如此之多的参数.
能引起此例外的参数数量因传送的数据类型不同而变化.
在传送481或更少的参数时,肯定不会产生这种例外.
操作:必须在AdaptiveServer12.
5或更高版本服务器中运行此查询.
在连接到数据库时,请将JCONNECT_VERSION属性设置为"6".
SQL状态消息/说明/操作182jConnectforJDBCJZ0PD动态准备中的查询过大,需要宽表支持.
但是服务器不提供这种支持,或者查询请求不是在登录序列中发出的.
如果想请求宽表支持,请尝试将JCONNECT_VERSION属性设置为>=6.
说明:您正试图执行一个拥有大量参数的动态预准备语句,但服务器没有进行相应配置来处理如此之多的参数.
操作:必须在AdaptiveServer12.
5或更高版本服务器中运行此查询.
在连接到数据库时,请将JCONNECT_VERSION属性设置为"6".
JZ0PE游标声明中列的数目过大,或者游标声明本身过大,需要宽表支持.
但是服务器不提供这种支持,或者查询请求不是在登录序列中发出的.
如果想请求宽表支持,请尝试将JCONNECT_VERSION属性设置为>=6.
说明:当SELECT语句试图从255个以上的列中返回数据时会出现此错误.
或者SELECT语句的实际长度很大时(超过大约65500个字符)也会出现此错误.
操作:必须在AdaptiveServer12.
5或更高版本中运行此查询.
在连接到数据库时,请将JCONNECT_VERSION属性设置为"6".
JZ0PN指定的端口号____超出范围.
端口号必须满足以下条件:0<=端口号<=65535.
操作:检查数据库URL中指定的端口号.
JZ0R0结果集已关闭.
说明:已对结果集对象调用ResultSet.
close方法,该结果集不能另作他用.
操作:修正代码,从而在每当关闭结果集时将ResultSet对象引用设置为null.
JZ0R1结果集处于IDLE状态,因为目前没有访问行.
说明:应用程序调用了ResultSet.
getXXX列数据检索方法之一,但没有当前行;应用程序没有调用ResultSet.
next,或ResultSet.
next返回"false",指示没有数据存在.
操作:确保先将rs.
next设置为"true"后再调用rs.
getXXX.
JZ0R2查询的结果集不存在.
说明:您使用了Statement.
executeQuery,但语句没有返回任何行.
操作:对未返回任何行的语句使用executeUpdate.
JZ0R3列处于DEAD状态.
这是内部错误.
请将错误报告给Sybase技术支持.
操作:参见消息文本.
JZ0R4列中不含文本指针.
该列不是文本/图像列,或该列为NULL.
说明:不能更新值为null的text/image列.
空text/image列中不含文本指针.
操作:确保不要试图更新或获取指向不支持文本/图像数据的列的文本指针.
确保不要更新值为null的text/image列.
先插入数据,再进行更新.
JZ0R5ResultSet当前的定位超出了最后一行.
此状态下不能通过执行get*操作读取数据.
说明:应用程序已将ResultSet行指针移到最后一行之后.
该位置没有数据可读,所有get*操作均为非法.
操作:更改代码,使其在ResultSet定位在最后一行之后时不再读取列数据.
SQL状态消息/说明/操作附录BSQL例外与警告消息程序员参考183JZ0RD不能对已通过deleteRow()方法删除的行调用任何ResultSet.
get*方法.
说明:应用程序试图从已经删除的行中检索数据.
没有有效数据可供检索.
操作:更改代码,使应用程序不从已删除的行中检索数据.
JZ0RM不能在调用updateRow或deleteRow之后调用refreshRow.
说明:在用SybCursorResult.
updateRow更新数据库中的行之后,或用SybCursorResult.
deleteRow删除行之后,又用SybCursorResult.
refreshRow刷新了数据库中的行.
操作:在更新或删除数据库中的行以后,不要再刷新该行.
JZ0S0语句状态机:语句处于BUSY状态.
说明:出现此错误的唯一情况是在使用Statement.
setCursorname方法时.
如果应用程序试图在语句已在使用中且需要读取非游标结果时设置游标名称,则会出现此错误.
操作:在用语句执行任何查询之前先为其设置游标名称,或者在设置游标名称之前调用Statement.
cancel,以确保该语句不处于繁忙状态.
JZ0S1语句状态机:正试图在IDLE语句中执行FETCH.
说明:语句中发生内部错误.
操作:关闭该语句,打开另一个语句.
JZ0S2语句对象已关闭.
说明:已对语句对象调用Statement.
close方法,该语句不能另作他用.
操作:修正应用程序,从而每当关闭语句时都将语句对象引用设置为null.
JZ0S3此子类中不能使用继承的方法_____.
说明:PreparedStatement不支持executeQuery(String)°executeUpdate(String)和execute(String).
操作:要传递查询字符串,应使用Statement而非PreparedStatement.
JZ0S4不能执行空(零长度)查询.
操作:不要执行空查询("").
JZ0S5该连接中的全局事务处于活动状态时不能使用本地事务方法____.
说明:使用分布式事务时可能会出现该例外.
操作:有关诊断此问题的详细信息,请参见JDBC2.
0OptionalPackage(《JDBC2.
0选件工具包》)(旧称JDBC2.
0StandardExtensionAPI(《JDBC2.
0标准扩展API》))中的第7章"DistributedTransactions"(分布式事务).
JZ0S6本地事务方法_____不能用在系统12以前的XAConnection中.
说明:使用分布式事务时可能会出现该例外.
操作:有关诊断此问题的详细信息,请参见JDBC2.
0OptionalPackage(《JDBC2.
0选件工具包》)(旧称JDBC2.
0StandardExtensionAPI(《JDBC2.
0标准扩展API》))中的第7章"DistributedTransactions"(分布式事务).
JZ0S8SQL查询中的转义序列格式有误:说明:此错误由错误的转义语法引起.
操作:检查JDBC文档的语法是否正确.
SQL状态消息/说明/操作184jConnectforJDBCJZ0S9不能执行空(零长度)查询.
操作:不要执行空查询("").
JZ0SA预准备语句:未设置输入参数,索引:_____.
操作:确保为每个输入参数赋值.
JZ0SB参数索引超出范围:_____.
说明:您尝试获取、设置或注册一个参数,但参数数目已经超越了最大数目限制.
操作:检查查询中的参数数量.
JZ0SC可调用语句:尝试将返回状态设置为InParameter.
说明:您已经准备调用一个用于返回状态的存储过程,但却试图设置参数1,该参数是返回状态.
操作:此类调用中可供设置的参数是从2开始的.
JZ0SD未为输出参数找到注册的参数.
说明:这表明应用程序存在逻辑错误.
您尝试对参数调用getXXX或wasNull,但尚未读取任何参数,或没有输出参数.
操作:检查以确保应用程序已经对CallableStatement注册了输出参数,且语句已被执行,同时输出参数已读取.
JZ0SE为setObject()指定了无效的对象类型.
说明:向PreparedStatement.
setObject传递了非法类型参数.
操作:检查JDBC文档.
参数必须是来自java.
sql.
Types的一个常数.
JZ0SF未找到任何参数.
是否已发送查询说明:您试图对不含参数的语句设置参数.
操作:在设置参数前确保查询已发送.
JZ0SGRPC未返回与应用程序注册的参数相同数量的输出参数.
说明:如果通过调用CallableStatement.
registerOutParam注册的参数多于在存储过程中声明为"OUTPUT"的参数,则会出现此错误.
有关详细信息,请参见第133页的"RPC返回比已注册参数少的输出参数".
操作:检查存储过程和registerOutParameter调用.
确保已将所有相应参数声明为"OUTPUT".
注意内容如下的代码行:createprocedureyourproc(@p1intOUTPUT,.
.
.
注释如果在使用SQLAnywhere时出现此错误,请升级到SQLAnywhere版本5.
5.
04.
JZ0SH使用了静态函数转义,但此服务器上找不到元数据访问程序信息.
操作:在使用静态函数转义之前,先安装元数据访问程序信息.
JZ0SI此服务器不支持使用的静态函数转义_____.
操作:不要使用此转义.
JZ0SJ找不到有关此数据库的元数据访问程序信息.
操作:在进行元数据调用前,先安装元数据信息.
SQL状态消息/说明/操作附录BSQL例外与警告消息程序员参考185JZ0SK此类数据库服务器不支持oj转义.
解决方法:使用服务器特定的外部连接语法(如果支持).
查阅服务器文档.
操作:读取错误消息.
同时,请安装最新版本的jConnect元数据.
JZ0SL不支持的SQL类型_____.
说明:jConnect不支持应用程序声明的参数类型.
操作:若有可能,尝试用其它类型声明该参数.
不要使用Types.
NULL或PreparedStatement.
setObject(null).
JZ0SMjConnect未能执行存储过程,因为发送参数时发生了错误.
导致此问题的原因可能是服务器不支持特定的数据类型,或者jConnect未在连接时为该数据类型请求支持.
可以尝试将JCONNECT_VERSION连接属性设置为更高的值.
或者,若有可能,尝试以语言语句的形式发送过程执行指令.
JZ0SNsetMaxFieldSize:字段长度不能为负.
操作:在调用setMaxFieldSize时使用正值或零(无限制).
JZ0SO无效的ResultSet并发类型:_____.
操作:确保声明的并发为ResultSet.
CONCUR_READ_ONLY或ResultSet.
CONCUR_UPDATABLE.
JZ0SP无效的ResultSet类型:_____.
操作:检查声明的ResultSet类型是否为ResultSet.
TYPE_FORWARD_ONLY或ResultSet.
TYPE_SCROLL_INSENSITIVE.
jConnect不支持ResultSet.
TYPE_SCROLL_SENSITIVEResultSet类型.
JZ0SQ无效的UDT类型_____.
说明:在调用DatabaseMetaData.
getUDTs方法时,如果用户定义的类型不是Types.
JAVA_OBJECT、Types.
STRUCT或Types.
DISTINCT,jConnect便会抛出此异常.
操作:使用上述三种UDT之一.
JZ0SRsetMaxRows:最大行数不能为负.
操作:在调用setMaxRows时使用正值或零(无限制).
JZ0SSsetQueryTimeout:查询超时时间不能为负.
JZ0STjConnect不能在查询中以文字参数的形式发送Java对象.
执行此查询时,请确保数据库服务器支持Java对象,且LITERAL_PARAMS连接属性设置为false.
JZ0SUDate或Timestamp参数设置成______年,但服务器只支持_____至_______之间的年份值.
如果在AdaptiveServerAnywhere上将数据发往日期、时间戳列或参数,最好以字符串的形式发送,让服务器进行转换.
说明:AdaptiveServerEnterprise和SQLAnywhere对datetime和date的取值范围有不同的规定.
datetime值必须大于等于1753,而date数据类型可以采用大于等于1的年份值.
操作:确保发送的date/timestamp值在可接受的范围内.
JZ0SV不允许在同一个CallableStatement中同时按名称和索引设置参数.
说明:CallableStatement拥有按名称和索引(顺序位置)指定的两种参数.
混合使用无效.
操作:仅按名称或仅按索引(顺序位置)指定参数.
SQL状态消息/说明/操作186jConnectforJDBCJZ0SWResultSet可保持性类型无效:_____.
说明:您以setHoldability()方法指定的值无效.
操作:仅使用合法值–HOLD_CURSORS_OVER_COMMIT或CLOSE_CURSORS_AT_COMMIT.
JZ0T2监听器线程读错误.
操作:检查网络通信.
JZ0T3读操作超时.
说明:超出了为读取查询响应所分配的时限.
操作:调用Statement.
setQueryTimeout增大超时期限.
JZ0T4写操作超时.
超时期限(毫秒):_____.
说明:超出了为发送请求所分配的时限.
操作:调用Statement.
setQueryTimeout增大超时期限.
JZ0T5用于存储响应的高速缓存已满.
操作:为STREAM_CACHE_SIZE连接属性使用缺省值或更大的值.
JZ0T6读取贯通TDSURL时出错.
说明:读取URL标头时贯通协议失败.
操作:检查为连接定义的URL.
JZ0T7监听器线程读错误--捕获ThreadDeath.
检查网络连接.
操作:检查网络连接,尝试重新运行应用程序.
如果线程仍被中止,请联系Sybase技术支持.
JZ0T8收到未知请求的数据.
请向Sybase技术支持部门报告此错误.
JZ0T9发送请求不同步.
请向Sybase技术支持部门报告此错误.
操作:参见消息文本.
JZ0TC尝试在两种类型间进行非法转换.
说明:在Java类型和SQL类型间进行的转换失败.
操作:检查请求的类型转换,确保JDBC规范支持该转换.
JZ0TD捕获ThreadDeath.
说明:在jConnect执行定时IO操作时,调用的应用程序线程被注销.
操作:检查应用程序代码找出冲突并予以更正.
JZ0TE尝试在两种类型间进行非法转换.
有效的数据库类型为:说明:数据库列的数据类型和ResultSet.
getXXX调用中请求的数据类型不能进行隐式转换.
操作:使用错误消息中列出的有效数据类型之一.
JZ0TIjConnect无法在数据库类型和请求的类型间进行有意义的转换.
说明:例如,应用程序试图对从数据库返回的time值调用ResultSet.
getObject(int,Types.
DATE)时,可能会发生这种异常.
操作:确保数据库的数据类型能隐式转换成要检索的对象类型.
SQL状态消息/说明/操作附录BSQL例外与警告消息程序员参考187JZ0TO读操作超时.
说明:如果套接字读取超时,则会发生此异常.
操作:调用Statement.
setQueryTimeout增大超时期限.
同时,检查正在执行的查询或存储过程以确定超时原因.
JZ0TS试图发送_____时出现截断错误.
说明:应用程序指定的字符串的长度大于应用程序要发送的字符串长度.
因此,字符串被截断为声明的长度.
操作:正确设置长度以避免发生截断.
JZ0US设置了SybSocketFactory连接属性,PROXY连接属性被设置为服务器小程序的URL.
jConnect驱动程序不支持这种组合.
如果想从在浏览器内运行的小程序中发送安全HTTP,请使用以"https://"开头的代理URL.
操作:参见消息文本.
JZ0XC是无法识别的事务协调器类型.
说明:元数据信息指示服务器支持分布式事务,但jConnect不支持所用的协议.
操作:检验是否安装了最新的元数据脚本.
如果此错误仍然存在,请联系Sybase技术支持.
JZ0XS服务器不支持XA类型的事务.
请确保事务功能已在服务器上启用并得到许可.
说明:jConnect尝试连接的服务器不支持分布式事务.
操作:不要为此服务器使用XADataSource,或者对服务器进行升级或配置以使其支持分布式事务.
JZ0XU当前用户无权执行XA类型的事务.
确保用户具有_______角色.
说明:连接到数据库的用户无权执行分布式事务,最可能的原因是该用户不具备适当的角色(空白处显示的角色).
操作:按错误消息中的提示授予用户相应的角色,或让具有该角色的另一用户执行此事务.
JZBK1SybBCP类未初始化,请重新运行MDAsql更新MDA存储过程.
操作:安装MDA存储过程.
JZBK3批量装载表不存在.
说明:以BCP指定的表不在数据库中.
操作:更正表名.
JZBK4在bcp/arrayinsert模式下的批处理中使用sql语句属非法操作.
说明:在批处理操作过程中,尝试执行一项非批处理操作.
操作:等待批处理操作完成后再尝试执行非批处理操作.
JZBK5在bcp模式下运行批量装载时,应将autocommit设置为true.
操作:参见消息文本.
JZBK6必须使用ASE15.
7及更高版本同时启用"allowwidedolrows"数据库选项,才能插入偏移量大于8191的行.
操作:参见消息文本.
SQL状态消息/说明/操作188jConnectforJDBCJZBK7插入数据失败.
数据总大小(_____字节)超过表_____允许使用的最大行大小(_____字节).
操作:参见消息文本.
JZBKI为属性ENABLE_BULK_LOAD设置的值无效.
操作:将ENABLE_BULK_LOAD设置为以下有效值之一–ARRAYINSERT_WITH_MIXED_STATEMENTS、ARRAYINSERT、BCP或LOG_BCP.
JZNNA列不允许使用空值.
说明:您尝试在预准备语句中使用setNull()将位类型列设置为NULL值.
操作:检查查询并予以更正,将位类型列的值设置为0或1.
S0022无效的列名称"_____".
说明:您试图通过名称引用列,但不存在与该名称对应的列.
操作:检查列名的拼写是否正确.
ZZ00A方法_____尚未完成,不应调用它.
说明:您试图使用未实现的方法.
操作:查阅您的jConnect版本附带的发行公告以获取更多信息.
也可以访问jConnectWebpage(http://www.
sybase.
com),查看是否有最新版本的jConnect实现了该方法.
如果没有,请不要使用该方法.
SQL状态消息/说明/操作程序员参考189词汇表JDBCJava数据库连接(JDBC)是允许Java程序执行SQL语句的JavaAPI.
jConnect驱动程序JDBC驱动程序,用于Sybase服务器,例如使用TabularDataStream(TDS)通信协议的AdaptiveServerEnterprise.
J2EE服务器Sun公司的Java2平台企业版(J2EE)是一种独立于平台的以Java为中心的环境,用于在线开发、构建和部署基于Web的企业应用程序.
TabularDataStream(TDS)TabularDataStream(TDS)是描述两台计算机之间数据传输的应用程序级协议.
TDS定义可发送的消息类型以及发送消息的顺序.
TDS依赖于面向连接的传输服务.
分布式事务管理支持(JTA/JTS)JavaTransactionService(JTS)指定如何实现一个支持JavaTransactionAPI(JTA)并在API以下级别实现对象管理组织对象事务服务1.
1规范的Java映射的事务管理器.
JavaTransactionAPI(JTA)是允许应用程序和J2EE服务器访问事务的API.
SSL安全套接字层(SSL)是管理Internet上消息传输安全性的常用协议.
Java命名和目录接口(JNDI)Java命名和目录接口(JNDI)使基于Java平台的应用程序能够访问多个命名和目录服务.
JNDI是来自Oracle的API,用于将Java程序连接到命名和目录服务(如DNS、LDAP和NDS).
轻量目录访问协议(LDAP)轻量目录访问协议(LDAP)是一套软件协议,能让任何人在网络(无论是公共Internet还是在公司内部网)中找到组织、个人及其它资源(如文件和设备).
对象标识符(OID)对象标识符(OID)是用于命名对象的标识符.
从结构上说,OID由按层级分配的命名空间中的节点构成.
Java虚拟机(JVM)Java虚拟机(JVM)是提供独立于平台的执行环境的虚拟机,在此环境中可将Java字节码转换为计算机语言并将其执行.
词汇表190jConnectforJDBCASCII美国信息交换标准代码(ASCII)是以数字形式表示英文字符的代码,每个字母分配一个从0到127的数字.
例如,表示大写M的ASCII代码为77.
大多数计算机都使用ASCII代码表示文本,以实现在计算机之间传输数据.
JDKJava开发工具包(JDK)是用于制作Java程序的软件开发工具包(SDK).
UCS-2通用字符集是用于对字符集进行编码的ISO/IEC格式.
ISO/IEC10646过去与Unicode同步;但Unicode现在添加了一些其它约束,所以符合10646并不保证兼容Unicode.
UTF-16Unicode转换格式16(UTF-16)是Unicode编码系统中的一种双字节格式.
相对区分名(RDN)相对区分名(RDN)是区分名的一个组成部分.
它包含一个或多个名值对,其中名称和值由等号分隔(例如RDN为"uid=ann"时,名称为"uid",值为"ann"),如果存在多个名值对,则应以加号将其分隔(例如RDN为"cn=JonDoe+employeeNumber=12345"时,名值对为"cn=JohnDoe"和"employeeNumber=12345").
实际上,包含多个名值对的RDN(称为"多值RDN")很少见,但是在条目中不存在唯一属性或要确保条目的DN包含一些有用的标识信息时,这种RDN非常有用.
区分名(DN)区分名(DN)是在目录服务器中唯一标识某个条目的字符串.
它包含多个(或不包含)相对区分名(RDN)组成部分,此部分标识目录信息树(DIT)中条目的位置.
可将条目的区分名视为文件系统中绝对路径的一种类似物,因为它指定名称和层级位置.
JavaCryptographyExtension(JCE)JavaCryptographyExtension(JCE)是为实现Java安全功能提供统一框架的API.
RSA加密一种高度安全的加密方法.
JavaRuntimeEnvironment(JRE)JavaRuntimeEnvironment(JRE)也称作JavaRuntime,是Java开发工具包(JDK)(一组用于开发Java应用程序的编程工具)的一部分.
CerticomSecurityBuilderGSE-J支持FIPS140-2验证的加密算法的JavaCryptographyExtension(JCE)软件加密提供程序.
LDAP数据交换格式(LDIF)LDAP数据交换格式(LDIF)是以文本形式表示目录数据的机制形式.
LDIF规范包含在RFC2849中,该规范不仅描述了一种目录数据表示格式,还描述了一种数据更改机制.
数据类型一个描述对于变量来说合法的类型、值和操作的定义属性.
GSS库实现通用安全服务应用程序编程接口(GSS-API)的库.
词汇表程序员参考191大对象(LOB)数据类型LOB数据类型通常为大型字符对象(文本)或二进制对象(图像).
大对象(LOB)定位符LOB定位符中包含指向LOB数据的逻辑指针而不是数据本身,减少了通过网络在AdaptiveServer与其客户端之间传送的数据量.
SSL安全套接字层(SSL)是为通过Internet安全发送信息而开发的安全协议.
KerberosKerberos是用于鉴定计算机网络中的服务请求的安全方法.
单点登录(SSO)单点登录(SSO)是一种会话/用户鉴定过程,允许用户输入名称和口令以访问多个应用程序.
该过程针对用户拥有权限的所有应用程序对其进行鉴定,当用户在特定会话过程中切换应用程序时消除其它提示.
IETFInternetEngineeringTaskForce(IETF)是Internet的主要标准化组织.
IETF是由网络设计人员、操作人员、供应商和研究员组成的大型开放式国际社区,着重于Internet的体系结构演变及平稳运行.
Java通用安全服务(GSS)管理器Java通用安全服务(JGSS)为进行鉴定和安全消息传送提供通用接口.
WedgetailJCSI可用于jConnect的通用安全服务(GSS)管理器.
CyberSafeTrustBroker可用于jConnect的通用安全服务(GSS)管理器.
密匙分发中心(KDC)密匙分发中心(KDC)是执行鉴定和票据生成任务的单点登录(SSO)设置的一部分.
TDS贯通服务器小程序通过HTTP或HTTPS数据包穿过TDS流的服务器小程序.
RPC远程过程调用(RPC)是一项协议,一个程序可使用它向网络中另一台计算机上的程序请求服务,而无需了解网络详情.
(有时,过程调用也称作函数调用或子例程调用.
)RPC使用客户端/服务器模式.
发出请求的程序是客户端,提供服务的程序是服务器.
与常规或本地过程调用类似,RPC也是同步操作,需要挂起发出请求的程序直至返回远程过程的结果.
但是,使用轻量进程或共享相同地址空间的线程可同时执行多个RPC.
死锁在有权锁定一部分数据的两位用户都尝试锁定对方那部分数据时出现的一种情况.
主服务器在高可用性(HA)环境中,主服务器是客户端应首先尝试连接的服务器.
辅助服务器在高可用性(HA)环境中,辅助服务器是客户端在连接主服务器失败的情况下,应尝试连接的服务器.
词汇表192jConnectforJDBC应用程序编程接口(API)应用程序编程接口(API)是基于源代码的规范,旨在用作软件组件相互通信的接口.
数据库服务器数据库服务器这一术语用于表示使用客户端/服务器架构的数据库应用程序的后端系统.
net-protocol用于在中间层网关之间交换请求/响应,进而与数据库进行通信的协议.
native-protocolDBMS支持的本地协议,用于在客户端和服务器之间交换请求/响应.
AdaptiveServerEnterpriseAdaptiveServerEnterprise(ASE)是Sybase,Inc.
推出的在Linux及其它基于Unix的操作系统、WindowsNT与Windows2000以及MacOS上运行的关系数据库管理系统(RDBMS).
SQLAnywhereSybaseSQLAnywhere是功能全面的关系数据库和数据管理工具.
SybaseIQSybaseIQ是专为数据仓储应用设计的高性能决策支持服务器.
SybaseIQ是包括AdaptiveServerEnterprise和SQLAnywhere的Sybase产品系列的一部分.
SybaseIQ中的组件集成服务提供对主机、UNIX或Windows服务器上关系和非关系数据库的直接访问.
ReplicationServerReplicationServer维护多个数据库中的复制数据,同时确保这些数据的完整性和一致性.
它为使用复制系统中数据库的客户端提供本地数据访问,从而降低网络和集中计算机系统的负载.
DirectConnectDirectConnect是提供与非Sybase数据源的基本连接的ECDA组件.
特别地,它通过DirectConnect管理器提供访问管理、事务管理以及远程系统管理.
程序员参考193符号.
jar文件预装载93英文AdaptiveServer连接到10连接示例26AdaptiveServerAnywhereeuro符号39SERVICENAME连接属性26存储和检索Java对象83发送图像数据62,65ALTERNATE_SERVER_NAME连接属性11APPLICATIONNAME连接属性11ASE数据类型date、time和datetime66BE_AS_JDBC_COMPLIANT_AS_POSSIBLE连接属性12BigDecimal范围重设改善驱动程序性能136bigint支持的数据类型67CACHE_COLUMN_METADATA连接属性12CANCEL_ALL连接属性12CAPABILITY_TIME连接属性13CAPABILITY_WIDETABLE连接属性13CHARSET连接属性13设置36CHARSET_CONVERTER_CLASS连接属性14,35CLASS_LOADER连接属性14CLASSPATH为调试程序设置127CONNECTION_FAILOVER连接属性14,28Debug服务器小程序参数159Debug类126DISABLE_UNICHAR_SENDING连接属性14DISABLE_UNPROCESSED_PARAM_WARNINGS连接属性14DYNAMIC_PREPARE连接属性15,16,21ENABLE_BULK_LOAD连接属性15ENABLE_LOB_LOCATORS连接属性15EncryptPassword80ESCAPE_PROCESSING_DEFAULT连接属性143ESCAPE_PROCESSING_DEFAULT属性16EXECUTE_BATCH_PAST_ERRORS16EXPIRESTRING连接属性16FAKE_METADATA连接属性16GET_BY_NAME_USES_COLUMN_LABEL连接属性17GSSMANAGER_CLASS连接属性17HOSTNAME连接属性17HOSTPROC连接属性17HTTP151IGNORE_DONE_IN_PROC连接属性18IGNORE_WARNINGS连接属性18IS_CLOSED_TEST连接属性18isql小程序运行此示例156IsqlApp实用程序161Java对象在ASA6.
0中存储和检索83作为列数据存储到表中82jConnect调试125调用8定义3改善性能135设置5设置连接属性10使用游标47示例程序163索引索引194jConnectforJDBC网关151应用程序中的内存问题132jConnect应用程序中的内存问题132JCONNECT_VERSION连接属性6,18JDBC定义1接口1驱动程序类型2约束,限制,和偏差101JDBC2.
0标准扩展93选件工具包扩展支持93JDBC驱动程序JDBC-ODBC桥2native-API/partly-Java2native-protocol/all-Java2net-protocol/all-Java2JDBC数据类型date、time和timestamp66jdbc.
drivers8JNDI环境信息32使用28用于命名数据库93LANGUAGE连接属性19LANGUAGE_CURSOR145LANGUAGE_CURSOR连接属性19LITERAL_PARAMS连接属性19native-API/partly-Java驱动程序2native-protocol/all-Javadriver2net-protocol/all-Java驱动程序2OPTIMIZE_FOR_PERFORMANCE连接属性19PACKETSIZE连接属性19PRELOAD_JARS连接属性20PreparedStatement使用游标55PROMPT_FOR_NEWPASSWORD连接属性19,20PROTOCOL_CAPTURE连接属性20PROXY连接属性20PureConverter类35QUERY_TIMEOUT_CANCELS_ALL连接属性20RELEASE_LOCKS_ON_CURSOR_CLOSE20REMOTEPWD连接属性20REPEAT_READ136REPEAT_READ连接属性20REQUEST_HA_SESSION21REQUEST_KERBEROS_SESSION21RMNAME连接属性21rs.
getByte()67SECONDARY_SERVER_HOSTPORT连接属性21SELECT_OPENS_CURSOR连接属性22SEND_BATCH_IMMEDIATE22SERIALIZE_REQUESTS连接属性22SERVER_INITIATED_TRANSACTIONS连接属性22SERVERTYPE连接属性22SERVICE_PRINCIPAL_NAME连接属性23SERVICENAME连接属性22SESSION_ID连接属性23SESSION_TIMEOUT连接属性23setRemotePassword()45SkipDoneProc服务器小程序参数159SQLAnywhere22SQL例外与警告消息167SQLINITSTRING连接属性23Statement.
cancel()方法12STREAM_CACHE_SIZE连接属性23SUPPRESS_PARAM_FORMAT连接属性24SUPPRESS_ROW_FORMAT连接属性24SUPPRESS_ROW_FORMAT2连接属性24Sybase扩展更改148SybEventHandler72SybMessageHandler77SYBSOCKET_FACTORY连接属性25TDS3安装服务器小程序159捕获通信130服务器小程序151服务器小程序系统要求158跟踪会话160贯通151恢复会话160设置服务器小程序参数159TdsResponseSize服务器小程序参数159TdsSessionIdleTimeout服务器小程序参数159TEXTSIZE25TruncationConverter类35,38TYPE_SCROLL_INSENSITIVE限制56unichar和univarchar数据类型33unitext67索引程序员参考195unsignedint支持的数据类型67URL连接属性参数26语法25USE_METADATA连接属性25VERSIONSTRING连接属性25Web服务器网关151XAServer99A安装TDS服务器小程序159错误消息处理程序78B本地化33捕获TDS通信130C池连接97处理错误消息75创建游标48存储过程错误133通过结果集更新数据库60执行104错误存储过程133连接131错误消息SQL例外与警告167Sybase特定75安装错误消息处理程序78处理75错误消息处理程序示例78自定义处理77D调试125方法127获取Debug类的一个实例125设置CLASSPATH127在应用程序中打开126在应用程序中关闭126调用jConnect8定位型更新和删除使用JDBC1.
x方法50使用JDBC2.
0方法51动态类装载87读者vii多线程进行调节101多字节字符集支持的36转换程序类35F发送图像数据62非序列化89分布式事务支持99服务器到服务器的远程过程调用44服务器小程序151TDS151服务器小程序参数Debug159SkipDoneProc159TdsResponseSize159TdsSessionIdleTimeout159G高级功能70高可用性(HA)支持40跟踪TDS会话160更新数据库通过存储过程的结果集60故障排除125贯通TDS151国际化33索引196jConnectforJDBCH恢复TDS会话160货币符号,euro39J将Java对象作为列数据存储在表中82将Java对象发送到数据库83接收来自数据库的Java对象85前提条件83接口,JDBC1K口令20口令加密80宽表45扩展更改,Sybase148L连接池97错误131网关连接被拒绝131连接到AdaptiveServer10使用JNDI连接到服务器28连接属性ALTERNATE_SERVER_NAME11APPLICATIONNAME11BE_AS_JDBC_COMPLIANT_AS_POSSIBLE12CACHE_COLUMN_METADATA12CANCEL_ALL12CAPABILITY_TIME13CAPABILITY_WIDETABLE13CHARSET13CHARSET_CONVERTER_CLASS14,35CLASS_LOADER14CONNECTION_FAILOVER14,28DISABLE_UNICHAR_SENDING14DISABLE_UNPROCESSED_PARAM_WARNINGS14DYNAMIC_PREPARE15,16,21ENABLE_BULK_LOAD15ENABLE_LOB_LOCATORS15ESCAPE_PROCESSING_DEFAULT16,143EXPIRESTRING16FAKE_METADATA16GET_BY_NAME_USES_COLUMN_LABEL17GSSMANAGER_CLASS17HOSTNAME17HOSTPROC17IGNORE_DONE_IN_PROC18IGNORE_WARNINGS18IS_CLOSED_TEST18JCONNECT_VERSION6,18LANGUAGE19LANGUAGE_CURSOR19,145LANGUAGE_CURSOR和游标性能144LITERAL_PARAMS19OPTIMIZE_FOR_PERFORMANCE19PACKETSIZE19PRELOAD_JARS20PROMPT_FOR_NEWPASSWORD19,20PROTOCOL_CAPTURE20PROXY20QUERY_TIMEOUT_CANCELS_ALL20REMOTEPWD20REPEAT_READ20,136REQUEST_HA_SESSION21REQUEST_KERBEROS_SESSION21RMNAME21SECONDARY_SERVER_HOSTPORT21SELECT_OPENS_CURSOR22SERIALIZE_REQUESTS22SERVER_INITIATED_TRANSACTIONS22SERVERTYPE22SERVICE_PRINCIPAL_NAME23SERVICENAME22SESSION_ID23SESSION_TIMEOUT23SQLINITSTRING23STREAM_CACHE_SIZE23SUPPRESS_PARAM_FORMAT24SUPPRESS_ROW_FORMAT24SUPPRESS_ROW_FORMAT224索引程序员参考197SYBSOCKET_FACTORY25TEXTSIZE25URL中的设置26USE_METADATA25VERSIONSTRING25口令20设置10用户25列在游标结果集中更新51在游标结果集中删除51O欧洲货币符号39P批处理更新60存储过程60Q迁移jConnect应用程序jConnect应用程序,迁移147轻量目录访问协议(LDAP)29驱动程序JDBC类型2属性11S设置jConnect5jConnect连接属性10TDS服务器小程序参数159实用程序IsqlApp161示例程序163事件通知72示例73属性驱动程序11数据图像62数据库将Java对象作为列数据存储在表中82用于命名的JNDI93数据类型ASEdate、time和datetime66JDBCdate、time和timestamp数据类型66unichar和univarchar33T图像数据TextPointer类中的公共方法62发送62获取TextPointer对象63使用TextPointer.
sendData执行更新64使用TextPointer.
sendData()更新列63W网关151连接被拒绝131配置152X系统属性jdbc.
drivers8相关文档vii小程序156行从游标结果集中删除53在游标结果集中插入53性能,改善135BigDecimal范围重设136对动态SQL中的预准备语句的调优137游标144字符集转换137选择字符集转换程序类35索引198jConnectforJDBCY应用程序打开调试程序126关闭调试程序126用户25游标47创建48用于PreparedStatement55游标结果集插入行53定位型更新50更新列51删除51删除行53使用JDBC1.
x方法进行定位型更新和删除50使用JDBC2.
0方法进行定位型更新和删除51用于更新数据库的方法52游标性能144和LANGUAGE_CURSOR连接属性144与JDBC标准的偏差101预装载.
jar文件93元数据USE_METADATA25访问46远程过程调用(RPC)服务器到服务器44Z在应用程序中打开调试程序126在应用程序中关闭调试程序126支持的数据类型67字符集设置36支持的36转换程序类35字符集转换改善驱动程序性能137改善性能36字符集转换程序类PureConverter35TruncationConverter35选择35

易探云2核2G5M仅330元/年起,国内挂机宝云服务器,独立ip

易探云怎么样?易探云是国内一家云计算服务商家,致力香港服务器、国内外服务器租用及托管等互联网业务,目前主要地区为运作香港BGP、香港CN2、广东、北京、深圳等地区。目前,易探云推出深圳或北京地区的适合挂机和建站的云服务器,国内挂机宝云服务器(可选深圳或北京地区),独立ip;2核2G5M挂机云服务器仅330元/年起!点击进入:易探云官方网站地址易探云国内挂机宝云服务器推荐:1、国内入门型挂机云服务器...

Gcore(gcorelabs)俄罗斯海参崴VPS简单测试

有一段时间没有分享Gcore(gcorelabs)的信息了,这是一家成立于2011年的国外主机商,总部位于卢森堡,主要提供VPS主机和独立服务器租用等,数据中心包括俄罗斯、美国、日本、韩国、新加坡、荷兰、中国(香港)等多个国家和地区的十几个机房,商家针对不同系列的产品分为不同管理系统,比如VPS(Hosting)、Cloud等都是独立的用户中心体系,部落分享的主要是商家的Hosting(Virtu...

vpsdime:VPS内存/2核/VPS,4G内存/2核/50gSSD/2T流量/达拉斯机房达拉斯机房,新产品系列-Windows VPS

vpsdime上了新产品系列-Windows VPS,配置依旧很高但是价格依旧是走低端线路。或许vpsdime的母公司Nodisto IT想把核心产品集中到vpsdime上吧,当然这只是站长个人的猜测,毕竟winity.io也是专业卖Windows vps的,而且也是他们自己的品牌。vpsdime是一家新上来不久的奇葩VPS提供商,实际是和backupspy以及crowncloud等都是同一家公司...

两台电脑如何联机为你推荐
toupianyuanzhu看拼音写词语googlepr百度权重和googlePR都是些什么东西??企业信息查询系统官网怎么查企业信息是否在网上公示过支付宝注册网站在哪里注册支付宝重庆电信dns重庆电信 路由器连接另一个电脑,本地连接的IP是多少,?DNS首选,备用 服务器是多少?sns网站有哪些中国都有哪些sns网站?还有它们都是哪个类型的?文档下载怎么下载百度文档三五互联科技股份有限公司三五互联 网站做的怎么样 公司打算做网站,近来接到电话,不知道网站做的如何,水平怎么样,后期的服务呢网络u盘有没有网络U盘 5G的 就像真的U盘一样的?就像下载到真U盘一样的 到自己电脑直接复制就可以拉的啊什么是seoseo怎么学呢?
租服务器 个人虚拟主机 免费域名 免费域名申请 域名交易网 过期域名抢注 香港bgp机房 iis安装教程 空间服务商 一元域名 最好看的qq空间 国外网站代理服务器 商务主机 777te 台湾谷歌地址 申请个人网站 国外免费asp空间 鲁诺 美国独立日 空间租赁 更多