由于实现了java.sql.Savepoint,Connector/J 3.1.0和更新版本不会运行在早于1.4版的JDK上,除非关闭了类验证器(-Xverify:none),这是因为,类验证器将试图加载用于java.sql.Savepoint的类定义,除非使用了savepoint功能,否则驱动程序不会访问类验证器。
早于1.4.x版的JVM上,不能使用Connector/J 3.1.0或更高版本提供的新缓冲功能,这是因为该功能依赖在JDK-1.4.0中首次提供的java.util.LinkedHashMap。
26.3.2.1.2. MySQL服务器版本指南
与MySQL服务器4.1版或更高版本建立连接时,最好使用MySQL Connector/J 3.1版,这是因为它全面支持较新版本的服务器提供的特性,包括Unicode字符、视图、存储程序和服务器端预处理语句。
尽管3.0版Connector/J能够与MySQL服务器4.1或更高版本建立连接,但由于实现了Unicode字符和新的鉴定机制,将无法更新Connector/J 3.0以支持当前和未来服务器版本中提供的新特性。
26.3.2.1.3. 安装驱动程序并配置CLASSPATH
从Connector/J 3.1.9开始,我们不再单独提供.class文件,仅在与驱动程序一起提供的JAR文件中提供它们。
不应使用驱动程序的“调试版”,除非是在向MySQL AB通报问题或缺陷时需要用到它,这是因为“调试版”不是为生产环境下的运行而设计的,如果使用它,会对性能造成负面影响。二进制代码的调试取决于Aspect/J运行时库,该库位于与Connector/J分发版一起提供的src/lib/aspectjrt.jar文件中。
需要使用恰当的GUI或命令行使用工具来解开分发文件(例如,用于.zip文件的WinZip,以及用于.tar.gz文件的“tar”)。由于在分发版中可能存在长文件名,我们采用了GNU tar档案格式。需要使用GNU tar(或能理解GNU tar档案格式的其他应用程序)来解开分发版的.tar.gz文件。
一旦解包了分发版档案文件,可以将mysql-connector-java-[version]-bin.jar放在你的类路径中,或是在你的CLASSPATH环境变量中添加它的完整路径,或是在启动JVM(Java虚拟机)时用命令行开关“-cp”直接指定它,通过该方式安装驱动。
如果你打算用JDBC DriverManager来使用驱动,可使用“com.mysql.jdbc.Driver”,将其用作实施了“java.sql.Driver”类。
示例26.11. 设置Unix环境下的CLASSPATH
在Unix环境下,下述命令用于“csh”:
$ setenv CLASSPATH /path/to/mysql-connector-java-[version]-bin.jar:$CLASSPATH
可以将上述命令添加到恰当的、用于登录shell的启动文件中,从而使得所有的Java应用程序均能使用MySQL Connector/J。
如果希望与诸如Tomcat或Jboss等应用服务器一起使用MySQL Connector/J,应仔细阅读供应商提供的文档,以了解如何配置第三方类库的更多信息,这是因为大多数应用服务器均会忽略CLASSPATH环境变量。在“与J2EE和其他Java框架一起使用 Connector/J”一节中,给出了针对一些J2EE应用服务器的配置示例,但是,对于特定的应用服务器,JDBC连接池配置信息的权威信息源是该应用服务器的文档。
如果你准备开发小服务程序和/或JSP,而且你的应用服务器是J2EE兼容的,可以将驱动的.jar文件放到webapp的WEB-INF/lib子目录下,在J2EE Web应用程序中,这是第三方类库的标准位置。
如果你的J2EE应用服务器支持或要求,也可以使用com.mysql.jdbc.jdbc2.optional可选软件包中的MysqlDataSource或MysqlConnectionPoolDataSource类。多种MysqlDataSource类均支持下述参数(通过标准的“Set”存取器):
· user
· password
· serverName(参见前面关于故障切换主机的章节)
· databaseName
· port
设计Connector/J 3.1时,尽量使它能向后兼容Connector/J 3.0。大的变化被单独作为MySQL-4.1和更新版中的新功能,包括Unicode字符集、服务器端预处理语句、由服务器返回的错误信息中的SQLState代码、以及各种性能增强特性(可通过配置属性启用或禁止)。
· Unicode字符集:关于MySQL新特性的更多信息,请参见下一节,以及服务器手册中的“字符集”一节。如果有些事项配置不当,通常会显示错误,同时给出错误消息,如“非法校对组合”。
· 服务器端预处理语句:Connector/J 3.1将自动检测服务器端预处理语句,并在可用时自动使用它们(MySQL服务器4.1.0版或更新)。
从3.1.7版开始,驱动程序能通过各种Connection.prepareStatement()变体扫描SQL,以判断它是否是能够在服务器端支持的语句类型,如果不被服务器端支持,会将其作为客户端的模拟预处理语句进行处理。也可以通过在JDBC URL中传递“emulateUnsupportedPstmts=false”禁止该特性。
如果应用程序遇到与服务器端预处理语句有关的问题,可将其回复为旧的客户端模拟预处理语句代码,在早于4.1.0版的MySQL服务器中仍使用该代码,连接属性如下:
useServerPrepStmts=false
· 具有全0组分的Datetimes(0000-00-00 ...):在Java中,无法可靠地表示这些值。从结果集读取它们时,Connector/J 3.0.x总是会将其转换为NULL。
默认情况下,遇到这类值时,Connector/J 3.1将抛出异常,这是因为,根据JDBC和SQL标准,这是最正确的行为方式。可以使用“zeroDateTimeBehavior”配置属性改变该行为。允许的值包括:“exception”,(默认值),用代码为“S1009”的SQLState抛出SQLException;“convertToNull”,返回NULL而不是数据;以及“round”,对日期进行舍入处理,使之成为最接近的值,即“0001-01-01”。
从Connector/J 3.1.7开始,能够使用“noDatetimeStringSync=true”(默认值为“假”),将ResultSet.getString()与该行为分离开,从而能够以字符串的形式提取未被改变的全0值。请注意,这也会阻止使用任何时区转换功能,因此,驱动程序将禁止同时启用noDatetimeStringSync和useTimezone。
· 新SQLState代码:Connector/J 3.1采用MySQL返回的SQL:1999 SQLState代码(如果支持的话),它不同于Connector/J 3.0使用的“传统”X/Open状态码。如果连接到了版本低于MySQL-4.1.0(能够将SQLStates作为错误代码组成部分返回的最早版本)的MySQL服务器,驱动程序将使用内置的映射功能。你也可以使用下述配置选项,采用旧的映射。
useSqlStateCodes=false
· 在BLOB列上调用ResultSet.getString()将返回代表它的字节[]数组的地址,而不是BLOB的字符串形式。BLOB没有字符集,因此,在不造成数据丢失或损坏的情况下,不能将它们转换为java.lang.Strings。
要想以BLOB方式将字符串保存在MySQL中,可使用一种TEXT类型,驱动程序会将其当作java.sql.Clob对待。
· 从Connector/J 3.1.8开始,驱动的“调试版”(在名为“mysql-connector-java-[version]-bin-g.jar”的文件中与正常的“二进制”jar文件“名为mysql-connector-java-[version]-bin.jar”一起提供。
从Connector/J 3.1.9开始,我们不再单独提供.class文件,仅在与驱动程序一起提供的JAR文件中提供它们。
不应使用驱动程序的“调试版”,除非是在向MySQL AB通报问题或缺陷时需要用到它,这是因为“调试版”不是为生产环境下的运行而设计的,如果使用它,会对性能造成负面影响。二进制代码的调试取决于Aspect/J运行时库,该库位于与Connector/J分发版一起提供的src/lib/aspectjrt.jar文件中。
· 使用UTF-8字符编码:在4.1版MySQL服务器之前,服务器不支持UTF-8字符编码,但JDBC驱动能使用它,从而允许在服务器上的latin1中保存多个字符集。
从MySQL-4.1版开始,该功能被放弃。如果你有依赖该功能的应用程序,而且无法升级它们以使用MySQL服务器4.1版或更高版本中支持的正是Unicode字符集,应在连接URL中增加下述属性:
useOldUTF8Behavior=true
· 服务器端预处理语句:Connector/J 3.1将自动检测服务器端预处理语句,并在可用时自动使用它们(MySQL服务器4.1.0版或更新)。如果应用程序遇到与服务器端预处理语句有关的问题,可将其回复为旧的客户端模拟预处理语句代码,在早于4.1.0版的MySQL服务器中仍使用该代码,连接属性如下:
useServerPrepStmts=false