Details
-
Bug
-
Status: Closed (View Workflow)
-
Major
-
Resolution: Fixed
-
2.2.4, 2.2.5
-
None
-
Windows 10 (also reproduced in RHEL 7.1), Java 8, Mysql 5.7.
Description
java.sql.Statement.executeBatch() fails when multiple addBatch(..) commands are present following a 'LOAD DATA LOCAL FILE' command.
To reproduce, use below code. Database queries for table creations and files are provided within the code.
package com.kausik.temp;
|
|
import java.sql.Connection;
|
import java.sql.SQLException;
|
import java.sql.Statement;
|
|
import org.mariadb.jdbc.MySQLDataSource;
|
import org.mariadb.jdbc.MariaDbDataSource;
|
|
/**
|
* Create Table 'infiletest' within the schema 'powertest'
|
*
|
* CREATE TABLE infiletest (
|
id int(11) NOT NULL AUTO_INCREMENT,
|
name varchar(30) DEFAULT NULL,
|
PRIMARY KEY (`id`)
|
);
|
|
|
*
|
*
|
*/
|
|
public class MariaDBConnectorBatchUpdateFailTest {
|
|
public static void excuteBatch(){
|
MariaDbDataSource mysqlDS = null;
|
//MySQLDataSource mysqlDS = null; //Reproduced with this data source as well
|
Connection con = null;
|
String DB_URL="jdbc:mysql://localhost:3306/powertest";
|
String DB_USERNAME="root";
|
String batch_update="LOAD DATA LOCAL INFILE 'C:/tmp/insert_infile.dat' INTO TABLE powertest.infiletest CHARACTER SET utf8 FIELDS TERMINATED BY ',' ENCLOSED BY '\"' LINES TERMINATED BY '\n'";
|
|
/**
|
* The content of C:/tmp/insert_infile.dat is a single line as below
|
* "","test_name"
|
*/
|
|
try {
|
//mysqlDS = new MySQLDataSource(); //Exception is thrown even with this data-source
|
mysqlDS = new MariaDbDataSource();
|
|
mysqlDS.setUrl(DB_URL);
|
mysqlDS.setUser(DB_USERNAME);
|
|
//mysqlDS.setPassword(props.getProperty("MYSQL_DB_PASSWORD")); //The mysql test set up has no password
|
con =mysqlDS.getConnection();
|
con.setAutoCommit(false);
|
|
Statement smt=con.createStatement();
|
smt.addBatch(batch_update);
|
smt.addBatch("SET UNIQUE_CHECKS=1");
|
int[] updateStatus=smt.executeBatch();
|
System.out.println("Status[0]="+updateStatus[0]);
|
con.commit();
|
} catch (Exception e) {
|
e.printStackTrace();
|
}finally{
|
try {
|
con.close();
|
} catch (SQLException e) {
|
e.printStackTrace();
|
}
|
}
|
}
|
|
|
public static void main(String[] args) {
|
excuteBatch();
|
}
|
|
}
|
The stack trace:
java.sql.BatchUpdateException: (conn=55) Software caused connection abort: socket write error
|
at org.mariadb.jdbc.MariaDbStatement.executeBatchExceptionEpilogue(MariaDbStatement.java:275)
|
at org.mariadb.jdbc.MariaDbStatement.executeBatch(MariaDbStatement.java:1252)
|
at com.kausik.temp.MariaDBConnectorBatchUpdateFailTest.excuteBatch(MariaDBConnectorBatchUpdateFailTest.java:53)
|
at com.kausik.temp.MariaDBConnectorBatchUpdateFailTest.main(MariaDBConnectorBatchUpdateFailTest.java:69)
|
Caused by: java.sql.SQLNonTransientConnectionException: (conn=55) Software caused connection abort: socket write error
|
at org.mariadb.jdbc.internal.util.exceptions.ExceptionMapper.get(ExceptionMapper.java:175)
|
at org.mariadb.jdbc.internal.util.exceptions.ExceptionMapper.getException(ExceptionMapper.java:110)
|
at org.mariadb.jdbc.MariaDbStatement.executeBatchExceptionEpilogue(MariaDbStatement.java:272)
|
... 3 more
|
Caused by: java.sql.SQLException: Software caused connection abort: socket write error
|
Query is: LOAD DATA LOCAL INFILE 'C:/tmp/insert_infile.dat' INTO TABLE powertest.infiletest CHARACTER SET utf8 FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '
|
'
|
at org.mariadb.jdbc.internal.util.LogQueryTool.exceptionWithQuery(LogQueryTool.java:119)
|
at org.mariadb.jdbc.internal.protocol.AbstractQueryProtocol$2.handleResultException(AbstractQueryProtocol.java:700)
|
at org.mariadb.jdbc.internal.protocol.AsyncMultiRead.call(AsyncMultiRead.java:140)
|
at org.mariadb.jdbc.internal.protocol.AsyncMultiRead.call(AsyncMultiRead.java:67)
|
at java.util.concurrent.FutureTask.run(Unknown Source)
|
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
|
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
|
at java.lang.Thread.run(Unknown Source)
|
Caused by: java.net.SocketException: Software caused connection abort: socket write error
|
at java.net.SocketOutputStream.socketWrite0(Native Method)
|
at java.net.SocketOutputStream.socketWrite(Unknown Source)
|
at java.net.SocketOutputStream.write(Unknown Source)
|
at org.mariadb.jdbc.internal.io.output.StandardPacketOutputStream.flushBuffer(StandardPacketOutputStream.java:110)
|
at org.mariadb.jdbc.internal.io.output.AbstractPacketOutputStream.flush(AbstractPacketOutputStream.java:172)
|
at org.mariadb.jdbc.internal.protocol.AbstractQueryProtocol.readLocalInfilePacket(AbstractQueryProtocol.java:1573)
|
at org.mariadb.jdbc.internal.protocol.AbstractQueryProtocol.readPacket(AbstractQueryProtocol.java:1371)
|
at org.mariadb.jdbc.internal.protocol.AbstractQueryProtocol.getResult(AbstractQueryProtocol.java:1328)
|
at org.mariadb.jdbc.internal.protocol.AsyncMultiRead.call(AsyncMultiRead.java:137)
|
... 5 more
|
----------------------------------------------------------------------------------------------------
Note: When the same code is executed in eclipse debug mode in steps, there were no exception is thrown and the batch-updates were successful.