Chinaunix首页 | 论坛 | 博客
  • 博客访问: 92424783
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: Mysql/postgreSQL

2008-05-12 15:17:23

26.3.5.2. 如何通报缺陷和问题

通报缺陷的正常地址是,它也是我方缺陷数据库的地址。这是1个公共数据库,任何人都能浏览它并进行相应的搜索。如果你已登录到系统,也应能输入新的报告。

如果发现MySQL中存在敏感的安全缺陷,请发送电子邮件至security@mysql.com

编写良好的缺陷报告需要耐心,但在第1时间正确地完成它不仅能节省我们的时间,也能节省你自己的时间。良好的缺陷报告应包含对缺陷的完整测试情况,以便我们你能够在下个版本中更正该缺陷。

本节介绍的内容用于帮助你正确地编写报告,从避免将你的时间浪费在对我们帮助不大或没有帮助的事上,

如果有1份可重复的缺陷报告,请将其提交到缺陷数据库,

对于任何我们能再现的缺陷,在下一个MySQL版本中修正它的机会很大。

要想通报其他问题,请使用MySQL邮件列表。

请注意,我们可能会对包含过多信息的消息作出响应,但不太会对包含过少信息的消息作出回应。人们常会省略掉一些事实,因为他们认为自己知道了故障的原因,并想当然地认为这类细节无关紧要。

良好的原则是:如果你对陈述某事犹豫不定,请陈述之。如果我们要求你提供初始报告中缺少的信息,在报告中编写多行信息源比等候回复要快,麻烦也更小。

在缺陷报告,最常犯的错误包括:(a)未包含所使用Connector/J或MySQL的版本号,以及(b)未完全描述安装了Connector/J的平台(包括JVM版本,平台类型,以及所安装MySQL本身的版本号)。

这是高度相关的信息,如果没有它,99%的缺陷报告无用。我们遇到这类问题,“为何它对我没用”? 随后,我们发现在该MySQL版本中,所请求的特性尚未实施,或在较新的MySQL版本中已更正了报告中描述的缺陷。

有些时候,错误与平台相关,在这类情况下,如果不知道操作系统和平台的版本号,我们几乎不可能更正任何问题。

如果可能,你应创建1份可重复的、不含任何第三方类的独立测试案例。

为了是该进程流线化,我们与Connector/J一起提供了用于测试的基本类,名为com.mysql.jdbc.util.BaseBugReport。要想使用该类为Connector/J创建1个测试案例,你应应创建自己的从com.mysql.jdbc.util.BaseBugReport继承的类,并覆盖方法setUp()tearDown()runTest()。

setUp()方法中,创建用于创建表的代码,并用演示缺陷所需的数据填充表。

runTest ()方法中,使用在“setUp”方法中创建的表和数据,创建用于演示缺陷的代码。

tearDown()方法中,撤销在setUp()方法中创建的任何表。

对于上述三种方法中的任何一种,应使用getConnection ()各种变体中的一种创建与MySQL的JDBC连接。

·         getConnection():提供了与在getUrl()中指定的JDBC URL的连接。如果连接已存在,返回该连接,否则将创建新的连接。

·         getNewConnection():如果需要为缺陷报告获得新的连接(即包含1个以上的连接),应使用它。

·         getConnection(String url):使用给定的URL返回连接。

·         getConnection(String url, Properties props):使用给定的URL和属性返回连接。

如果需要使用不同于“jdbc:mysql:///test”的JDBC URL,还应覆盖方法getUrl()

在演示你所预计行为的测试案例中(相对于你观察到的世纪行为,这是你填充错误报告的最可能原因),使用assertTrue(boolean expression)assertTrue(String failureMessage, boolean expression)方法创建必须满足的条件。

最后,创建用于创建测试案例实例的main ()方法,并调用run方法:

public static void main(String[] args) throws Exception {
      new MyBugReport().run();
 }

完成了测试案例并证实它能演示你所通报的缺陷后,请将该案例与缺陷报告一起上传到。

26.3.6. Changelog

# Changelog
# $Id: CHANGES,v 1.38.4.206 2005/05/12 15:25:54 mmatthews Exp $
 
05-17-05:版本3.2.1-alpha
 
    - 现已不再重视Autoreconnect功能(即autoReconnect=true)。
      如果尝试并使用它将抛出异常,使用“enableDeprecatedAutoreconnect=true”可继续使用autoReconnect。但是,在Connector/J 3.3中将删除该项特性,请参见手册中关于不需要使用autoReconnect的相应解决方案。
 
    - 现在,驱动程序将检查是否设置了服务器变量“init_connect”,如果设置了该变量,将检查autocommit(自动提交)设置,并应用它。
  
    - 如果连接的服务器版本在5.0.x以上,而且Statement.setFetchSize( > 0),驱动程序将尝试使用服务器预处理语句,并使用结果集“cursors”获取语句。
  
    - ServerPreparedStatements现在能正确地将BLOB/CLOB数据以“流方式”发送至服务器。你可以使用属性“blobSendChunkSize”配置程序块大小的阈值(默认值为1MB)。
  
    - 支持sql模式NO_BACKSLASH_ESCAPES以及非服务器端预处理语句。
 
12-23-04:版本3.2.0-alpha
 
    -更正了DatabaseMetaData.supportsCatalogIn*()错误的返回值。
    
    -使用ServerPreparedStatements以及MySQL 5.0或更高版本时,支持基于“cursor”的结果集。结果集需为“仅正向”结果集,并需启用针对该项特性的非零获取大小。
      
    - 重新分解了预处理语句的where逻辑,服务器端预处理语句保持有效。
 
10-07-05:版本3.1.11-stable
 
    - 更正了:当字符编码是“utf8”时控制台上的伪“!”。
      
    -更正了为丢失“;”(用于“plain”语句)的测试案例生成的语句。
      
    - 更正了:为服务器端预处理语句生成的不正确的testcase脚本。
      
    -更正了因修补而导致的回归,对于,当整数处于正号类型的范围内时,对于无符号整数,该缺陷将导致驱动程序返回错误值。
    
    -将源代码移到了svn repo。
    
    -更正了:转义标志不考虑用于转义用途的层套式单引号。
  
    -使用服务器端预处理语句时,不识别GEOMETRY类型。
    
    -更正了:ReplicationConnection不会切换至从连接,抛出“目录不能为空”异常。
      
    -更正了,主连接和具有复制连接的从连接之间共享的属性。
      
    - 更正了。如果语句已关闭,Statement.getWarnings()无法与NPE一起工作。
      
    -需要时,在PreparedStatement.ParseInfo()中,即能从SQL获取char[]。
    
    -更正了,服务器端预处理语句不能处理Geometry类型。
      
    -更正了,使用多字节字符编码时,StringUtils.getBytes()不工作,在“_characters_”中指定了长度。
      
    -更正了,Pstmt.setObject(...., Types.BOOLEAN)抛出异常。
    
    -更正了,maxPerformance.properties拼错“elideSetAutoCommits”。
  
    -更正了,对于在Window平台上的服务器,DBMD.storesLower/Mixed/UpperIdentifiers()通报不正确的值。
  
    -更正了,在ResultSet.moveToCurrentRow()之前调用了ResultSet.moveToInsertRow()时,ResultSet.moveToCurrentRow()不起作用。
  
    -更正了,使用服务器端预处理语句和.setBytes()时,VARBINARY数据发生崩溃。
 
    -更正了,服务器端预处理语句挂起explainSlowQueries。
  
    -更正了,转义处理器不考虑用双引号分隔的字符串。
  
    -对于服务器端预处理语句,增加了对更改流参数的限制。只要在执行前设置了“_all_”流参数,可不必调用.clearParameters()。(由于客户端/服务器协议的限制,预处理语句不能复位服务器端的“_individual_ stream”数据)。
   
    -修改了Field类,*Buffer和MysqlIO,能够识别大于Integer.MAX_VALUE的字段长度。
  
    -更新了DBMD.supportsCorrelatedQueries(),当版本高于4.1时返回“真”,更新了supportsGroupByUnrelated()使之返回“真”,并更新了getResultSetHoldability()使之返回HOLD_CURSORS_OVER_COMMIT。
  
    -更正了,DatabaseMetaData.getIndexInfo()中的catalog(目录)参量处理,它也意味着对DatabaseMetaData中下述方法的更改:
  
    - getBestRowIdentifier()
    - getColumns()
    - getCrossReference()
    - getExportedKeys()
    - getImportedKeys()
    - getIndexInfo()
    - getPrimaryKeys()
    - getProcedures() (and thus indirectly getProcedureColumns())
    - getTables()
  
上述所有方法中的“catalog”参量现具有下述行为特征:
  
  -如果指定为Null,表示不会使用catalog来过滤结果(因此将搜索所有数据库),除非在JDBC URL属性中设置了“nullCatalogMeansCurrent=true”。
 
  -指定为“”表示当前catalog,尽管它不是十分兼容JDBC规范,但它是为传统用户保留的。
 
  -指定catalog,使之按API文档中阐明的方式工作。
    
  -使得jdbc2.optional软件包中的“封装”连接能够使用Connection.clientPrepare()(使用ConnectionPoolDataSource实例创建连接)。
 
    -为客户端增加了Connection.isMasterConnection(),以确定多主机主/从连接是否连接至列表中的第1个主机。
 
    -更正了,URL属性用于“=”的标志会导致“sessionVariables=....”无法正确地参数化。
 
    -更正了,当DatabaseMetaData方法使用该信息时,所引用的外键信息不能被正确解析。
 
    -考虑到流缓冲区大小和信息包报头,“sendBlobChunkSize”属性现在与“max_allowed_packet”密切结合在一起,当max_allowed_packet的大小类似于默认的“sendBlobChunkSize”时(为1MB),能避免PacketTooBigExceptions。
 
    -CallableStatement.clearParameters()现能清除与INOUT/OUTPUT参数和INPUT参数相关的属性。
 
    -更正了,Connection.prepareCall()是区分大小写的数据库名称(在Windows系统上)。
 
    -更正了,对于版本高于4.0.x的服务器,Cp1251不正确地映射至win1251。
 
    -更正了,使用DatabaseMetaData.getColumns()时,java.sql.Types.OTHER返回BINARY和VARBINARY列。
  
    -引用参数约束列表前,ServerPreparedStatement.getBinding()现在将检查语句是否已关闭,以避免抛出NullPointerException。
 
    -更正了,无论何时,当调用需要连接引用的方法时,来自Statement.getGeneratedKeys()的ResultSetMetaData将导致NullPointerExceptions的抛出。
 
    -自5.0起,Field类ResultSetMetaData.getColumnClassName()和ResultSet.getObject(int)的反向移植出现了变化,更正了VARCHAR BINARY/VARBINARY和相关类型有关的行为。
 
    -更正了NullPointerException,当参数为NULL时,在很多DatabaseMetaDataMethods中将“catalog”参数转换为byte[]时出现的异常(对于结果集)。(根据JDBC规范,从技术角度上不允许“null”,但从历史观点上,我们允许使用它)。
 
    -从5.0起,VAR[BINARY|CHAR] [BINARY]类型检测的反向移植。
    
    -即使无法打开本地文件,也能读取MysqlIO.sendFileToServer()中响应,否则,下一个发出的查询将失败,这是因为,它正在读取对发送至服务器的空LOAD DATA INFILE信息包的响应。
 
    -避开了,已关闭结果集上的ResultSet.getStatement()返回NULL(按照JDBC 4.0规范,但不具有向后兼容性)。将连接属性“retainStatementAfterResultSetClose”设为“真”,以便能够在通过.getStatement()关闭了结果集后检索结果集的语句(默认为“假”以便与JDBC兼容,并降低使用JDBC的代码名泄漏语句实例的机会)。
 
    -更正了,URL配置参数不允许在它们的值中使用“&”或“=”。现在JDBC驱动程序能够对配置参数进行相应地解析,就像它们是使用application/x-www-form-urlencoded格式(在java.net.URLDecoder中指定,)进行编码那样。
 
如果在配置属性中出现字符“%”,现在必须用“%25”表示,它是使用“application/x-www-form-urlencoded”编码使“%”的已编码形式。
 
    -配置属性“sessionVariables”现在允许你指定以“@”符号开始的变量。
 
    -更正了,为低于4.1.0版的服务器允许了“gatherPerfMetrics”时,如果查询未使用任何表,结果集的构造函数将抛出NullPointerException。
 
06-23-05:版本3.1.10-stable
 
    -更正了因无指定数据库而导致的MysqlIO.changeDatabaseTo()中的异常。
  
    -首次实现了用于PreparedStatement.getParameterMetadata()的ParameterMetadata。仅能与CallableStatements一起完全发挥作用,这是因为当前的服务器端预处理语句会将所有参数返回为VARCHAR类型。
    
06-22-05:版本3.1.9-stable
 
    -彻底检查了字符集配置,现在所有相关项均能位于属性文件中。
  
    -如果在用于Windows-31J的服务器上可用,驱动程序能正确使用CP932,以及CP932和MS932 java编码名称,否则将求助于仅为近似的SJIS。目前,仅在MySQL-5.0.3和更高版本上(以及MySQL-4.1.12/13,取决于何时反向移植字符集),才能可靠地支持任何CP932变体。
 
    -更正了,com.mysql.jdbc.PreparedStatement.ParseInfo对toCharArray()的不必要调用。
 
    -更正了,如果serverPrepare()失败,ServerPreparedStatement中的内存泄漏。
 
    -将清单文件实际写入正确位置,以便其终止于二进制jar文件。
 
    -增加了“createDatabaseIfNotExist”属性(默认为“假”),该属性会使驱动程序请求服务器创建在URL中指定的数据库(如果该数据库不存在的话)。必须拥有恰当的数据库创建权限才能执行该任务。
 
    -更正了,对于ResultSet.getInt(),无符号SMALLINT被当作带符号类型,更正了所有的UNSIGNED整数和服务器端预处理语句,以及用于UNSIGNED TINYINT的ResultSet.getObject()。
 
    -更正了,解析客户端预处理语句时不能识别双引号。
  
    -使得enableStreamingResults()在com.mysql.jdbc.jdbc2.optional.StatementWrapper上可见。
  
    -使得ServerPreparedStatement.asSql()能正确工作,自动解释功能可以与服务器端预处理语句一起工作。
  
    -使得兼容JDBC2的软件包成为公共包,以便允许访问厂家扩展。
  
    -整理了剖析工具事件的记录功能,移动了代码以将剖析工具事件转储为com.mysql.jdbc.log.LogUtils的字符串,以便第三方能够使用它。
  
    - DatabaseMetaData.supportsMultipleOpenResults()现在返回“真”。DBMD刚刚丢失某一内容时,驱动程序在一段时间内支持它。
  
    -更正了,驱动程序不支持用来调用存储程序的{?=CALL(...)}。其中包括,为DatabaseMetaData.getProcedures()和getProcedureColumns()增加了函数检索支持。
 
    -更正了,用ResultSet.getString()检索YEAR(2)时抛出SQLException。现在,驱动程序总是将YEAR类型当作java.sql.Dates对待,并为getString()返回正确值。
另外,可以将“yearIsDateType”连接属性设置为“假”,并将值作为SHORT进行处理。
  
    -当“tinyInt1isBit=true”时(默认),使用新的配置属性“transformedBitIsBoolean”(默认为“假”),对于TINYINT(1)列,返回的数据类型可在Types.BOOLEAN和Types.BIT之间切换。如果设为“假”(默认),对于TINYINT(1)列,DatabaseMetaData.getColumns()和ResultSetMetaData.getColumnType()将返回Types.BOOLEAN。如果为“真”,将返回Types.BOOLEAN。无论该配置属性是如何设置的,如果允许了“tinyInt1isBit”,具有TINYINT(1)类型的列将作为ResultSet.getObject(..)的java.lang.Boolean实例返回,而且ResultSetMetaData.getColumnClassName()将返回“java.lang.Boolean”。
 
    -更正了,与cp932或eucjpms一起使用“characterSetResults”属性时将抛出SQLException。
 
    -重组了目录格局,源码现位于“src”文件夹下,创建时不填充父目录,输出位于“./build”下,分发版位于“./dist”下。
 
    -这类支持/缺陷跟踪特性,将“autoGenerateTestcaseScript”设置为“真”时,该特性能够为STDERR生成.sql测试脚本。
 
    -更正了,使用服务器端预处理语句时,不会将“0长度”流发送给服务器。
    
    -现在,如果设置了“cachePrepStmts=true”,也会使连接进行高速缓冲操作,检查驱动程序的执行情况,以判断预处理语句是否能够在服务器端工作,并能在连接的生命期内对服务器端预处理语句进行高速缓冲处理。与以往一样,参数“prepStmtCacheSize”负责控制这些高速缓冲区的大小。
 
    -进行了尝试,以更为优美的方式处理OutOfMemoryErrors。尽管所能作的事情不是很多,但在大多数情况下它们能关闭所遇到的连接,这样,进一步的操作不会进入状态不明的连接。出现OOM时,连接上的任何进一步操作均将失败,同时抛出“连接已关闭”异常,还将列出作为隐式连接关闭事件原因的OOM异常。
 
    -如果未要求,执行服务器端预处理语句时不发送COM_RESET_STMT。
 
    -驱动程序将检测是否正在运行MySQL-5.0.7或更高版本,而且不扫描正在处理的语句中的“LIMIT ?[,?]”,这是因为目前服务器支持这类查询。
 
    -更正了,使用服务器端预处理语句和ResultSet.getBytes()时,VARBINARY数据发生崩溃
 
    -Connection.setCatalog()想在能够识别“useLocalSessionState”配置属性,将该属性设为“真”时,如果所请求的catalog与当前catalog相同,会阻止驱动程序将“USE ...”发送给服务器。
 
    -增加了下述配置捆包,通过“useConfigs”配置属性使用1个或多个:
    
  * maxPerformance:考虑后果时的最大性能
  * solarisMaxPerformance:Solaris的需性能,在可能的情况下避免系统调用。
  * 3-0-Compat:与Connector/J 3.0.x功能兼容。
  
    -增加了“"maintainTimeStats”配置属性(默认为“真”),用于通知驱动程序是否应跟踪上次查询时间,以及上次成功将信息包发送到服务器的时间。如果将其设置为“假”,将删除每查询的两次系统调用。
    
    -更正了,autoReconnect的ping操作会导致连接启动时的异常。
 
    -更正了,Connector/J将查询两次转储到SQLException。
    
    -更正了PreparedStatement.setClob(),不接受Null作为参数。
    
    -更正了,生产包不包括JBoss集成类。
 
 
    -删除了使用“usage advisor”时无意义的“开销昂贵的类型转换”告警。
 
 
04-14-05:版本3.1.8-stable
 
    -更正了DatabaseMetaData.getTables(),未要求时,以请求表的类型之一返回视图。
 
    -在5.0.3和更高版本的MySQL中,增加了对新精度数学DECIMAL类型的支持。
 
    -更正了ResultSet.getTime(),作用于服务器端预处理语句的Null值上时抛出NPE。   -使Connection.ping()成为public方法。   -更正了,DATE_FORMAT()查询从getObject()返回BLOB。   - ServerPreparedStatements现在能正确地将BLOB/CLOB数据以“流方式”发送至服务器。你可以使用属性“blobSendChunkSize”配置程序块大小的阈值(默认值为1MB)。
 
    -生成预处理语句时,BlobFromLocator现在能使用正确的ID引用。
 
    -使用连接属性“sessionVariables”的逗号分隔列表方式传递它们,能够在连接时预先设置服务器端会话变量。
 
    -为使用“autoReconnect=true”的用户更正了ping()中的回归问题。
 
    -更正了,PreparedStatement.addBatch()不能与服务器端预处理语句和流式BINARY数据一起工作。
 
    -更正了,对于运行于区分大小写的文件系统上的服务器,DBMD.supportsMixedCase*Identifiers()返回错误值。
 
    -更正了,对于characterSetResults配置属性,不能使用“UTF-8”。
 
    -更正了,连续,在查询中使用了多个函数,查询本应返回非字符串类型,但当临时表解析它们时,返回类型突然变为难以理解的二进制字符串(针对服务器限制采取了相应的避规措施)。此外,还更正了类型为CHAR(n) CHARACTER SET BINARY的字段,使其能够为RSMD.getColumnClassName()和ResultSet.getObject()返回正确/匹配的类。
 
    -更正了,对于“仅正向/只读”结果集(我们支持该方式),DBMD.supportsResultSetConcurrency()未返回“真”。
 
    -更正了,访问时,DBMD.getBestRowIdentifier()的“DATA_TYPE”列导致ArrayIndexOutOfBoundsException(事实上,未返回任何值)。
 
    -检查了将char/varchar列数据转换为数值时的空字符串(''),如果配置属性“emptyStringsConvertToZero”被设为“假”,抛出异常(为了与3.0版的向后兼容,默认情况下,将其设为“真”,但在3.2版中,最可能的默认设置为“假”)。
 
    -更正了,在特定条件下,当未使用服务器端预处理语句时,PreparedStatement.getMetaData()在数据库中插入了空白行。
 
    -Connection.canHandleAsPreparedStatement()现在将尽“最大努力”来识别带有占位符的LIMIT子句,目的在于,对于服务器目前不能将其当作服务器端预处理语句予以处理的语句,为其生成处理措施时,获得较少的错误肯定结果。
 
    -更正了build.xml,如果log4j不可用,不编译log4j日志功能。
 
    -增加了对c3p0连接池的()验证/连接检验器接口的支持,如果服务器可用,该检验器接口将使用轻型“COM_PING”调用。要想使用它,请配置c3p0连接持的“connectionTesterClassName”属性,以使用“com.mysql.jdbc.integration.c3p0.MysqlConnectionTester”。
 
    -更好的检测引用字符串的内外LIMIT,以便驱动程序能更加正确地判断是否可以在服务器上处理预处理语句。
 
    -更正了,当驱动程序试图确定参数计数/类型时,分不清不同数据库中具有相同名称的存储程序。
 
    -为ResultSet和Statement实施增加了最终确定器,以便与JDBC规范兼容,该规范要求,如果它们未明确关闭,在无用单元收集阶段应关闭这些资源。
 
    -更正了,对于具有DECIMAL参数和存储要求的存储程序,如果包含“,”,将失败。
 
    - PreparedStatement.setObject(int, Object, int type, int scale)现在能使用针对BigDecimal实例的标度值。
 
    -更正了,当已有结果集是.close()d时,Statement.getMoreResults()可能抛出NPE。
 
    -性能度量特性现能收集关于SELECT中引用的表数量的信息。
 
    -现在能够自动配置日志系统。如果用户通过URL属性“logger”或系统属性“com.mysql.jdbc.logger”设置了值,那么将使用用户的设置,否则将采用下述步骤自动检测设置:
 
   如果Log4j可用,将使用它,接下来是JDK1.4日志功能,再接下来是STDERR日志功能。
 
    -更正了,即使数据库版本不支持视图,如果请求了视图,DBMD.getTables()不应返回表。
 
    -更正了驱动程序,当在服务器端预处理语句返回的结果集上调用了ResultSet.getBoolean()时,对于“-1”不返回“真”。
 
    -为.jar文件增加了Manifest.MF文件以及实施信息。
 
    -在Field.isOpaqueBinary()中提供了更多测试,以识别晦涩的二进制字段(即具有CHAR(n)和CHARACTER SET BINARY类型的字段),这类字段来自各种标量函数和聚合函数(返回字符串)的输出。
 
    -更正了,出于传统方面的考虑,即使它与JDBC不兼容,也应接受DBMD方法中用于catalog(使用当前值)的Null。将连接属性“nullCatalogMeansCurrent”设置为“假”可禁止它(在C/J 3.2.x中,它是默认设置)。
 
    -更正了,出于传统方面的考虑,即使它与JDBC不兼容,也应接受DBMD中用于名称(“%”)的Null。将连接属性“nullNamePatternMatchesAll”设置为“假”可禁止它(在C/J 3.2.x中,它是默认设置)。
 
02-18-05:版本3.1.7-stable
 
    -更正了,Timestamp关键字列数据需要分离的“_binary”,用于UpdatableResultSet.refreshRow()。
 
    -更正了,对于服务器端预处理语句和可更新结果集,Timestamps错误地转换为字符串。
 
    -检测字符串表单(以前为整数)中的sql_mode变量,并恰当调整字符串的引用方法。
 
    -增加了“holdResultsOpenOverStatementClose”属性(默认为“假”),它能将statement.close()的结果集保持打开状态,或执行相同语句(由Kevin Burton推荐)。
 
    -更正了,在故障切换配置下回退至主连接时的无限递归。
 
    -如果允许了高速缓冲,将禁止4.1.10版之前MySQL-4.1版本的多语句功能(如果以允许的话),这是因为在该配置下,服务器会返回错误的结果。
 
    -更正了configureClientCharset()中的重复代码,该类代码将阻止useOldUTF8Behavior=true的恰当运行。
 
    -删除了“dontUnpackBinaryResults”功能,现在,驱动程序将按原样保存来自服务器端预处理语句的结果(与服务器提供的相同,并在需要时展开)。
 
    -更正了,使用服务器端预处理语句时,模拟定位器破坏了二进制数据。
 
    -更正了ServerPreparedStatement.serverPrepare()的同步事宜,如果在多个线程间共享连接,可能会导致死锁/崩溃。
 
    -默认情况下,驱动程序能通过各种Connection.prepareStatement()的各种变体扫描SQL,以判断它是否是能够在服务器端支持的语句类型,如果不被服务器端支持,会将其作为客户端模拟预处理语句进行处理())。也可以通过在JDBC URL中传递“emulateUnsupportedPstmts=false”禁止该特性。
 
    -从CallableStatement中删除了用作输入/输出参数的“_binary”引介词。
 
    -对于注册为*BINARY的输出参数,总返回byte[]。
 
    -对于PreparedStatement.setObject(n, "true", Types.BIT),将布尔“True”的正确值发送给服务器。
 
    -更正了与连接有关的缺陷,当语句不是服务器端预处理语句时,无法对来自prepareStatement()的语句进行高速缓冲处理。
 
    -使用ResultSet.get(..., cal)和PreparedStatement.set(...., cal)时,如果客户端和服务器均位于GMT(格林威治标准时间)时区,选择进行时间调整的正确方向。
 
    -增加了“dontTrackOpenResources”选项(默认为“假”以便兼容JDBC),对于具有不良特性的应用程序(例如应关闭语句时,却未关闭语句的应用程序),它有助于改善内存的使用。
 
    -更正了,ResultSet.getString()不能保持存储在服务器上的格式,仅当将“noDatetimeStringSync”属性设置为“真”(默认为“假”)时,才能允许缺陷更正。
 
    -更正了使用“usage advisor”而且结果集已关闭时ResultSet.realClose()中的NPE。
 
    -更正了,不创建流式结果集的PreparedStatements。
 
    -不将NULL传给给ResultSet.getNativeConvertToString()中的String.valueOf(),原因在于String.valueOf()会对其进行字符串处理(即返回“null”),对于所述方法,这是错误的。
 
    -更正了,当需要舍入操作以设定标度时,ResultSet.getBigDecimal()抛出异常。如果非舍入性BigDecimal.setScale()失败,驱动程序现在将选择“半向上”舍入模式。
 
    -增加了“useLocalSessionState”配置属性,将其设置为“真”时,JDBC驱动程序将认为应用程序行为良好,并会使用java.sql.Connection提供的方法仅设置autocommit和事务隔离级别,因此,能够在大多数情况下处理这些值,而不引发数据库服务器循环。
 
    -为连接池实施实例的语句增加了enableStreamingResults(),可检查Statement.setFetchSize()是否存在兼容规范的值。调用“Statement.setFetchSize(>=0)”可禁止关于该语句的流式结果。
 
    -增加了对MySQL-5.0.3中BIT类型的支持。驱动程序会将BIT(1-8)当作JDBC的BIT类型对待(映射至java.lang.Boolean),这是因为当声明了“< 9 bits”)时,服务器目前不会发送能确定比特字段(bitfield)大小的足够信息。BIT(>9)将被当作VARBINARY对待,并当调用getObject()时返回byte[]。
 
12-23-04:版本3.1.6-stable
 
    -更正了SocketInputStream.read()的挂起问题,当驱动程序必须直接截取结果集,而不是跟踪结果集末尾的“LIMIT n”时,与Statement.setMaxRows()和多个结果集一起使用时SocketInputStream.read()挂起。
 
    -更正了,DBMD.getProcedures()不考虑catalog参数。
 
12-02-04:版本3.1.5-gamma
 
    -更正了字符串常数和动态字符串之间的比较事宜,或是toUpperCase()d或是toLowerCase()d,以使用Locale.ENGLISH,将其用作英语的覆盖规则。此外,还使用StringUtils.indexOfIgnoreCase()替代了.toUpperCase().indexOf(),以避免创建很短的过渡性字符串实例。
 
    -更正了,服务器端预处理语句不考虑“zeroDateTimeBehavior”属性,而且当使用ResultSet.getObject()时会导致类抛弃异常,这是因为总返回全0字符串。
 
    -更正了批更新和服务器预处理语句有关的问题,与以前的集合相比,如果在给定的批参数集合中发生了类型变更,服务器预处理语句不会检测这类变化,从而导致服务器返回错误“Wrong arguments to mysql_stmt_execute()”。
 
    -解决了当时间戳的字符串表示包含后缀“.”但其后没有数字时的情况。
 
    -更正了,对ResultSet.getNativeString()中以前存在字符串实例的低效检测。
 
    -不抛出针对Connection.releaseSavepoint()的异常。
 
    -解码来自ServerPreparedStatements的日期时,默认情况下使用按会话进行的日历实例(通过设置“dynamicCalendars=true”,设置为早期的性能较低的方式)。
 
    -增加了实验性配置属性“dontUnpackBinaryResults”,它延迟了解包二进制结果集取值的功能,直至请求了它们为止(默认情况下设为“假”)。对于某些usecase/jvm组合,它对无用信息收集器更友好。
 
    -更正了,对来自服务器端预处理语句结果集的UNSIGNED BIGINT,未能正确解包。
 
    -更正了,ServerSidePreparedStatement,分配了不必要的具有短生存时间的对象。
 
    -删除了ResultSet构造函数中有害的新Throwable(),原因在于不良合并(导致任何所创建结果集永远不会使用的新对象),分析时发现。
 
    -更正了在EscapeProcessor.escapeSQL()中过早创建StringBuffer的问题,而且在不需要转义功能时仍返回字符串(防止不必要的对象分配)。分析时发现。
 
    -为可更新结果集中的键比较使用“null-safe-equals”。
 
    -更正了,如果需要0填充,作用在Decimal上的SUM()以及服务器端预处理语句均将忽略标度(由于服务器将其转换为DOUBLE,0填充将结束,将其转换为BigDecimal类型的字符串进行解析时,丢失所有的填充“0”)。
 
    -创建DBMD查询时使用DatabaseMetaData.getIdentifierQuoteString()。
 
    -如果在服务器上LOAD DATA LOCAL INFILE小于“max_allowed_packet”,使用1MB的信息包发送文件。
 
    -更正了,对于多字节字符集,ResultSetMetaData.getColumnDisplaySize()返回错误值。
 
    -通过“autoDeserialize”属性(默认为“假”),能够对保存在BLOB中的java.lang.Objects的自动串并转换功能进行配置。
 
    -修改了Field.isOpaqueBinary()以检测“CHAR(n) CHARACTER SET BINARY”,从而能够支持用于ResultSet.getObject()的固定长度二进制字段。
 
    -使用我们自己的缓冲输入流实施方式来处理java.io.BufferedInputStream的封闭行为。使用“useReadAheadInput=false”可禁止它。
 
    -更正了,当给定主机名的某一地址是IPV6时无法连接到服务器(服务器尚未与IPV6捆绑) 驱动程序现在能够查找给定主机的所有IP地址,并停在接受socket.connect()的第1个地址上。
 
09-04-04:版本3.1.4-beta
 
    -更正了,Connector/j 3.1.3 beta不能正确处理整数(由为了支持Buffer.readInt() -> Buffer.readShort()中的无符号读取操作所作的更改而导致)。
 
    -在DatabaseMetaData.getTables()和getTableTypes()中增加了对VIEW的支持,该类特性现已在MySQL服务器5.0.x版中提供。
 
    -更正了,解包字段元数据时,ServerPreparedStatement.execute*()有时会抛出ArrayIndexOutOfBoundsException。
 
    -优化了整数解析功能,通过“useFastIntParsing=false”属性,允许使用JDK类较慢的解析功能。
 
    -增加了“useOnlyServerErrorMessages”属性,它会使服务器生成的异常中的消息文本仅包含由服务器发送的文本(与SQLState“标准”介绍中给出的相反,此时文本后面还包括服务器的错误消息)。默认情况下,该属性被设置为“真”。
 
    -更正了,如果前面的Null已被返回,对于原语,ResultSet.wasNull()不工作。
 
    -如果“enablePacketDebug=true”,跟踪信息包的序列号,如果收到的信息包次序混乱,抛出异常。
 
    -更正了,使用预处理语句时,对于字符串,ResultSet.getObject()返回错误类型。
 
    -两次调用MysqlPooledConnection.close()(虽然也是应用程序错误)会导致NPE。已更正。
 
    -更正了,处理DECIMAL类型的返回值的ServerPreparedStatements不工作。
 
    -更正了,对于来自4.1.x版预处理语句的伪位类型,ResultSet.getObject()不返回布尔类型(在针对伪位类型的getObject()中使用二进制编码的结果集模糊测试时,它提供了避免额外类型转换的快捷方式)。
 
    -现在能够在“LOAD DATA LOCAL INFILE”语句中使用URL,而且驱动程序将使用Java的内置处理程序来检索数据,并将其发送到服务器。默认情况下不允许该特性,要想使用它,必须将“allowUrlInLocalInfile”连接属性设置为“真”。
 
    -对于在ResultSet.get*()的数值上执行的截取操作,驱动程序将更加严格,而且当检测到截取操作时将抛出SQLException。将“jdbcCompliantTruncation”设置为“假”,可以禁止该功能(在默认情况下允许该功能,这是因为该功能是兼容JDBC所需的)。
 
    -从结果集读取“全零”日期时间值时,增加了三种处理它们的方法,“exception”,(默认值),用代码为“S1009”的SQLState抛出SQLException;“convertToNull”,返回NULL而不是数据;以及“round”,对日期进行舍入处理,使之成为最接近的值,即“0001-01-01”。
 
    -更正了ServerPreparedStatement,使之能够“以脱线”方式读取预处理语句元数据,尽管在目前它是取代在任何时侯均不工作的MysqlIO.clearInputStream()的占位符,之所以如此,是因为目前尚未从服务器读取数据。通过抛出ArrayIndexOutOfBoundExceptions的erverPreparedStatements,它修正了用户遇到的偶发性错误。
 
    -加载资源捆包时使用com.mysql.jdbc.Message的类加载器,应能更正调用器的类加载器不能确定资源捆包位置时出现的偶发性错误。
 
07-07-04:版本3.1.3-beta
 
    -对CallableStatements的输出参数名进行Mangle处理,使得在与用户变量名一起使用时,这类名称不会崩溃。
 
    -增加了对CallableStatements中INPUT参数的支持。
 
    -更正了,为服务器端预处理语句发送的null比特掩码不正确。
 
    -默认情况下使用SQL的标准SQL状态,除非将“useSqlStateCodes”属性设置为“假”。
 
    -增加了信息包调试代码(请参见“enablePacketDebug”属性文档)。
 
    -为MySQL错误编号增加了常量(可公共访问,请参见com.mysql.jdbc.MysqlErrorNumbers),并增加了生成映射的能力,能够将厂家代码映射为驱动程序使用的SQLStates(出于文档编制目的)。
 
    -使更多消息更为具体(正在努力)。
 
    -更正了,在检索具有预处理语句和二进制协议特性的mediumint列时发生错误。
 
    -当“useTimezone=true”时,在MySQL-4.1.3中支持新的时区变量。
 
    -支持无符号数值作为预处理语句返回的类型。对于“bigint unsigned”类型,这也会导致ResultSet.getObject()中的内容发生变化,“bigint unsigned”类型用于返回BigDecimal实例,现在它将返回java.lang.BigInteger实例。
 
06-09-04:版本3.1.2-alpha
 
    更正了为参数(如char(), varchar())指定大小时存储程序参数的解析信息。
 
    -通过“cacheCallableStmts”属性,允许对可调用语句进行高速缓冲处理。
 
    -更正了下述问题:未为存储程序指定输出参数时,发出虚假查询来检索输出参数,从而导致服务器语法错误。
 
    -更正了在CallableStatement.setOutputParameters()中没有任何参数会导致NullPointerException的问题。
 
    -删除了MysqlIO.changeUser()中的异常捆包。
 
    -更正了关于发送大型查询分离信息包方面的问题,也允许发送大信息包的nio功能。
 
    -为ServerPreparedStatement增加了.toString()功能,如果你正在调试作为预处理语句(显示为服务器应处理的SQL)的查询,它应有所帮助。
 
    -增加了“gatherPerformanceMetrics”属性,以及用于控制在何时/何处记录这类信息的多种属性(更多信息请参见相关文档)。
 
    -调用.close()时,ServerPreparedStatements实际上不能取消对服务器端资源的分配。
 
    -增加了“logSlowQueries”属性,以及“slowQueriesThresholdMillis”属性,以控制应在何时将查询视为“缓慢”。
 
    -相对于registerOutParameter()中隐含的顺序,正确地将输出参数映射到prepareCall()中给定的位置,;更正了。
 
    -对于版本等于高于4.1.0的服务器,能正确地检测字符集。
 
    -整理了服务器属性的检测功能。
 
    -对于版本等于高于4.1.2的服务器,支持用于参数元数据的占位符。
 
    -更正了,getProcedures()未返回结果集中的任何进程。
 
    -更正了,getProcedureColumns()不能与程序名的通配符一起使用。
 
    -更正了,DBMD.getSQLStateType()返回不正确的值。
 
    -增加了“connectionCollation”属性,如果给定字符集的默认校对不恰当,驱动程序将在连接初始过程中发出“set collation_connection=...”查询。
 
    -更正了在MySQL-5.0.0上运行时的DatabaseMetaData.getProcedures()问题(在5.0.1和5.0.0间,“show procedure status”的输出有所不同)。
 
    -更正了,getWarnings()返回SQLWarning而不是DataTruncation。
 
    -对于版本为5.0.0或5.0.1的服务器,不要启用服务器端预处理语句,这是因为,它们与驱动程序使用的“4.1.2+”风格不兼容(驱动程序预计返回的信息并不存在,因而挂起)。
 
02-14-04:版本3.1.1-alpha
 
    -更正了与不使用客户端预处理语句的UpdatableResultSets有关的缺陷。
 
    -当MySQL不提供字符集并将JVM设置为多字节编码时,更正了将字节转换为ASCII时的字符编码事宜(通常会影响数值检索)。
 
    -将服务器预处理语句的“未知”数据类型解包为字符串。
 
    -为服务器预处理语句实现了长数据类型(Blob、Clob、InputStreams、Readers)。
 
    -为MySQL-4.1和更高版本实现了Statement.getWarnings()(使用“SHOW WARNINGS”)。
 
    -默认结果集类型更改为TYPE_FORWARD_ONLY(兼容JDBC)。
 
    - 结果集类型和并发性的集中设置。
 
    -再次确定了连接属性的设置方式和显示为DriverPropertyInfo的方式,以及Connection和DataSource属性。
 
    -支持NIO。在支持NIO的平台上使用“useNIO=true”。
 
    -支持SAVEPOINTs(MySQL >= 4.0.14或4.1.1)。
 
    -支持“mysql_change_user()...”,请参见“com.mysql.jdbc.Connection”中的changeUser()方法。
 
    -减少了平均查询中调用的方法数目,使之更有效率。
 
    -自动再连接时重新处理预处理语句。任何遇到的错误均被延迟,直至首次尝试再执行经过重新处理的语句为止。
 
    -按照JDBC规范,确保在预处理语句上执行查询前给出的警告是明确的(目前,我们支持警告功能)。
 
    -在ConnectionProperties中,支持“旧的”profileSql大写特性。该属性已受到冷落,应尽量使用“profileSQL”。
 
    -优化了Buffer.readLenByteArray(),以便当长度为0时返回共享的空字节数组。
 
    -在对.execute*()的多次调用之间,允许保留PreparedStatement.setBlob()的内容。
 
    -处理了EscapeProcessor中的0长度令牌(由可调用语句转义语法导致)。
 
    -在UpdatableResultSet中的删除/更新/插入行操作上,检查关闭的连接。
 
    -更正了检查UpdatableResultSet中的所有主键时对表别名的支持事宜。
 
    -删除了useFastDates连接属性。
 
    -对来自JNDI Refs的数据源属性进行了正确的初始化,包括明确指定的URL。
 
    -对于版本为5.0.0或更高的MySQL,DatabaseMetaData现在能通报supportsStoredProcedures()。
 
    -更正了Connection.prepareCall()中的堆栈溢出问题(不良合并)。
 
    -对低于1.4版的JDK,更正了对DateTimeValue中Calendar.getTimeInMillis()的IllegalAccessError(非法访问错误)。
 
    -更正了,对于非“%”列名,DatabaseMetaData.getColumns()未返回正确的列顺序信息。
 
    -合并了数据类型映射的更正事项,从MySQL类型“FLOAT”到java.sql.Types.REAL(自3.0版起)的数据类型映射。
 
    -检测用于RSMD.isCaseSensitive()的列校对。
 
    -更正了与发送大于16M查询有关的问题。
 
    -为CallableStatement增加了命名和索引式输入/输出参数支持。
MySQL-5.0.x或更高版本。
 
    -更正了ServerPreparedStatement.setTimestamp()中的NullPointerException,以及ServerPreparedStatement.setTimestamp()、setDate()中的年月差异。
 
    -为build.xml中的一致性和递归/单元测试增加了拥有多个数据库/JVM目标的能力。
 
    -更正了访问ServerPreparedStatements和其结果集中某些日期时间功能时的NPE和不良年月转换问题。
 
    -显示关闭连接的位置和原因(用于帮助调试)。
 
    -实现了CommunicationsException,它能尝试判断与服务器失去通信的原因,并能在调用.getMessage()时显示可能的原因。
 
    -更正了,二进制编码结果集中数值类型的NULL值会导致NullPointerExceptions。
 
    -实现了Connection.prepareCall(),DatabaseMetaData.getProcedures(),以及getProcedureColumns()。
 
    -调用clearParameters()时,通过发送COM_RESET_STMT至服务器,复位了ServerPreparedStatement中的“long binary”参数。
 
    -自3.0版起,合并了预处理语句高速缓冲和.getMetaData()支持。
 
    -解包来自服务器端预处理语句的结果时,在某些情况下,对于TimeUtil.fastDate/TimeCreate()的年份,会出现off-by-1900错误,更正了该错误。
 
    -更正了,getTables()中的字符集转换事宜。
 
    -实现了由语句或存储程序返回的多个结果集。
 
    -更正了,服务器端预处理语句未正确返回数据类型“YEAR”。
 
    -允许对来自服务器端预处理语句的结果集进行流处理。
 
    -更正了,使用滚动结果集和服务器端预处理语句时出现类舍弃异常。
 
    -自3.0版起,合并了无缓冲输入代码。
 
    -更正了不能通过存取器恰当显示的ConnectionProperties,并整理了ConnectionProperties代码。
 
    -更正了,在服务器端预处理语句中,在任何情况下均不能正确编码NULL字段。
 
    -更正了将数字写入缓冲以发送预处理语句执行请求时出现的罕见缓冲区下溢问题。
 
    -对于交付的驱动程序,使用了文档的DocBook版。
 
02-18-03:版本3.1.0-alpha
 
    -增加了“requireSSL”属性。
 
    -增加了“useServerPrepStmts”属性(默认为“假”)。当服务器版本支持并将该属性设置为“真”时(4.1和更高版本),驱动程序将使用服务器端预处理语句。目前其默认设置为“假”,除非所有的捆绑/获取功能均已实施。目前,仅为4.1版的服务器端预处理语句实现了DML预处理语句。
 
    -跟踪打开的语句,并在调用Connection.close()时关闭所有打开的语句(JDBC兼容)。
 
06-23-05:版本3.0.17-ga
 
    -更正了,当useTimeZone='true'而且服务器时区不同于客户端时区时,Timestamp/Time转换出现方向错误。
 
    -更正了,DatabaseMetaData.getIndexInfo()忽略“唯一”参数。
 
    -支持新的协议类型“MYSQL_TYPE_VARCHAR”。
 
    -增加了“useOldUTF8Behavoior”配置属性,连接到MySQL-4.1或更高版本且字符编码为“utf-8”时,该属性能使JDBC驱动程序的行为方式类似于在MySQL-4.0.x和更早版本下的行为方式。
 
    -更正了,调用getConnection()时,从连接池创建的语句返回实际连接而不是逻辑连接。
 
    -更正了,在静态SQL字符串中,PreparedStatements不能正确编码Big5(以及其他多字节)字符集。
 
    -更正了,启动了故障切换的连接(由于主连接失败)从不再次尝试主连接。
 
    -更正了,PreparedStatement.fixDecimalExponent()增加额外“+”,使得MySQL服务器无法解析数值。
 
    -更正了,Timestamp关键字列数据需要分离的“_binary”,用于UpdatableResultSet.refreshRow()。
 
    -反向移植了来自Connector/J 3.1的SQLState代码映射,使用连接属性“useSqlStateCodes=true”可启用它,在本版本中默认为“假”,以免破坏传统应用程序(对于Connector/J 3.1,默认为“真”)。
 
    -更正了,PreparedStatement.fixDecimalExponent()增加额外“+”,使得MySQL服务器无法解析数值。
 
    -转义序列{fn convert(..., type)}现在支持由SQL预先设定的ODBC类型。
 
    -更正了configureClientCharset()中的重复代码,该类代码将阻止useOldUTF8Behavior=true的恰当运行。
 
    -通过更正行数计数器的环绕式处理程序,能正确处理大于20亿行的流式结果集。
 
    -更正了,MS932、SHIFT_JIS和Windows_31J不接受针对sjis的别名。
 
    -更正了(更正#7607的同时),为sjis增加了CP943别名。
 
    -更正了,与预处理语句一起使用多字节字符集时,要求对二进制数据进行十六进制转义处理。
 
    -更正了,DBMD.getIndexInfo()的NON_UNIQUE列返回倒置值。
 
    -解决了服务器,无法将DATE/TIME/TIMESTAMP/TIMESTAMP列CURRENT_*的默认值与“字符串”值区别开,因此,插入默认值时,UpdatableResultSet.moveToInsertRow()会生成不良的SQL。
 
    -更正了,将“EUCKR”作为“SET NAMES euc_kr”发送,MySQL-4.1以及更高版本不能理解该特性。
 
    -根据服务器的版本,DatabaseMetaData.supportsSelectForUpdate()返回正确值。
 
    -对于含别名Windows-31J、CP934、MS932的双字节字符集,对于PreparedStatement.setBytes(),采用十六进制转义特性。
 
    -增加了对“EUC_JP_Solaris”字符编码的支持,映射到“eucjpms”的MySQL编码(从3.1版开始的反向移植)。它只能在支持eucjpms的服务器山工作,也就是说5.0.3或更高版本。
 
11-15-04:版本3.0.16-ga
 
    -连接至MySQL-4.1或更高版本且再次使用连接池和/或Connection.changeUser()时,将再次发出字符集配置命令。
 
    -更正了ResultSetMetaData.isReadOnly(),以便在连接至MySQL-4.1或更高版本时,能根据“原始的”表名和列名,检测不可写的列。
 
    -更正了,当ResultSet.updateByte()位于插入行上时抛出ArrayOutOfBoundsException。
 
    -更正了DatabaseMetaData.getTypes(),对于NUMERIC类型,它返回不正确的(非负)标度。
 
    -更正了,Buffer.readString(string)中的“off-by-one”问题。
 
    -通过“tinyInt1isBit”属性,使得能够对TINYINT(1) -> BIT/Boolean转换进行配置(为了与JDBC兼容,默认为“真”)。
 
    -如果服务器版本大于等于4.1.1,在连接建立过程中仅设置“character_set_results”。
 
    -更正了回归问题,其中,useUnbufferedInput默认为“假”。
 
    -更正了,ResultSet.getTimestamp()作用在具有TIME的列上时失败。
 
09-04-04:版本3.0.15-production
 
    -更正了,对于GBK,StringUtils.escapeEasternUnicodeByteStream仍被破坏。
 
    -更正了,对于autoReconnect的故障切换,对任何主机均不使用端口“#”,而且不重试所有主机。(警告:需要更改SocketFactory connect()方法的特征,它目前是公共套接字连接(String host,int portNumber,Properties props)。也能次,必须更改任何第三方套接字实施方式以支持该特征。
 
    -当它们已被关闭并被返回到连接池时,由MysqlConnectionPoolDataSource创建的逻辑连接将发出rollback()。如果你的应用服务器/连接池已帮助你完成了该任务,可以将“rollbackOnPooledClose”属性设置为“假”以避免额外的rollback()开销。
 
    -删除了结果集中对checkRowPos()的多余调用。
 
    -更正了,在DBMD.getTypeInfo()中,“DOUBLE”映射了两次。
 
    -增加了FLOSS许可豁免。
 
    -更正了,在PooledConnection上调用两次.close()将导致NPE。
 
    -更正了和,对于无符号列,DBMD.getColumns()返回错误的JDBC类型。这也会影响对RSMD.getColumnType()和RSMD.getColumnTypeNames()方法中所有数值类型的类型映射,以确保DBMD.getColumns()的类似类型与RSMD.getColumnType()和RSMD.getColumnTypeNames()返回的类型匹配。
 
    -分发版命名方案中的“Production”-“GA”。
 
    -更正了,对于非数值类型,RSMD.getPrecision()返回0(对于非二进制类型,应返回字符的最大长度,对于二进制类型,应返回最大字节长度)。根据服务器发回的长度(在网络协议层,服务器不区分TINYBLOB、BLOB、MEDIUMBLOB或LONGBLOB),它还更正了针对BLOB类型的RSMD.getColumnType()和RSMD.getColumnTypeName()映射。
 
    -更正了,结果集应在“.close()”中释放Field[]实例。
 
    -更正了,如果结果集已关闭,ResultSet.getMetaData()不应返回未正确初始化的元数据,而是应抛出SQLException。此外,在对实例级别的字段(.close()过程中取消的字段)进行操作之前,通过调用checkClosed(),它还更正了getRow()、getWarnings()和遍历方法。
 
    -从4.1.x版服务器开始,能解析新的时区变量。
 
    -与MySQL-4.1.x或更高版本连接时,为PreparedStatement.setBytes()和set*Stream()使用“_binary”引介词,以防止在字符集转换过程中出现错误判断。
 
05-28-04:版本3.0.14-production
 
    -更正了URL解析错误。
 
05-27-04:版本3.0.13-production
 
    -更正了,无服务器名称时,不能使用MySQLDatasource。
 
    -更正了,使用MysqlConnectionPoolDataSource时出现“No Database Selected”(未选择数据库)。
 
    -更正了,对于批插入,PreparedStatement.getGeneratedKeys()方法仅返回1个结果。
 
05-18-04:版本3.0.12-production
 
    -为TYPE_NAME列中的DatabaseMetaData.getColumns()输出增加了无符号属性。
 
    -增加了“failOverReadOnly”属性,允许最终用户配置出现故障切换时的连接状态(只读/可写)。
 
    -自3.1开始,反向移植了“change user”和“reset server state”功能,允许MysqlConnectionPoolDataSource的客户端复位连接池上getConnection()的服务器状态。
 
    -使用MySQL-4.1或更高版本时,不对SJIS/GBK/BIG5进行转义处理。
 
    -允许MysqlDataSource和MysqlConnectionPool数据源使用“url”参数,以便能够从内部应用服务器传递其他属性。
 
    -将复制键和外键错误映射到“23000”的SQLState。
 
    -自3.1开始,反向移植了文档编制工具。
 
    -返回用于结果集的创建语句,该结果集由getGeneratedKeys()创建()。
 
    -允许作为参数将java.util.Date发送到PreparedStatement.setObject(),将其转换为Timestamp类型以保持完整精度()。
 
    -使用setBytes()和/或setBinary/CharacterStream()时,不截取BLOB/CLOB()。
 
    -连接时,在使用“SHOW COLLATION”的MySQL-4.1.0和更高版本上,为字段级字符集动态配置字符集映射。
 
    -将“binary”字符集映射到“US-ASCII”,以支持4.1.2和更高版本服务器的DATETIME字符集识别功能。
 
    -在初始化过程中使用“SET character_set_results”,允许将结果集的任何字符集返回到驱动程序。
 
    -在>= 4.1.0的MySQL上发出“SET NAMES”之前,在连接至编码查询的过程中,使用返回的charsetnr。
 
    -为ResultSetMetaData(getColumnCharacterEncoding()和getColumnCharacterSet())增加了Helper(助手)方法,允许最终用户查看驱动程序认为应在列上使用的字符集。
 
    -在>= 4.1.0的MySQL上仅设置character_set_results。
 
    -更正了,StringUtils.escapeSJISByteStream()不能正确处理所有的东方双字节字符集。
 
    -将StringUtils.escapeSJISByteStream()重新命名为更贴切的escapeEasternUnicodeByteStream()。
 
    -更正了,在URL中未指定数据库将导致MalformedURL exception。
 
    -如果使用了characterEncoding属性,自动将MySQL编码名称转换为Java编码名称。
 
    -增加了在某些JVM上能识别的编码名称,以更正错误地将其逆向映射为MySQL编码名称的问题。
 
    -为所有单元测试使用junit.textui.TestRunner(允许在Ant或Eclipse以外的命令行上运行它们)。
 
    -更正了,UpdatableResultSet不能获取moveToInsertRow()的默认值。
 
    -更正了,不一致的列类型通报。服务器仍不能正确返回*BLOBs *TEXT的所有类型,因此驱动程序也不能正确返回它们。
 
    -更正了,DBMD.getSQLStateType()返回不正确的值。
 
    -更正了PreparedStatement.setString()和东方字符编码中的递归问题。
 
    - 增加了对StringRegressionTest 4.1-unicode的识别。
 
02-19-04:版本3.0.11-stable
 
    -通过“characterEncoding”属性将编码方式强制设为“utf8”或“utf-8”时,触发“SET NAMES utf8”。以前,只能用Java风格的“utf-8”编码名称才能触发该操作。
 
    -AutoReconnect时间的增长速度快于指数速度()。
 
    -更正了故障切换总跳至列表中最后1个主机的问题()。
 
    -增加了“useUnbufferedInput”参数,它也是目前的默认参数(因JVM事宜,http://developer.java.sun.com/developer/bugParade/bugs/4401235.html)。
 
    -检测服务器上lower_case_table_names的“on/off”,或“1”、“2”、“3”形式。
 
    -为ResultSetMetaData.getColumnClassName()的TINYINT和SMALLINT类型返回“java.lang.Integer”(更正了)。
 
    -为ResultSetMetaData.getColumnClassName()的FLOAT类型返回“java.lang.Double”(更正了)。
 
    -为ResultSetMetaData.getColumnClassName()的BINARY、VARBINARY和LONGVARBINARY类型返回“[B”而不是“java.lang.Object”(兼容JDBC)。
 
    -在由ConnectionPoolDataSource创建的所有实例上发出连接事件。
 
01-13-04:版本3.0.10-stable
 
    -在PreparedStatement解析中,当位于“字符串”内时,不对引用的ID进行计数(更正了)。
 
    -关于PacketTooLargeException的“Friendlier”异常消息()。
 
    -从3.1版开始,反向移植了对checkUpdatability()方法中别名表和UpdatableResultSets的补丁。
 
    -更正了使用Statement.setMaxRows()时出现的ArrayIndexOutOfBounds异常()。
 
    -更正了,处理未正确读取的大BLOB和分离信息包。
 
    -更正了Statement.getGeneratedKeys()和REPLACE语句的递归问题。
 
    -更正了,如果结果集是不可更新的,对ResultSet.updateFoo()的后续调用将导致NPE。
 
    -确定了4.1.1风格的auth,无密码。
 
    -更正了,外键列的顺序与DatabaseMetaData.getImported/Exported/CrossReference()不一致。
 
    -更正了,DatabaseMetaData.getSystemFunction()返回错误函数“VResultsSion”。
 
    -更正了,未正确检查交叉数据库可更新结果集的可更新性。
 
    -对于MySQL LONGTEXT类型,DatabaseMetaData.getColumns()应返回Types.LONGVARCHAR。
 
    -作用在TINYINT和SMALLINT列上的ResultSet.getObject()应返回Java类型“Integer”()。
 
    -增加了“alwaysClearStream”连接属性,它会使驱动程序在每次查询前清空输入流上任何余留的数据。
 
    -增加了更具描述性的错误消息“Server Configuration Denies Access to DataSource”(服务器配置拒绝对数据源的访问),并能从服务器上检索消息。
 
    -如果已发生变化,Autoreconnect代码在红心连接时不设置catalog。
 
    -实现了ResultSet.updateClob()。
 
    -对于CHAR/VARCHAR列,ResultSetMetaData.isCaseSensitive()返回错误值。
 
    -更正了,不尊重连接属性“maxRows”。
 
    -更正了,在DBMD.extractForeignKeyFromCreateTable()中,创建语句的次数太多。
 
    -更正了,支持转义序列{fn convert ... }
 
    -更正了,当参数编号等于参数数目+1时,ArrayIndexOutOfBounds。
 
    -更正了,当SELECT查询中有多个重复列名时,ResultSet.findColumn()应使用第1个匹配的列名(兼容JDBC)。
 
    -从PreparedStatement.setTimestamp()中删除了静态同步瓶颈。
 
    -从SingleByteCharsetConverter的实例方法中删除了静态同步瓶颈。
 
    -允许通过“cachePrepStmts”、“prepStmtCacheSize”和“prepStmtCacheSqlLimit”属性,对预处理语句的解析步骤进行高速缓冲处理(默认情况下禁止)。
 
    -加快了PreparedStatements的解析操作,只要可能,尽量采用一次性方式。
 
    -更正了在小应用程序中使用时的安全异常问题(小应用程序不能读取LOAD DATA LOCAL INFILE所需的系统属性“file.encoding”)。
 
    -为SQLStates使用常数。
 
    -连接至MySQL-4.1.0或更高版本时,将字符集“ko18_ru”映射到“ko18r”。
 
    -确保Buffer.writeString()保存在“\0”之外的空间内。
 
    -更正了“connect w/ JDK-1.4.0”上的异常“未知字符集danish”。
 
    -更正了SQLError中的映射功能,用“41000”SQLStates通报死锁状态。
 
    -“maxRows”属性会影响内部语句,因此,应检查为驱动程序创建的所有内部语句,并在不是内部语句的情况下将其设为0。
 
10-07-03:版本3.0.9-stable
 
    -ResultSet和PreparedStatement中更快的日期处理代码(不再使用用来同步静态日历的Date方法)。
 
    -更正了对Buffer.readString()中缓冲区末端的测试。
 
    -更正了ResultSet.previous()行为方式,当位于结果集的第1行上时,将当前位置移到结果集之前(bugs.mysql.com )。
 
    -更正了当已使用setMaxRows()而且在查询中包含LIMIT子句时发出伪查询的语句和PreparedStatement。
 
    -更正了,当主键值包含需要转义的值时refreshRow不工作(以双倍转义结束)。
 
    -提取DatabaseMetaData中的外键信息时,支持InnoDB约束名,和(由Parwinder Sekhon提出)。
 
    -从3.1版开始,反向移植了4.1协议变化(服务器端SQL状态,新字段信息,较大的客户端能力标志,与数据库的连接等)。
 
    -更正了UpdatableResultSet,作用在插入行上时,为getXXX()返回值()。
 
    -调用moveToInsertRow()时,能够用默认的列值加载UpdatableResultSet中的insertRow()。
 
    -对于指定为NULL的默认值,DatabaseMetaData.getColumns()未返回NULL。
 
    -将默认的语句类型/并发行更改为TYPE_FORWARD_ONLY和CONCUR_READ_ONLY(兼容规范)。
 
    -如果MySQL不支持,不要尝试或复位再连接上的隔离级别。
 
    -不将SQLExceptions封在RowDataDynamic内。
 
    -如果useTimezone==true,不更改时间戳TZ两次()。
 
    -更正了大的分离信息包处理中存在的回归问题()。
 
    -更好地诊断“流式”结果集异常中的错误消息。
 
    -在空结果集上抛出关于ResultSet.getXXX()的异常(在某些情况未被俘获)。
 
    -不隐藏关于在I/O层中抛出异常的消息。
 
    -关闭连接池时或在具有已打开连接的PooledConnection.getConnection()上,不触发连接关闭时间()。
 
    -截短+/- INF(最小和最大代表值,对于MySQL中的类型),以及NaN(至0,对于setDouble/setFloat()),当服务器不支持+/- INF或NaN时,就语句发出警告。
 
    -更正了,当字符集为SJIS或GBK时,以及“\”出现在非转义输入中时对“\”的双转义处理。
 
    -清空“流式”结果集未使用行的输入流时,每100行均有当前线程yield(),以免独占CPU时间。
 
    -更正了,DatabaseMetaData.getColumns()弄不清字符列中的关键字“set”。
 
    -更正了与Statement.setMaxRows()相关的死锁事宜。
 
    -更正了CLOB.truncate(),。
 
    -优化了CLOB.setChracterStream(), 。
 
    -使databaseName、portNumber以及serverName成为MysqlDataSourceFactory的可选参数()。
 
    -修订了,导致字符127损坏的ResultSet.get/setString。
 
    -从3.1版开始,反向移植了针对4.11和更高版本的auth.更改。
 
    -增加了com.mysql.jdbc.util.BaseBugReport,以帮助创建缺陷报告的测试范例。
 
    -通过将“clobberStreamingResults”属性设置为“真”(默认为“假”),为“clobber”流式结果增加了属性。这会使“流式”结果集被自动关闭,如果在所有数据尚未从服务器中读取完之前,执行了另一查询,正在从服务器流出的任何未完成数据均将被舍弃。
 
05-23-03:版本3.0.8-stable
 
    -允许在Driver.getPropertyInfo()中使用伪URL。
 
    -与Statement.getGeneratedKeys()一起使用多值INSERTS时,返回所生成键的列表。
 
    -与文件名和“LOAD DATA [LOCAL] INFILE”一起使用JVM字符集。
 
    -更正了与Connection.cleanup()有关的无限循环。
 
    -将Ant目标“compile-core”更改为“compile-driver”,并使测试套件编译成为单独的目标。
 
    -更正了未获得关于Statement.executeUpdate()的集合的结果集,在某些情况下,它会影响getGeneratedKeys()和getUpdateCount()。
 
    -字符串中的Unicode字符0xFFFF会导致驱动程序抛出ArrayOutOfBoundsException()。
 
    -使用“REPLACE”语句时返回所生成键的正确数目。
 
    -更正了在某些情况下检测服务器字符集的问题。
 
    -更正了使用极大信息包时的行数据解码错误。
 
    -优化了行数据解码。
 
    -在已关闭预处理语句上执行操作使抛出异常。
 
    -更正了SJIS编码缺陷,感谢Naoto Sato。
 
    -优化了EscapeProcessor的使用。
 
    -允许对Statement.close()的多次调用。
 
04-08-03:版本3.0.7-stable
 
    -更正了调用错误事件类型的MysqlPooledConnection.close()。
 
    -更正了PreparedStatement.setClob()中的StringIndexOutOfBoundsException。
 
    - 4.1版列元数据更正。
 
    -从Driver.connect()和Driver.acceptsUrl()中删除了同步功能。
 
    -事务过程中的IOExceptions现在会导致关闭连接。
 
    -更正了ResultSetMetaData.getColumnTypeName()中丢失的“YEAR”类型转换。
 
    -对于DBMD.getPrimaryKeys(),不提取以“pri”作为主键起始的索引。
 
    -试图在强制关闭的连接上执行操作时抛出SQLExceptions(即,通信链路失败时)。
 
    -现在,可以使用Connection.setProfileSql(boolean)来打开或关闭仿型功能。
 
    更正了与数据库元数据有关的字符集事宜(字符集不能正确获取集合)。
 
    -与MySQL-4.1或更高版本连接时,现在能够为别名表/列创建可更新结果集。
 
    -更正了文件大于“max_allowed_packet”时的“LOAD DATA LOCAL INFILE”缺陷。
 
    -对于GBK和Big5字符集,更正了0x5c ('\')字符的转义功能。
 
    -更正了基础字段为DATE类型时的ResultSet.getTimestamp()问题。
 
    -保证了来自alignPacketSize()的信息包大小不超过MAX_ALLOWED_PACKET(JVM缺陷)。
 
    -autoReconnecting(自动再连接)时不复位Connection.isReadOnly()。
 
02-18-03:版本3.0.6-stable
 
    -更正了ResultSetMetaData,当catalog未知时返回""。更正了与Sun CachedRowSet有关的NullPointerExceptions。
 
    -更正了DBMD.getTypeInfo()和DBMD.getColumns()为TEXT/BLOB类型中的精度返回不同值的问题。
 
    -通过将“ignoreNonTxTables”设置为“真”,在回退期间(兼容性/可用性),允许忽略“non transactional tables”(非事务表)告警。
 
    -更正了在初始连接上SQLExceptions耗尽的问题。
 
    -更正了Statement.setMaxRows(),当其不需要时,停止发送“LIMIT”类型的查询(性能)。
 
    -整理了语句查询/方法失配测试(即,不允许与.executeQuery()一起使用INSERT)。
 
    -在ResultSet遍历方法中增加了更多检查,以获取何时处于关闭状态的信息。
 
    -更正了ResultSetMetaData.isWritable()以返回正确值。
 
    -为DBMD.nullsAreSortedAtStart增加了不同NULL分类行为的“窗口”(4.0.2至4.0.10,真,其他为“否”)。
 
    -实现了Blob.setBytes()。仍需要将所得的Blob传回到可更新ResultSet(结果集)或PreparedStatement以保持变更,这是因为MySQL不支持“定位器”。
 
    -从Connector/J 3.1反向移植了4.1字符集字段。
 
01-22-03:版本3.0.5-gamma
 
    -更正了解包字段时对某些查询Buffer.fastSkipLenString()导致ArrayIndexOutOfBounds异常的问题。
 
    -为Connection.getTypeMap()实现了空的TypeMap,以便某些第三方应用程序能与MySQL一起工作(IBM WebSphere 5.0连接池)。
 
    -为DBMD.getColumns()增加了丢失的LONGTEXT类型。
 
    -当MySQL版本支持时,Connection.getTransactionIsolation()能从数据库检索TX_ISOLATION,而不是实例变量。
 
    -引用DatabaseMetaData.getColumns()、getPrimaryKeys()、getIndexInfo()、getBestRowIdentifier()中的表名。
 
    -大幅度降低了PreparedStatements中setBinaryStream()所需的内存。
 
    -更正了ResultSet.isBeforeFirst()处理空结果集方面的问题。
 
    -为外键元数据增加了“更新”选项。
 
 
01-06-03:版本3.0.4-gamma
 
    -为Connection.setCatalog增加了对数据库名的引用ID。
 
    -在PreparedStatement分析程序中增加了对引用ID的支持。
 
    -对于setByte(),在PreparedStatements中,流线式字符转换和byte[]处理。
 
    -通过与MysqlIO共享出站信息包,降低了PreparedStatements的内存占用。
 
    -增加了“strictUpdates”属性,能够对可更新结果集的大量“正确性”检查进行控制。如果希望获得更快的可更新结果集,并使用主键通过作用在表上的SELECT创建了结果集,而且在查询中选择了所有的主键,应将其设置为“假”。
 
    -增加了对4.0.8风格大信息包的支持。
 
    -更正了PreparedStatement.executeBatch()参数重写的问题。
 
12-17-02:版本3.0.3-dev
 
    -将SingleByteCharConverter中的charsToByte更改为非静态类型。
 
    -更改了SingleByteCharConverter,以使用各转换器的空闲初始化特性。
 
    -更正了Fields.java中的字符集处理功能。
 
    -实现了Connection.nativeSQL()。
 
    -更可靠的转义标志“-- recognize '--'”注释,并允许嵌套式转义序列(请参见testsuite.EscapeProcessingTest)。
 
    -DBMD.getImported/ExportedKeys()现在能处理每个表上的多个外键。
 
    -更正了对某些浮点类型ResultSetMetaData.getPrecision()返回错误值的问题。
 
    -更正了ResultSetMetaData.getColumnTypeName()对TEXT类型返回BLOB,对BLOB类型返回TEXT的问题。
 
    -对于4.1和更高版本服务器,更正了Buffer.isLastDataPacket()。
 
    -增加了CLIENT_LONG_FLAG,以便能获得更多的列标志(isAutoIncrement()最重要)。
 
    -由于上述原因,实现了ResultSetMetaData.isAutoIncrement()以使用Field.isAutoIncrement()。
 
    -在DatabaseMetaData方法中比较表名且在服务器中允许时,优先考虑“lower_case_table_names”。
 
    -一些MySQL-4.1协议支持(扩展字段信息)。
 
    -使用非别名表/列名和数据库名,以完全限定UpdatableResultSet中的表和列(需要MySQL-4.1或更高版本)。
 
    -允许用户通过“continueBatchOnError”属性(默认为“真”)更改Statement/PreparedStatement.executeBatch()的行为。
 
    -在更多连接方法(createStatement、prepareStatement、setTransactionIsolation、setAutoCommit)中检查关闭的连接。
 
    -更可靠地实现了可更新结果集。检查表的所有主键是否已被选择。
 
    -如果在服务器的配置允许,“LOAD DATA LOCAL INFILE ...”现在能正常工作。不能使用“allowLoadLocalInfile”属性关闭它(请参见README)。
 
    -在单字节字符集中,对于未知的字符转换,用“?”替代“\0”。
 
    - NamedPipeSocketFactory现能正常工作(仅对Windows平台)。具体说明请参见README。
 
11-08-02:版本3.0.2-dev
 
    -更正了可更新结果集和PreparedStatements不工作的问题。
 
    -更正了ResultSet.setFetchDirection(FETCH_UNKNOWN)。
 
    -更正了使用任意值并调用Statement.setFetchSize()时的问题。
 
    -更正了ResultSet.getLong()中的不正确转换。
 
    -实现了ResultSet.updateBlob()。
 
    -删除了UpdatableResultSet中的重复代码(能从ResultSet继承而来,不需要各方法处理可更新性的额外代码,但我认为在将来可能需要)。
 
    -更正了通过属性“强制”字符编码时抛出的“UnsupportedEncodingException”。
 
    -更正了各种非ASCII字符编码问题。
 
    -增加了驱动程序属性“useHostsInPrivileges”。默认值为“真”。它将影响是否在“DBMD.getColumn/TablePrivileges”中使用“@hostname”。
 
    -描述方案的所有DBMD结果集列现返回NULL,以便能与用于其他数据库的其他JDBC驱动程序的行为更兼容(MySQL不支持方案)。
 
    -增加了SSL支持。关于如何使用它的更多信息,请参见README。
 
    -执行自动再连接或故障切换时,恰当恢复连接属性,包括autoCommit状态以及隔离级别。
 
    -可能时,使用“SHOW CREATE TABLE”,以确定用于DatabaseMetaData的外键信息,对于返回的DELETE信息还允许级联选项。
 
    -对于SJIS字符集,转义了字符串中的“0x5c”字符。
 
    -更正了Clob.getSubString()中起始位置偏离1的错误。
 
    -实现了Clob.truncate()。
 
    -实现了Clob.setString()。
 
    -实现了Clob.setAsciiStream()。
 
    -实现了Clob.setCharacterStream()。
 
    -增加了com.mysql.jdbc.MiniAdmin类,该类允许你将“shutdown”命令发送至MySQL服务器。在最终用户应用中嵌入Java和MySQL服务器时使用。
 
    -增加了“connectTimeout”参数,允许JDK-1.4和更高版本的用户指定建立连接所需等候的最长时间。
 
    -仅当连接处于autoCommit(false)状态时,故障切换和autoReconnect才能工作,目的在于保持事务的安全。
 
    -增加了“queriesBeforeRetryMaster”属性,出现故障切换时而且在重新连接到主服务器之前,该属性指定了能够发出的查询数目(默认为50)。
 
    -更正了DBMD.supportsResultSetConcurrency(),以便为ResultSet.TYPE_SCROLL_INSENSITIVE和ResultSet.CONCUR_READ_ONLY或ResultSet.CONCUR_UPDATABLE返回“真”。
 
    -更正了ResultSet.isLast()处理空结果集方面的问题(应返回“假”)。
 
    - PreparedStatement现在将优先考虑setBinary/Ascii/Character Stream()中的流长度,除非将连接属性“useStreamLengthsInPrepStmts”设置为“假”。
 
    -删除了一些使用EscapeProcessor、Connection和DatabaseMetaData类中的“Strings smarter”创建的不需要的临时对象。
 
09-21-02:版本3.0.1-dev
 
    -更正了ResultSet.getRow()偏差1的缺陷。
 
    -更正了RowDataStatic.getAt()偏差1的缺陷。
 
    -增加了有限Clob功能(ResultSet.getClob()、PreparedStatemtent.setClob()、PreparedStatement.setObject(Clob))。
 
    -为URL增加了socketTimeout参数。
 
    - Connection.isClosed()不再对服务器执行“Ping”操作。
 
    -当“getAutoCommit() == false”时Connection.close()发出rollback()。
 
    -增加了“妄想”参数,通过删除其中的“敏感”信息清理了错误消息(即,主机名、端口、用户名等),并在可能的情况下,清理了“敏感”的数据结构。
 
    -更正了ResultSetMetaData.isSigned()在处理TINYINT和BIGINT方面的问题。
 
    - 现在将自动检测字符集。优化了单字节字符集转换的代码。
 
    -实现了ResultSet.getCharacterStream()。
 
    -为DatabaseMetaData.getTableTypes()中的表类型增加了“LOCAL TEMPORARY”。
 
    - 整理了大块代码,以遵循Java编码惯例(时机成熟)。
 
 
07-31-02:版本3.0.0-dev
 
    - !!! 许可变化!!! 驱动现在是GPL。如果需要非GPL许可,请与我们联系()。
 
    - JDBC-3.0功能包括Statement/PreparedStatement.getGeneratedKeys()和ResultSet.getURL()。
 
    -性能增强,在大多数情况下,驱动程序快了50-100%,而且创建的临时对象更少。
 
    -重新封装...新的驱动程序名是“com.mysql.jdbc.Driver”,但旧名称依然有效(驱动程序现由MySQL-AB提供)。
 
    -更好地在语句和PreparedStatement中检查已关闭的连接。
 
    -支持流式结果集(按行),请参见README,感谢Doron。
 
    -支持大信息包(MySQL-4.0协议的新增内容),更多信息请参见README。
 
    - JDBC兼容,除了存储程序测试外,提供了所有测试。
 
 
    -更正并分类了DBMetaData中的主键名称(SF缺陷582086和582086)。
 
    -浮点类型现为java.sql.Types.FLOAT(SF缺陷579573)。
 
    - ResultSet.getTimestamp()现在能处理DATE类型(SF缺陷559134)。
 
    - ResultSet.getDate/Time/Timestamp现在能识别由MySQL设置为全零的所有形式的无效值(SF缺陷586058)。
 
    - Testsuite现在将使用Junit(可从获得)。
 
    -驱动程序现在仅能与JDK-1.2或更高版本一起工作。
 
    -增加了多主机故障切换支持(请参见README)。
 
    -进行了一般性的源码清理。
 
    -读取信息包时,通过控制MysqlIO类创建的过渡对象,改善了总的速度。
 
    -改善了字符串处理和字段元数据创建的性能(例示),由Alex Twisleton-Wykeham-Fiennes提供。
 
 
05-16-02:版本2.0.14
 
    -更多代码整理。
 
    - PreparedStatement现在能释放.close()上的资源(SF缺陷553268)。
 
    -如果服务器版本不支持,不使用引用ID。此外,如果服务器是以“ansi”或“--sql-mode=ANSI_QUOTES”开始,那么“"”将用作ID引用,否则将使用“`”。
 
    - ResultSet.getDouble()现在能更准确地使用JDK内置的代码(但较慢)。
 
    - LogicalHandle.isClosed()调用,直至物理连接。
 
    -增加了SQL仿型功能(到STDERR)。在JDBC url中设置“profileSql=true”。更多信息请参见README。
 
    -更正了relaxAutoCommit参数的类型。
 
04-24-02:版本2.0.13
 
    -更多代码整理。
 
    -更正了未能正确读取的unicode字符(SF缺陷541088)。
 
    -为PrepStmt提供了更快的Blob转义功能。
 
    -为DataSource(s)增加了set/getPortNumber()(SF缺陷548167)。
 
    -为MySQLXADataSource增加了setURL()(SF缺陷546019)。
 
    -更正了PreparedStatement.toString()(SF缺陷534026)。
 
    -实现了ResultSetMetaData.getColumnClassName()。
 
    - 现在实施了来自JDBC-3.0的Statement.getGeneratedKeys()的初级版本(要想使之工作,需要使用JDK-1.4,我个人认为)。
 
    - DBMetaData.getIndexInfo(),更正了不良的PAGES(SF缺陷542201)。
 
04-07-02:版本2.0.12
 
    -一般性代码整理。
 
    -为Connection和MysqlLogicalHandle增加了getIdleFor()方法。
 
    -放松了所有类中的功能,应更正520615和520393。
 
    -为DBMD增加了getTable/ColumnPrivileges()(更正484502)。
 
    -为getTypeInfo()增加了新类型,更正了已有类型,感谢Al Davis和Kid Kalanon。
 
    -为PreparedStatement增加了BIT类型支持(51870)。
 
    -更正了ResultSet中的getRow()缺陷(527165)。
 
    -更正了PreparedStatement中的ResultSet可更新性。
    -更正了PreparedStatement中时区偏差1小时的缺陷(538286、528785)。
 
    - ResultSet: 更正了可更新性(如果不可更新,将值设为NULL)。
 
    - DataSources,更正了setUrl缺陷(511614、525565),错误的数据源类名(532816、528767)。
 
    -为需要它们的所有DatabaseMetaData方法增加了ID引用(应更正518108)。
 
    -增加了对YEAR类型的支持(533556)。
 
    - ResultSet.insertRow()目前能够在大多数情况下检测auto_increment字段,并在新行中使用该值。但是,该检测不适用于多值键,原因在于MySQL协议不返回该类信息。
 
    -实现了ResultSet.refreshRow()。
 
    -更正了testsuite.Traversal afterLast()缺陷,感谢Igor Lastric。
 
01-27-02:版本2.0.11
 
    
-更正了DBMD.getImported/ExportedKeys()getCrossReference()中丢失的DELETE_RULE值。
 
    -Statement.java的完全同步。
 
    -多处修改,更正了读取BLOB时的“Unexpected end of input stream”(输入流意外结束)错误。这应是最后更正。
 
01-24-02:版本2.0.10
 
     -更正了MysqlIO中的虚假“Unexpected end of input stream”(输入流意外结束)错误(缺陷507456)。
 
     -更正了与Websphere 4一起使用MysqlConnectionPoolDataSource时的“null-pointer-exceptions”(缺陷505839)。
 
01-13-02:版本2.0.9
 
     - Ant创建失败,包括jar文件,已更正(缺陷487669)。
 
     -更正了MysqlIO.readPacket()中额外的内存分配(缺陷488663)。
 
     -实现了DatabaseMetaData.getExported/ImportedKeys()和getCrossReference()。
 
     -在更改实例和类共享引用的方法上,实现了完全同步,驱动程序现在是完全线程安全的(如果遇到问题,请告诉我)。
 
     -将DataSource实施移至org.gjt.mm.mysql.jdbc2.optional软件包,PooledConnectionDataSource和XADataSource的原始实施仍保留在原处(感谢Todd Wolff给出了PooledConnectionDataSource与IBM WebSphere 4一起的实施方案和测试结果)。
 
     -增加了读取信息包时对关闭网络连接的检测(感谢Todd Lizambri)。
 
     -更正了与转义处理其有关的错误(缺陷486265)。
 
     -通过DatabaseMetaData,支持批更新(缺陷495101)。
 
     -更正了PreparedStatement.setTimestamp()中偏差1小时的错误(缺陷491577)。
 
     -从驱动程序中删除了级连支持(“||”操作符),较早的VisualAge版本似乎是使用它的唯一软件,它与逻辑“||”操作符冲突。要想使用“||”操作符作为级联,需要用“--ansi”标志启动mysqld(缺陷491680)。
 
     -更正了PreparedStatement中的舍弃缺陷(488663)。
 
11-25-01:版本2.0.8
 
     -现在支持批更新(感谢Daniel Rall的鼓励)。
 
     - XADataSource/ConnectionPoolDataSource代码(实验性)。
 
     - PreparedStatement.setAnyNumericType()现在能正确处理正指数(增加了“+”,因此MySQL能理解它)。
 
     - DatabaseMetaData.getPrimaryKeys()和getBestRowIdentifier()目前在识别主键方面更加可靠(匹配,不管主键在Key_type列中的大小写、或缩写/全名)。
 
10-24-01:版本2.0.7
 
     - PreparedStatement.setCharacterStream()现已实现。
 
     -更正了处于高利用率模式(autoReconnect=true)下时的悬挂套接字问题,连接的finalizer将关闭任何在GC上悬挂的套接字。
 
     -更正了在较新版本的MySQL上ResultSetMetaData.getPrecision()返回的值比实际值小1的问题。
 
     -如果列值为NULL,ResultSet.getBlob()现在将返回NULL。
 
     -如果useUnicode=true而且未设置characterEncoding,将从数据库读取字符集。(感谢Dmitry Vereshchagin)。
 
     -从数据库读取初始事务隔离级别(如果可用的话)(感谢Dmitry Vereshchagin)。
 
     -更正了DatabaseMetaData.supportsTransactions(),supportsTransactionIsolationLevel(),getTypeInfo() SQL_DATETIME_SUB,以及不可读取的SQL_DATA_TYPE字段。
 
     -更正了用于生成SQL并回在某些查询中以语法错误结束的PreparedStatement。
 
     -更正了ResultSet.isAfterLast()总返回“假”的问题。
 
     -更正了PreparedStatement.setTimestamp()中的时区问题(感谢Erik Olofsson)。
 
     -在URL或属性中传递了“captializeTypeNames=true”时,将类型名转换为大写(对于WebObjects,感谢Anjo Krank)。
 
     -可更新结果集现在能正确处理字段中的NULL值。
 
     - PreparedStatement.setDouble()现在能使用双精度值(撤销了以前所作的截取更正)。
 
     -如果MySQL的版本高于或等于3.21.23,PreparedStatement.setBoolean()将使用1/0值。
 
06-16-01:版本2.0.6
 
     -更正了PreparedStatement参数检查功能。
 
     -更正了ResultSet.java中区分大小写的列名。
 
06-13-01:版本2.0.5
 
     - 更正了ResultSet.getBlob() ArrayIndex超出范围的问题。
 
     -更正了ResultSetMetaData.getColumnTypeName关于TEXT/BLOB的问题。
 
     -更正了发送大BLOB查询时的ArrayIndexOutOfBounds问题(未设置最大信息包大小)。
 
     -为Connection.setIsolationLevel()增加了ISOLATION级别支持。
 
     -更正了所有列均未设置时在PreparedStatement.executeUpdate()上的NPE问题。
 
     -更正了采用两位数字年份的TIMESTAMP的数据解析问题。
 
     -为PreparedStatement.setObject()增加了Byte。
 
     - ResultSet.getBoolean()现在能将“-1”识别为“真”。
 
     - ResultSet具有+/-Inf/inf支持特性。
 
     -即使并非所有列均已被设置(设为NULL),ResultSet.insertRow()现在也能工作。
 
     - DataBaseMetaData.getCrossReference()不再使用ArrayIndexOOB。
 
     -作用在结果集上的getObject()能正确执行TINYINT->Byte和SMALLINT->Short操作。
 
12-03-00:版本2.0.3
 
     -为JDBC2实现了不带标度组分的getBigDecimal()。
 
     -更正了与可更新结果集有关的复合键问题。
 
     -增加了-/+INF对双精度的检测。
 
     -更快的ASCII字符串操作。
 
     -更正了MAX_ALLOWED_PACKET的不正确检测,因此,现在能发送大的Blob。
 
     -更正了java.sql.Blob实施代码中的“偏差1”错误。
 
     -增加了“ultraDevHack”URL参数,将其设置为“真”,可允许Macromedia UltraDev使用该驱动程序。
 
04-06-00:版本2.0.1
 
     -更正了RSMD.isWritable()返回错误值的问题。感谢Moritz Maass。
 
     -整理了连接确定时的异常处理功能。
 
     -使用getObject(),具有TEXT类型的列现在会作为字符串返回。
 
     - DatabaseMetaData.getPrimaryKeys()现在能正确工作(写入到key_seq)。感谢Brian Slesinsky。
 
     -按照JDBC规范,在PreparedStatements上,不再进行转义处理。
 
     -更正了很多JDBC-2.0遍历、定位错误,尤其是写入空结果集的问题。感谢Ron Smits、Nick Brook、Cessar Garcia和Carlos Martinez。
 
     -更正了使用多个主键时,与结果集中可更新性支持有关的一些问题。
 
02-21-00:版本2.0pre5
 
     -更正了不良的握手问题。
 
01-10-00:版本2.0pre4
 
     -更正了针对insertRow()的结果集,感谢Cesar Garcia。
 
     -对驱动程序进行了修改,使之能够通过加载JDBC-2.0类来识别JDBC-2.0,而不是依靠JDK版本号。感谢John Baker。
 
     -更正了结果集,以返回正确的行号。
 
     - Statement.getUpdateCount()现在能返回匹配的行,而不是实际更新的行,它更像SQL-92。
 
10-29-99
 
     -更正了Statement/PreparedStatement.getMoreResults()缺陷。感谢Noel J. Bergman。
 
     -为PreparedStatement.setObject()增加了Short类型。感谢Jeff Crowder。
 
     -驱动程序现在能通过查询服务器自动配置最大/首选的信息包大小。
 
     -如果服务器支持,Autoreconnect代码将使用更快的ping命令。
 
     -更正了从服务器读取信息包、以及为写入到服务器而分配信息包时与信息包大小有关的多种缺陷。
 
08-17-99:版本2.0pre
 
     -目前是在JDK-1.2下编译的。通过核心类集合,驱动程序同时支持JDK-1.1和JDK-1.2。在运行时,通过判断你所使用的JVM版本,驱动程序将加载恰当的接口类。
 
     -修正了在首行中全为NULL的结果集。(由Tim Endres指出)。
 
     -更正了结果集内SQLExceptions的列编号(感谢Blas Rodriguez Somoza)。
 
     -不再需要将数据库指定给连接。(感谢Christian Motschke)。
 
07-04-99:版本1.2b
 
     -更好的文档(不断改善),doc/mm.doc/book1.html。
 
     -对于列名模式,DBMD现在允许null(未在规范中定义),它将被更改为“%”。
 
     - DBMD现在提供了针对getXXX()的正确类型/长度。
 
     -修改了ResultSet.getDate()、getTime()和getTimestamp()。(由Alan Wilken提供)。
 
     - EscapeProcessor现在能正确处理引号内的“\{ \}”和“{ or }”。(感谢Alik就如何修正它给出的观点)。
 
     -对连接中的属性处理功能进行了修正。(由Juho Tikkala提供)。
 
     -对于表中的NULL列,ResultSet.getObject()现在能返回NULL,而不是销毁。(感谢Ben Grosman)。
 
     -对于MySQL不了解的类型,ResultSet.getObject()现在能返回字符串。(由Chris Perdue建议)。
 
     -删除了不需要的DataInput/Output流,对于每次IO操作,1/2的方法调用都是不需要的。
 
     -如果未指定字符编码,使用默认的字符编码。这是对已损坏JVM的一种避规措施,这是因为,按照规范,所有的JVM都必须支持“ISO8859_1”,但并非如此。
 
     -更正了连接事宜,如果未明确设置字符编码,将使用平台的字符编码,而不是“ISO8859_1”。它修正了加载并不总存在的字符转换器类时存在的问题(JVM缺陷)。(感谢Fritz Elfert指出了该问题)。
 
     -修改了MysqlIO,使之在可能的情况下再次使用信息包,而不是降低内存使用率。
 
     -更正了与引号内“{}”有关的转义处理器缺陷。
 
04-14-99:版本1.2a
 
     -更正了对非Javasoft JVM的字符集支持(感谢很多指出该问题的人员)。
 
     -更正了ResultSet.getBoolean(),使之能够识别作为布尔标志的“y”和“n”,以及“1”和“0”。(感谢Tim Pizey)。
 
     -更正了ResultSet.getTimestamp(),以提供更好的性能。(感谢Richard Swift)。
 
     - 更正了getByte()在处理数值类型方面的问题。(感谢Ray Bellis)。
 
     - 更正了DatabaseMetaData.getTypeInfo()在处理DATE类型时存在的问题。(感谢Paul Johnston)。
 
     -更正了用于“fn”调用的EscapeProcessor。(感谢locomotive.org的Piyush Shah)。
 
     -更正了EscapeProcessor,如果没有转义代码,不执行额外操作。(感谢Ryan Gustafson)。
 
     -更正了驱动程序,使之能解析“jdbc:mysql://host:port”形式的URL(感谢Richard Lobb)。
 
03-24-99:版本1.1i
 
     -更正了关于PreparedStatements的Timestamps问题。
 
     -更正了RSMD和RS中的Null指针异常。
 
     -对于有效的类文件,与jikes一起进行了再编译(感谢ms!)。
 
03-08-99:版本1.1h
 
     -更正了转义处理器,以处理不匹配的“{”和“}”(感谢Craig Coles)。
 
     -更正了转义处理器,以创建移植性更好的(在DATETIME和TIMESTAMP类型间)表达式,以便能与BETWEEN子句一起使用。(感谢Craig Longman。
 
     - MysqlIO.quit()现在能关闭套接字连接。在此之前,多次连接失败后,某些操作系统将耗尽文件描述符。(感谢Michael Brinkman)。
 
     -更正了Driver.getPropertyInfo中的NullPointerException(感谢Dave Potts)。
 
     -修正了MysqlDefs,允许字字符串形式检索所有的*text字段。(感谢Chris at Leverage)。
 
     -更正了PreparedStatement中的setDouble,使之能用于处理大数字,防止将科学记数法发送到数据库。(感谢J.S. Ferguson)。
 
     -更正了RSMD中的getScale()和getPrecision()。(由James Klicman贡献)。
 
     -更正了字段为DECIMAL或NUMERIC时的getObject()(感谢Bert Hobbs)。
 
     -传递Null表名时,DBMD.getTables()出现严重故障。已更正(感谢Richard Lobb)。
 
     -增加了在连接过程中对“client not authorized”(客户端未被授权)错误的检查。(感谢Hannes Wallnoefer)。
 
02-19-99:版本1.1g
 
     -结果集行现在是字节数组。Blob和Unicode现在能双向工作。目前实施了useUnicode和编码选项。
 
     -修正了PreparedStatement,使用setXXXStream(不改变地发送)将二进制集合发送到MySQL服务器。
 
     -修正了getDriverPropertyInfo()。
 
12-31-98:版本1.1f
 
     -将所有的结果集字段更改为字符串,这样,应能使Unicode工作,但你的JVM必须能够在字符集间进行转换。它还能使对服务器的数据读取更快,原因在于,现在不存在从StringBuffer到String(字符串)的转换。
 
     -更改了PreparedStatement.streamToString(),使之更有效(代码由Uwe Schaefer提供)。
 
     - URL解析功能更可靠(对于错误,抛出SQL异常,而不是NullPointerExceptions)。
 
     - PreparedStatement现在能通过setObject()将String转换为Time/Date值(代码由Robert Currey提供)。
 
     -在Buffer.readInt()中,IO进程不再被挂起,该缺陷是在1.1d中当将结果集更改为全字节数组时引入的。(由Samo Login指出)。
 
11-03-98:版本1.1b
 
     -修正了DatabaseMetaData,允许IBM VA和J-Builder同时工作。请告诉我它的工作机制。(感谢Jac Kersing)。
 
     -修正了ResultSet.getBoolean()在处理NULL字符串方面的问题(感谢Barry Lagerweij)。
 
     -开始代码整理,并进行了格式处理。开始将其分出为并行的JDBC-2.0源树。
 
     -为MysqlIO和Buffer内的关键部分增加了“最终”限定符,允许编译器采用内联方法以提高速度。
 
9-29-98
 
     -如果传递给PreparedStatement中setXXX()的对象引用是空的,将自动调用setNull()。(感谢Erik Ostrom给出的提议)。
 
     -对于Types.OTHER对象和未知类型对象,PreparedStatement中的setObject()现在会尝试将对象的串行化表示写入到数据库。
 
     - Util现在有了1个静态方法readObject(),结果集和列索引将以上述方式在此例示序列化的对象。
 
9-02-98 – 版本1.1
 
     -消除了MysqlIO.nextRow()中的“丑陋缺陷”。更正了Buffer.isLastDataPacket(),而不是获取异常。
 
     - Connection.getCatalog()和Connection.setCatalog()现在能够工作。
 
     - Statement.setMaxRows()能够正常工作,也能使用属性maxRows进行设置。通过属性或URL参数,Statement.setMaxRows()能覆盖maxRows设置。
 
     -提供了自动再连接功能。由于在每次查询前不得不Ping数据库,在默认情况下,它将被关闭。要想使用该功能,请在连接URL中传递“autoReconnect=true”。通过“maxReconnects=n”(默认为3)和“initialTimeout=n”(默认为2秒)参数,你也可以更改再连接尝试的次数和初始超时值。Timeout是超时的指数补偿类型。例如,如果初始超时设置为2秒,maxReconnects为3,那么再连接尝试之间的间隔分别是2秒,4秒和16秒。
 
8-24-98:版本1.0
 
     - 更正了Buffer.java中Blob数据的处理功能。
 
     -更正了与尺寸过小的鉴定信息包有关的缺陷。
 
     -JDBC驱动程序现在采用LPGL。
 
8-14-98 -
 
     - 更正了 Buffer.readLenString(),使之能正确读取BLOB数据。
 
     -更正了PreparedStatement.stringToStream,使之能正确读取BLOB数据。
 
     -更正了PreparedStatement.setDate(),使之不增加1天。(感谢Vincent Partington在上述修正项方面的贡献)。
 
     -增加了URL参数解析功能(?user=...等等)。
 
 
8-04-98:版本0.9d
 
     - 重大新闻! 新的软件包名。ICE工程公司的Tim Endres着手为GNU GPL的Java软件建立新的源树。他友好地将org.gjt.mm软件包目录提供给我,因此,现在驱动程序在org.gjt.mm.mysql软件包中。目前我是合法用户。期待Tim项目的更多信息。
 
     -现在采用了动态确定大小的信息包,向数据库发送命令时,能够减少内存使用。
 
     -对getTypeInfo()的参数等方面进行了小的修正。
 
     - DatabaseMetaData现已完全实现。如果这些驱动程序能与各种IDE一起工作,请告知。我已听说它们正与Jbuilder一起使用。
 
     -在软件包中增加了JavaDoc文档。
 
     -软件包采用.zip或.tar.gz格式提供。
 
7-28-98:版本0.9
 
     -实现了getTypeInfo()。根据JDBC规范,Connection.rollback()现在能抛出SQLException。
 
     -增加了PreparedStatement,它支持预处理语句的所有JDBC API方法,包括InputStreams。请检查该点,如有问题,请告知。
 
     -更正了ResultSet中的1个缺陷,该缺陷会破坏仅返回1行的某些查询。
 
     - 更正了DatabaseMetaData.getTables()、DatabaseMetaData.getColumns()和DatabaseMetaData.getCatalogs()中存在的缺陷。
 
     -增加了语句的功能,允许executeUpdate()保存由AUTO_INCREMENT字段自动生成的ID值。一般而言,执行executeUpdate()后,将查找SQLWarnings以了解警告信息,如LAST_INSERTED_ID = 'some number',COMMAND = 'your SQL query'。
 
 如果在表中正使用AUTO_INCREMENT字段,并在一条语句上执行了多个executeUpdate(),务必每次都执行clearWarnings()以节省内存。
 
7-06-98:版本0.8
 
     -将MysqlIO和Buffer分离为单独类。对于这两个类中的某些字段,一些ClassLoader(类加载器)会给出IllegalAccess(非法访问)错误。现在,mm.mysql能够在小应用程序和所有类加载器中正常工作。
 
 感谢Joe Ennis 指出该问题,并与我一起进行了修正。
 
7-01-98:版本0.7
 
     -更正了getColumns()中的DatabaseMetadata problems,并更正了字段构造函数内开关语句中存在的缺陷。
 
 感谢Costin Manolache 指出了它们。
 
5-21-98:版本0.6
 
     -在MysqlIO.java和ResultSet.java中,结合Richard Swift 给出的有效变更内容。
 
     -现在,我们的驱动程序比GWE的驱动程序快15%。
 
     - 开始着手处理DatabaseMetaData。
 
 实现了下述方法:
  * getTables()
  * getTableTypes()
  * getColumns
  * getCatalogs()

26.4. MySQL Connector/MXJ

26.4.1. 前言

MySQL Connector/MXJ是一种Java实用工具软件包,用于部署和管理MySQL数据库。可以将Connector/MXJ捆绑到已有的Java应用程序,或将其作为JMX Mbean部署。MySQL的部署和使用十分简单,就像为JDBC连接URL添加额外参数一样简单,连接建立后,连接URL将启动数据库。这样,Java开发人员能够通过降低其最终用户的安装难度,更容易地部署需要数据库的应用程序。

MySQL Connector/MXJ使得MySQL数据库像是基于java的组件。它通过下述步骤完成该任务,确定系统所运行的平台,选择恰当的二进制文件,并执行程序。也能可选地部署具有任何指定参数的个初始数据库。

作为一种JMX Mbean,MySQL Connector/MXJ需要与JMX v1.2兼容的Mbean容器,如Jboss版本4。Mbean将使用标准的JMX管理API来展示与平台相适应的参数(并允许设置参数)。

其中包含与JDBC驱动程序一起使用的说明,以及以JMX Mbean方式将其部署至Jboss的说明。

可从下述站点下载源版本和二进制版本:http://dev.mysql.com/downloads/connector/mxj/

这是一种测试板,欢迎反馈和鼓励。

如有任何问题或意见,请发送电子邮件至。

26.4.2. 支持平台:

  • Linux, i386

  • Windows NT, x86

  • Windows 2000, x86

  • Windows XP, x86

  • Solaris 9, SPARC 32

26.4.3. Junit测试要求

要想确保你的平台是在支持范围内,最好方法是运行Junit测试。

首先应确保组件能够在平台上工作。由于“MysqldResource”类实际上是MySQL固有版本的包装器,并非所有的平台均支持它。编写本文时,对运行在i386架构上的Linux进行了测试,看上去工作良好,就像在OS X v10.3上一样。在Windows和Solaris平台上进行了有限测试。

要求:

1.    JDK-1.4或更高版本(或JRE,如果不打算编译源文件或JSP的话)。

2.    通过CLASSPATH安装了并提供了MySQL Connector/J版本3.1或更高版本(http://dev.mysql.com/downloads/connector/j/ )。

3.    用于JMX版本1.2.1的javax.management类,它们位于下述应用服务器上:

·         JBoss - 4.0rc1或更高版本

·         Apache Tomcat - 5.0或更高版本

·         Sun公司的JMX参考实施版本1.2.1,。

4.      Junit 3.8.1()

如果从源码创建,除了上述所有要求外,还须满足:

1.      Ant版本1.5或更高版本(可从上下载)。

26.4.4. 运行Junit测试

1.    这类测试将尝试在3336端口上启动MySQL。如果有正在运行的MySQL,可能会出现冲突,但可能性不大,原因在于MySQL的默认端口是3306。然而,也可以将“c-mxj_test_port”Java属性设置为你所选择的端口。作为可选方式,你也可以通过关闭运行在目标机器上的MySQL实例来启动测试。

2.    要想运行Junit测试套件,$CLASSPATH必须包含下述部分:

·         JUnit

·         JMX

·         Connector/J

·         MySQL Connector/MXJ

3.    如果你下载的文件中不含connector-mxj.jar,请解包MySQL Connector/MXJ源码档案文件。

4.           cd mysqldjmx
5.           ant dist
     

随后,将$TEMP/cmxj/stage/connector-mxj/connector-mxj.jar添加到CLASSPATH(类路径)。

6.    如果有junit,执行单元测试。从命令行上输入:

7.           java junit.textui.TestRunner com.mysql.management.AllTestsSuite
    

输出与下面给出的类似:

.........................................
.........................................
..........
Time: 259.438
 
OK (101 tests)
  

注意,在快结束时速度会变慢,请耐心等候。

26.4.5. 作为JDBC驱动程序的一部分运行

MySQL Connector/J JDBC驱动程序的1个特点是,能够在JDBC连接字符串中将“SocketFactory”指定为参数。MySQL Connector/MXJ包含1个定制的SocketFactory。首次连接时,SocketFactory将部署并启动MySQL数据库。SocketFactory也会显示1个“shutdown”方法。

要想使用它,请在JDBC连接字符串上指定“socketFactory”参数,并将其值设为“com.mysql.management.driverlaunched.ServerLauncherSocketFactory”。

在下面的示例中,有1个能创建连接的程序,执行查询,并将结果输出到System.out。MySQL数据库将作为连接进程的组成部分予以部署并启动,最后是结束部分。

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

import com.mysql.management.driverlaunched.ServerLauncherSocketFactory;

public class ConnectorMXJTestExample {
    public static void main(String[] args) throws Exception {
        String hostColonPort = "localhost:3336";
        
        String driver = com.mysql.jdbc.Driver.class.getName();
        String url = "jdbc:mysql://" + hostColonPort + "/" + "?"
                + "socketFactory="
                + ServerLauncherSocketFactory.class.getName();
        String userName = "root";
        String password = "";

        Class.forName(driver);
        Connection conn = null;
        try {
            conn = DriverManager.getConnection(url, userName, password);
            Statement stmt = conn.createStatement();
            ResultSet rs = stmt.executeQuery("SELECT VERSION()");
            rs.next();
            String version = rs.getString(1);
            rs.close();
            stmt.close();

            System.out.println("------------------------");
            System.out.println(version);
            System.out.println("------------------------");
        } finally {
            try {
                conn.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
            ServerLauncherSocketFactory.shutdown(hostColonPort);
        }
    }
}
  

要想运行上述程序,在CLASSPATH中必须有connector-mxj.jar和Connector/J。然后键入:

java ConnectorMXJTestExample
  

当然,对于MySQL数据库,有很多可设置的选项。通过为每个服务器选项冠以前缀“server”,可将其作为JDBC连接字符串的部分,简单地指定这些选项。在下述示例中,我们设置了3个驱动程序参数和2个服务器参数:

        String url = "jdbc:mysql://" + hostColonPort + "/" 
                + "?"
                + "socketFactory="
                + ServerLauncherSocketFactory.class.getName();
                + "&"
                + "cacheServerConfiguration=true"
                + "&"
                + "useLocalSessionState=true"
                + "&"
                + "server.basedir=/opt/myapp/db"
                + "&"
                + "server.datadir=/mnt/bigdisk/myapp/data";
  

26.4.6. 在Java对象中运行

有1个java应用程序并打算嵌入MySQL数据库,直接使用com.mysql.management.MysqldResource类。可以使用默认的构造函数(无参量)例示该类,或者通过在java.io.File对象(代表希望服务器解包至的目录)中传递类来例示之。也可用针对“stdout”和“stderr”(用于记录)的输出流例示它。

一旦完成例示,java.util.Map,该对象将能提供与平台以及希望使用的MySQL版本相适应的服务器选项的java.util.Map。

MysqldResource允许你使用所提供的服务器选项的java.util.Map启动MySQL,并允许你关闭数据库。在下面的示例中,给出了使用明码java对象将MySQL嵌入到应用程序的简单方法。

import com.mysql.management.MysqldResource;

 ...

    public void startMySQL() {
        File baseDir = new File(ourAppDir, "mysql");
        mysqldResource = new MysqldResource(baseDir);
        Map options = new HashMap();
        options.put("port", "3336");
        String threadName = "OurApp MySQL";
        mysqldResource.start(threadName, options);
    }
    
    public void stopMySQL() {
        if (mysqldResource != null) {
            mysqldResource.shutdown();
        }
        mysqldResource = null;
    }
    
    public java.sql.Connection getConnection() throws Exception {
        String db = "test";
        String url = "jdbc:mysql://localhost:3336/" + db;
        String userName = "root";
        String password = "";
        Class.forName(com.mysql.jdbc.Driver.class.getName());
        return DriverManager.getConnection(url, userName, password);
    }
  

26.4.7. MysqldResource API

构造函数:

·         public MysqldResource(File baseDir, PrintStream out, PrintStream err);

允许设置安装MySQL文件的“basedir”,并设置标准输出和标准错误的输出流。

·         public MysqldResource(File baseDir);

允许设置安装MySQL文件的“basedir”。标准输出和标准错误的输出将被导至System.out和System.err。

·         public MysqldResource();

Basedir是java.io.tempdir的默认子目录。标准输出和标准错误的输出将被导至System.out和System.err。

MysqldResource API包含下述方法:

·         void start(String threadName, Map mysqldArgs);

部署并启动MySQL。“threadName”字符串用于命名实际执行MySQL命令行命令的线程。“map”是将要传递给命令行的参量和参联值的集合。

·         void shutdown();

关闭由MysqldResource对象管理的MySQL实例。

·         Map getServerOptions();

返回所有选项以及MySQL数据库可用的当前选项(或默认选项,如果未运行的话)的映射。

·         boolean isRunning();

如果MySQL数据库正在运行,返回“真”。

·         boolean isReadyForConnections();

一旦数据库通报它已做好连接准备,返回“真”。

·         void setKillDelay(int millis);

默认的“Kill Delay”是30秒。它表示发出初始关闭请求和发出“强制杀死”(如果数据库未关闭)命令之间需要等待的时间。

·         void addCompletionListenser(Runnable listener);

当服务器进程完成时,允许通知应用程序。每个“listener”(监听程序)将在自己的线程中发出。

·         String getVersion();

返回MySQL的版本。

·         void setVersion(int MajorVersion, int minorVersion, int patchLevel);

标准分发版本仅提供了1种版本的MySQL软件包。但也能将多个版本封装在一起,并指定要使用的版本。

26.4.8. 在JMX代理(custom)中运行

如果你正在使用JMX的SUN参考实施版本,可跳过本节。或者,如果你正在部署Jboss,请跳到下一节。

我们希望在JMX代理的活动中看到MysqldDynamicMBean。在com.mysql.management.jmx.sunri软件包中,它是带有2个Mbeans的JMX代理:

1.      MysqldDynamicMBean,以及

2.    com.sun.jdmk.comm.HtmlAdaptorServer,它提供了用于操控JMX代理内众多元素的Web接口。

启动了这个十分简单的代理程序后,允许用Web浏览器启动并停止MySQL数据库。

1.    如前所述,完成平台测试。

·         当前JDK, JUnit, Connector/J, MySQL Connector/MXJ

·         本节需要JMX的SUN参考实施版本

·         PATH, JAVA_HOME, ANT_HOME, CLASSPATH

2.      如果不是从源码创建的,跳到下一步。

rebuild with the "sunri.present"

ant -Dsunri.present=true dist 
re-run tests:
java junit.textui.TestRunner com.mysql.management.AllTestsSuite

3.    从命令行启动测试代理:

4.    java com.mysql.management.jmx.sunri.MysqldTestAgentSunHtmlAdaptor &
     

5.    从浏览器:

6.           
     

7.      在MysqldAgent下

8.             选择“name=mysqld”
     

9.      观察Mbean视图

10.  滚动到屏幕底部,按startMysqld按钮

11.  点击“Back to MBean View”(返回Mbean视图)

12.  滚动到屏幕底部,按stopMysqld按钮

13.  杀死运行测试代理的Java进程(jmx服务器)

26.4.9. 部署在标准的JMX代理环境下 (JBoss)

一旦确定Mbean能够在平台上工作,接下来应在标准的JMX代理内部署Mbean。其中包含部署到Jboss的说明。

1.    确保有最新版本的java开发工具箱(v1.4.x),请参见前面的介绍。

·         确保设置JAVA_HOME(Jboss要求JAVA_HOME)。

·         确保JAVA_HOME/bin位于PATH中(不需要设置CLASSPATH,也不需要以前测试中使用的任何jar文件)。

2.      确保安装了Jboss的最新版本(v4.0RC1或更高)。

3.             
4.             选择“Downloads”。
5.             选择“jboss-4.0.zip”。
6.             选择1个镜像。
7.             unzip ~/dload/jboss-4.0.zip
8.             创建JBOSS_HOME环境变量,设置解包目录。
9.             仅对Unix:
10.       cd $JBOSS_HOME/bin
11.       chmod +x *.sh

12.connector-mxj.jar安装(拷贝)到$JBOSS_HOME/server/default/lib

13.mysql-connector-java-3.1.4-beta-bin.jar安装(拷贝)到$JBOSS_HOME/server/default/lib

14.$JBOSS_HOME/server/default/deploy下创建mxjtest.war目录。

15.  index.jsp安装(拷贝)到$JBOSS_HOME/server/default/deploy/mxjtest.war。

16.$JBOSS_HOME/server/default/deploy下创建mysqld-service.xml文件

17.       
18.        
19.         
20.            name="mysql:type=service,name=mysqld">
21.         /tmp/xxx_data_xxx
22.         true
23.         
24.        
     

25.启动jboss:

·         在Unix上:$JBOSS_HOME/bin/run.sh

·         在Windows上:%JBOSS_HOME%\bin\run.bat

准备就绪:Jboss在屏幕上显示大量输出。

26.  当Jboss看上去停止将信息输出到屏幕上时,打开Web浏览器:

27.滚动到mysql部分页面底部,选择bulleted mysqld链接。

28.观察JMX MBean View页面。MySQL应已运行。

29.  (如果设置了“autostart=true”可跳过该步)。滚动到屏幕底部。按Invoke按钮停止(或启动)MySQL,观察已成功完成而且无返回值的操作。点击“Back to MBean View”(返回Mbean视图)

30.  要想确定MySQL是否正在运行,打开Web浏览器,应看到:

SELECT 1

returned with a result of

1

31.按照$JBOSS_HOME/server/default/deploy/mxjtest.war/index.jsp中的介绍,能够在你的Web应用程序中使用MySQL。其中提供了供测试用的测试数据库和根用户(无密码)。创建表,插入一些行,并进行一些选择。

32.  关闭MySQL。停止Jboss时,MySQL将自动停止,或:在浏览器中,滚动到MBean View底部,并按停止服务Invoke按钮中止服务。观察已成功完成而且无返回值的操作。使用ps或任务管理器查看MySQL是否已不再运行。

对于1.0.6-beta版,能够在启动时让Mbean启动MySQL数据库。此外,我们还借鉴了Jboss生命周期扩展方法的优点,关闭Jboss时能优雅地关闭数据库。

26.4.10. 安装

如果阅读了上述部分,应已完成了这些步骤。但我们在下面列出了它们,以供快速参考。

启动了驱动程序:

1.      下载并解包Connector/MXJ,将connector-mxj.jar添加到CLASSPATH。

2.    为JDBC连接字符串添加下述参数:"socketFactory=" + ServerLauncherSocketFactory.class.getName()

JBoss:

1.    下载Connector/MXJ,将connector-mxj.jar文件拷贝到目录$JBOSS_HOME/server/default/lib

2.    下载Connector/J,将connector-mxj.jar文件拷贝到目录$JBOSS_HOME/server/default/lib

3.    有任意属性设置在$JBOSS_HOME/server/default/deploy目录下创建Mbean服务xml文件,例如datadirautostart

4.      设置Web应用程序的JDBC参数,以使用:String driver = "com.mysql.jdbc.Driver"; String url = "jdbc:mysql:///test?propertiesTransform="+ "com.mysql.management.jmx.ConnectorMXJPropertiesTransform"; String user = "root"; String password = ""; Class.forName(driver); Connection conn = DriverManager.getConnection(url, user, password);

你或许希望为每个应用程序创建单独用户和数据库表空间,而不是使用根用户和测试数据库。

强烈建议定期备份,将数据库文件备份到datadir目录下。


这是MySQL参考手册的翻译版本,关于MySQL参考手册,请访问dev.mysql.com。原始参考手册为英文版,与英文版参考手册相比,本翻译版可能不是最新的。

阅读(1992) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~