バージョン5.1版での製品版保守リリースであるMySQL Connector/J 5.1.6が リリースされました。Connector/Jは、MySQL用のタイプ4のpure-Java JDBCドライバです。
- JDBC-4.0-ized XAConnections and datasources.
- FixedBUG#31790MysqlValidConnectionChecker doesn't properly handle ReplicationConnection
- FixedBug#20491- DatabaseMetadata.getColumns() doesn't return correct column names if connection character set isn't UTF-8. (There was server-side component of this that was fixed late in the 5.0 development cycle, it seems, this is the last piece that fixes some loose ends in the JDBC driver). This fix touches *all* metadata information coming from the MySQL server itself. - Fixed MysqlIO.nextRowFast() to only attempt to read server warning counts and status if talking to a 4.1 or newer server (fixes a hang when reading data from 4.0 servers). - Made profiler event handling extensible via the "profilerEventHandler" connection property. - FixedBug#31823- CallableStatement.setNull() on a stored function would throw an ArrayIndexOutOfBounds when setting the last parameter to null when calling setNull(). - Added SSL-related configuration property "verifyServerCertificate". If set to "false", the driver won't verify the server's certificate when "useSSL" is set to "true". When using this feature, the keystore parameters should be secified by the "clientCertificateKeyStore*" properties, rather than system properties, as the JSSE doesn't make it straightforward to have a non-verifying trust store and the "default" key store. - Fixed ResultSetMetadata.getColumnName() for result sets returned from Statement.getGeneratedKeys() - it was returning null instead of "GENERATED_KEY" as in 5.0.x. - More applicable fix for the "random" load balance strategy in the face of node non-responsive, it re-tries a *different* random node, rather than waiting for the node to recover (forBUG#31053) -FixedBUG#32577- no way to store two timestamp/datetime values that happens over the DST switchover, as the hours end up being the same when sent as the literal that MySQL requires. Note that to get this scenario to work with MySQL (since it doesn't support per-value timezones), you need to configure your server (or session) to be in UTC, and tell the driver not to use the legacy date/time code by setting "useLegacyDatetimeCode" to "false". This will cause the driver to always convert to/from the server and client timezone consistently. This bug fix also fixesBUG#15604, by adding entirely new date/time handling code that can be switched on by "useLegacyDatetimeCode" being set to "false" as a JDBC configuration property. For Connector/J 5.1.x, the default is "true", in trunk and beyond it will be "false" (i.e. the old date/time handling code, warts and all will be deprecated). - FixedBUG#32877- Load balancing connection using best response time would incorrectly "stick" to hosts that were down when the connection was first created. We solve this problem with a black list that is used during the picking of new hosts. If the black list ends up including all configured hosts, the driver will retry for a configurable number of times (the "retriesAllDown" configuration property, with a default of 120 times), sleeping 250ms between attempts to pick a new connection. We've also went ahead and made the balancing strategy extensible. To create a new strategy, implement the interface com.mysql.jdbc.BalanceStrategy (which also includes our standard "extension" interface), and tell the driver to use it by passing in the class name via the "loadBalanceStrategy" configuration property. -FixedBUG#30508- ResultSet returned by Statement.getGeneratedKeys() is not closed automatically when statement that created it is closed. -Added two new connection properties, "selfDestructOnPingSecondsLifetime" and "selfDestructOnPingMaxOperations" designed to control overall connection lifetime (useful to reclaim resources on the server side) for connection pools that don't have such a facility. The driver will consult the values of these properties when a ping is sent, either through calling Connection.ping(), issuing the "ping marker" query (any query that starts with "/* ping */"), or when using JDBC-4.0, calling Connection.isValid(). If the connection has issued too many operations, or is too old, the driver will throw a SQLException with the SQLState of "08S01" at the time of the ping, which will cause the connection to be invalidated with most pools in use today. - Fixed issue where driver could send invalid server-side prepared statement IDs to the server when the driver was setup to do auto-reconnect as the connection could get set up enough to start sending queries on one thread, while the thread that "noticed" the connection was down hasn't completed re-preparing all of the server-side prepared statements that were open when the connection died. Potentially fixes cause for bug 28934. Potentially fixes other possible race conditions where one thread that has created a connection "shares" it with other threads if the connection is reconnected due to auto-reconnect functionality. - FixedBUG#33823- Public interface ResultSetInternalMethods with reference to non-public class com.mysql.jdbc.CachedResultSetMetaData. -For any SQLException caused by another Throwable, besides dumping the message or stack trace as a string into the message, set the underlying Throwable as the cause for the SQLException, making it accessible via getCause(). - FixedBUG#34093- Statements with batched values do not return correct values for getGeneratedKeys() when "rewriteBatchedStatements" is set to "true", and the statement has an "ON DUPLICATE KEY UPDATE" clause. - FixedBUG#31192- Encoding Issue retrieving serverVersion in MysqlIO in the method doHandshake when encoding doesn't contain ASCII characters in the "standard" place (i.e. ebcdic). -Fixed issue where META-INF in the binary .jar file wasn't packed correctly, leading to failure of the JDBC-4.0 SPI mechanism. - CallableStatements that aren't really stored procedure or stored function calls can now be used, for tools such as Oracle JDeveloper ADF that issue statements such as DDL through CallableStatements. - FixedBUG#34518- Statements using cursor fetch leaked internal prepared statements until connection was closed. The internal prepared statement is now held open while the result set is open, and closed by the result set itself being closed. - FixedBUG#34677- Blob.truncate() wouldn't take "0" as an argument.
- CommunicationExceptions now carry information about the last time a packet was received from the MySQL server, as well as when the last packet was sent to one, in an effort to make it easier to debug communications errors caused by network timeouts. - Reverted a change to DatabaseMetadata.getColumns() from 5.0, where getColumns() would report NULL for COLUMN_SIZE for TIME, DATE, DATETIME and TIMESTAMP types. It now reports the column size, in the DatabaseMetadata implementations that use "SHOW" commands, and the INFORMATION_SCHEMA. - FixedBug#34762- RowDataStatic does't always set the metadata in ResultSetRow, which can lead to failures when unpacking DATE, TIME, DATETIME and TIMESTAMP types when using absolute, relative, and previous result set navigation methods. - FixedBUG#34703- Connection.isValid() invalidates connection after timeout, even if connection is actually valid. - FixedBUG#34194- ResultSetMetaData.getColumnTypeName() returns "UNKNOWN" for GEOMETRY type. - FixedBUG#33162- NullPointerException instead of SQLException thrown for ResultSet.getTimestamp() when not positioned on a row. - The ConnectionLifecycleInterceptor interface now has callback methods for transaction initiation (transactionBegun()), and completion (transactionCompleted()), as reported by the *server* (i.e. calling Connection.setAutoCommit(false) will not trigger transactionBegun() being called, however the first statement which causes a transaction to start on the server will cause transactionBegun() to be called *after* the statement has been processed on the server). - FixedBug#34913- ResultSet.getTimestamp() returns incorrect values for month/day of TIMESTAMPs when using server-side prepared statements (not enabled by default). - FixedBUG#34937- MysqlConnectionPoolDataSource does not support ReplicationConnection. Notice that we implemented com.mysql.jdbc.Connection for ReplicationConnection, however, only accessors from ConnectionProperties are implemented (not the mutators), and they return values from the currently active connection. All other methods from com.mysql.jdbc.Connection are implemented, and operate on the currently active connection, with the exception of resetServerState() and changeUser(), which operate on all connections held by the replication connection.
- Connections created with jdbc:mysql:replication:// URLs now force roundRobinLoadBalance=true on the slaves, and round-robin load balancing now uses a "random" choice to more evenly distribute load across slave servers, especially in connection pools. Connections that are configured with "roundRobinLoadBalance=true" no longer set the failover state, as it's assumed that we're not attempting to fall-back to a master server. This fixesBUG#34963.