ITEEDU

26.3.2.2.1. 从MySQL Connector/J 3.0升级到3.1

设计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文件中。