MySQL Connector/J 5.1 Release Notes
When statements include ON DUPLICATE UPDATE
,
and rewriteBatchedStatements
is set to true,
batched statements are not rewritten into the form
INSERT INTO table VALUES (), (), ()
, instead
the statements are executed sequentially.
When an application using Connector/J ran into an error, the
SQLException.getMessage()
method was
returning null instead of an error description. This has been
fixed by calling the setRowPositionValidity()
method in the ResultSetImpl
constructor.
(Bug #11749413, Bug #38943)
When using trustCertificateKeyStoreUrl
or
clientCertificateKeyStoreUrl
, an
IllegalStateException
was caused by an
uninitialized TrustManagerFactoryImpl
object.
(Bug #11748637, Bug #36948, Bug #38192)
Statement.getGeneratedKeys()
returned two
keys when using ON DUPLICATE KEY UPDATE
and
the row was updated, not inserted.
(Bug #42309)
When using the replication driver with
autoReconnect=true
, Connector/J checks in
PreparedStatement.execute
(also called by
CallableStatement.execute
) to determine if
the first character of the statement is an “S”, in
an attempt to block all statements that are not read-only-safe,
for example non-SELECT
statements. However, this also blocked
CALL
s to stored procedures, even
if the stored procedures were defined as SQL READ
DATA
or NO SQL
.
(Bug #40031)
With large result sets ResultSet.findColumn
became a performance bottleneck.
(Bug #39962)
Connector/J ignored the value of the MySQL Server variable
auto_increment_increment
.
(Bug #39956)
Connector/J failed to parse
TIMESTAMP
strings for nanos
correctly.
(Bug #39911)
When the LoadBalancingConnectionProxy
handles
a SQLException
with SQL state starting with
“08”, it calls
invalidateCurrentConnection
, which in turn
removes that Connection
from
liveConnections
and the
connectionsToHostsMap
, but it did not add the
host to the new global blacklist, if the global blacklist was
enabled.
There was also the possibility of a
NullPointerException
when trying to update
stats, where
connectionsToHostsMap.get(this.currentConn)
was called:
int hostIndex = ((Integer) this.hostsToListIndexMap.get(this.connectionsToHostsMap.get(this.currentConn))).intValue();
This could happen if a client tried to issue a rollback after
catching a SQLException
caused by a
connection failure.
(Bug #39784)
When configuring the Java Replication Driver the last slave specified was never used. (Bug #39611)
When an INSERT ON DUPLICATE KEY UPDATE
was
performed, and the key already existed, the
affected-rows
value was returned as 1 instead
of 0.
(Bug #39352)
When using loadbalancing, Connector/J might not cycle through
the whole list of configured hosts in its attempt to make a
connection. This fix corrects the implementation of the
configuration parameter retriesAllDown
,
making sure that Connector/J cycles through the whole list of
hosts for each of its attempt to connect.
(Bug #38785, Bug #11749331)
When using the random load balancing strategy and starting with
two servers that were both unavailable, an
IndexOutOfBoundsException
was generated when
removing a server from the whiteList
.
(Bug #38782)
Connector/J threw the following exception when using a read-only connection:
java.sql.SQLException: Connection is read-only. Queries leading to data modification are not allowed.
(Bug #38747)
Connector/J was unable to connect when using a
non-latin1
password.
(Bug #37570)
The useOldAliasMetadataBehavior
connection
property was ignored.
(Bug #35753)
Incorrect result is returned from
isAfterLast()
in streaming
ResultSet
when using
setFetchSize(Integer.MIN_VALUE)
.
(Bug #35170)
When getGeneratedKeys()
was called on a
statement that had not been created with
RETURN_GENERATED_KEYS
, no exception was
thrown, and batched executions then returned erroneous values.
(Bug #34185)
The loadBalance
bestResponseTime
blacklists did not have a
global state.
(Bug #33861)