[CONJ-619] Multiple batch update fails after LOAD DATA LOCAL INFILE Created: 2018-06-18  Updated: 2021-05-12  Resolved: 2021-02-08

Status: Closed
Project: MariaDB Connector/J
Component/s: batch
Affects Version/s: 2.2.4, 2.2.5
Fix Version/s: 2.7.3

Type: Bug Priority: Major
Reporter: Kausik Assignee: Diego Dupin
Resolution: Fixed Votes: 0
Labels: None
Environment:

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.


Generated at Thu Feb 08 03:17:05 UTC 2024 using Jira 8.20.16#820016-sha1:9d11dbea5f4be3d4cc21f03a88dd11d8c8687422.