본문 바로가기
서버/Kotlin-Spring_Boot

jdbctemplate Connection org.mariadb.jdbc.Connection@4c3269f marked as broken because of SQLSTATE(08000), ErrorCode(1220) java.sql.SQLNonTransientConnectionException: (conn=3610) Connection is closed

by HDobby 2023. 5. 25.
2023-05-25T23:55:23.311+09:00  WARN 2656 --- [         task-2] com.zaxxer.hikari.pool.ProxyConnection   : HikariPool-1 - Connection org.mariadb.jdbc.Connection@4c3269f marked as broken because of SQLSTATE(08000), ErrorCode(1220)

java.sql.SQLNonTransientConnectionException: (conn=3610) Connection is closed
	at org.mariadb.jdbc.export.ExceptionFactory.createException(ExceptionFactory.java:293) ~[mariadb-java-client-3.0.9.jar:na]
	at org.mariadb.jdbc.export.ExceptionFactory.create(ExceptionFactory.java:370) ~[mariadb-java-client-3.0.9.jar:na]
	at org.mariadb.jdbc.client.impl.StandardClient.checkNotClosed(StandardClient.java:874) ~[mariadb-java-client-3.0.9.jar:na]
	at org.mariadb.jdbc.client.impl.StandardClient.sendQuery(StandardClient.java:485) ~[mariadb-java-client-3.0.9.jar:na]
	at org.mariadb.jdbc.client.impl.StandardClient.execute(StandardClient.java:639) ~[mariadb-java-client-3.0.9.jar:na]
	at org.mariadb.jdbc.client.impl.StandardClient.execute(StandardClient.java:515) ~[mariadb-java-client-3.0.9.jar:na]
	at org.mariadb.jdbc.Connection.setAutoCommit(Connection.java:196) ~[mariadb-java-client-3.0.9.jar:na]
	at com.zaxxer.hikari.pool.ProxyConnection.setAutoCommit(ProxyConnection.java:401) ~[HikariCP-5.0.1.jar:na]
	at com.zaxxer.hikari.pool.HikariProxyConnection.setAutoCommit(HikariProxyConnection.java) ~[HikariCP-5.0.1.jar:na]
	at org.hibernate.resource.jdbc.internal.AbstractLogicalConnectionImplementor.resetConnection(AbstractLogicalConnectionImplementor.java:106) ~[hibernate-core-6.1.6.Final.jar:6.1.6.Final]
	at org.hibernate.resource.jdbc.internal.LogicalConnectionManagedImpl.afterCompletion(LogicalConnectionManagedImpl.java:281) ~[hibernate-core-6.1.6.Final.jar:6.1.6.Final]
	at org.hibernate.resource.jdbc.internal.AbstractLogicalConnectionImplementor.rollback(AbstractLogicalConnectionImplementor.java:130) ~[hibernate-core-6.1.6.Final.jar:6.1.6.Final]
	at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl$TransactionDriverControlImpl.rollback(JdbcResourceLocalTransactionCoordinatorImpl.java:304) ~[hibernate-core-6.1.6.Final.jar:6.1.6.Final]
	at org.hibernate.engine.transaction.internal.TransactionImpl.rollback(TransactionImpl.java:142) ~[hibernate-core-6.1.6.Final.jar:6.1.6.Final]
	at org.springframework.orm.jpa.JpaTransactionManager.doRollback(JpaTransactionManager.java:589) ~[spring-orm-6.0.3.jar:6.0.3]
	at org.springframework.transaction.support.AbstractPlatformTransactionManager.processRollback(AbstractPlatformTransactionManager.java:835) ~[spring-tx-6.0.3.jar:6.0.3]
	at org.springframework.transaction.support.AbstractPlatformTransactionManager.rollback(AbstractPlatformTransactionManager.java:809) ~[spring-tx-6.0.3.jar:6.0.3]
	at org.springframework.transaction.interceptor.TransactionAspectSupport.completeTransactionAfterThrowing(TransactionAspectSupport.java:672) ~[spring-tx-6.0.3.jar:6.0.3]
	at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:392) ~[spring-tx-6.0.3.jar:6.0.3]
	at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119) ~[spring-tx-6.0.3.jar:6.0.3]
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) ~[spring-aop-6.0.3.jar:6.0.3]
	at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:752) ~[spring-aop-6.0.3.jar:6.0.3]
	at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:703) ~[spring-aop-6.0.3.jar:6.0.3]
	at com.threemovie.threemovieapi.domain.showtime.repository.TmpShowTimeJdbcTemplateRepository$$SpringCGLIB$$0.saveAll(<generated>) ~[main/:na]
	at com.threemovie.threemovieapi.domain.showtime.scheduler.ShowTimeScheduler.chkMovieShowingTime(ShowTimeScheduler.kt:87) ~[main/:na]
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na]
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
	at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na]
	at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:343) ~[spring-aop-6.0.3.jar:6.0.3]
	at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196) ~[spring-aop-6.0.3.jar:6.0.3]
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) ~[spring-aop-6.0.3.jar:6.0.3]
	at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:752) ~[spring-aop-6.0.3.jar:6.0.3]
	at org.springframework.aop.interceptor.AsyncExecutionInterceptor.lambda$invoke$0(AsyncExecutionInterceptor.java:115) ~[spring-aop-6.0.3.jar:6.0.3]
	at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) ~[na:na]
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) ~[na:na]
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) ~[na:na]
	at java.base/java.lang.Thread.run(Thread.java:833) ~[na:na]

2023-05-25T23:55:23.317+09:00 ERROR 2656 --- [         task-2] .a.i.SimpleAsyncUncaughtExceptionHandler : Unexpected exception occurred invoking async method: public void com.threemovie.threemovieapi.domain.showtime.scheduler.ShowTimeScheduler.chkMovieShowingTime()

org.springframework.jdbc.UncategorizedSQLException: PreparedStatementCallback; uncategorized SQLException for SQL [INSERT IGNORE INTO tmp_show_time(brchen, brchkr, city, date, items, movieen, movie_id, moviekr, movie_theater, play_kind, screenen, screenkr, total_seat, id)VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)]; SQL state [null]; error code [0]; java.sql.SQLNonTransientConnectionException: (conn=3610) Socket error
	at org.springframework.jdbc.core.JdbcTemplate.translateException(JdbcTemplate.java:1539) ~[spring-jdbc-6.0.3.jar:6.0.3]
	at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:667) ~[spring-jdbc-6.0.3.jar:6.0.3]
	at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:691) ~[spring-jdbc-6.0.3.jar:6.0.3]
	at org.springframework.jdbc.core.JdbcTemplate.batchUpdate(JdbcTemplate.java:1034) ~[spring-jdbc-6.0.3.jar:6.0.3]
	at com.threemovie.threemovieapi.domain.showtime.repository.TmpShowTimeJdbcTemplateRepository.batchInsert(TmpShowTimeJdbcTemplateRepository.kt:36) ~[main/:na]
	at com.threemovie.threemovieapi.domain.showtime.repository.TmpShowTimeJdbcTemplateRepository.saveAll(TmpShowTimeJdbcTemplateRepository.kt:18) ~[main/:na]
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na]
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
	at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na]
	at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:343) ~[spring-aop-6.0.3.jar:6.0.3]
	at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196) ~[spring-aop-6.0.3.jar:6.0.3]
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) ~[spring-aop-6.0.3.jar:6.0.3]
	at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:752) ~[spring-aop-6.0.3.jar:6.0.3]
	at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:137) ~[spring-tx-6.0.3.jar:6.0.3]
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) ~[spring-aop-6.0.3.jar:6.0.3]
	at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:752) ~[spring-aop-6.0.3.jar:6.0.3]
	at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:123) ~[spring-tx-6.0.3.jar:6.0.3]
	at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:388) ~[spring-tx-6.0.3.jar:6.0.3]
	at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119) ~[spring-tx-6.0.3.jar:6.0.3]
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) ~[spring-aop-6.0.3.jar:6.0.3]
	at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:752) ~[spring-aop-6.0.3.jar:6.0.3]
	at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:703) ~[spring-aop-6.0.3.jar:6.0.3]
	at com.threemovie.threemovieapi.domain.showtime.repository.TmpShowTimeJdbcTemplateRepository$$SpringCGLIB$$0.saveAll(<generated>) ~[main/:na]
	at com.threemovie.threemovieapi.domain.showtime.scheduler.ShowTimeScheduler.chkMovieShowingTime(ShowTimeScheduler.kt:87) ~[main/:na]
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na]
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
	at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na]
	at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:343) ~[spring-aop-6.0.3.jar:6.0.3]
	at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196) ~[spring-aop-6.0.3.jar:6.0.3]
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) ~[spring-aop-6.0.3.jar:6.0.3]
	at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:752) ~[spring-aop-6.0.3.jar:6.0.3]
	at org.springframework.aop.interceptor.AsyncExecutionInterceptor.lambda$invoke$0(AsyncExecutionInterceptor.java:115) ~[spring-aop-6.0.3.jar:6.0.3]
	at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) ~[na:na]
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) ~[na:na]
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) ~[na:na]
	at java.base/java.lang.Thread.run(Thread.java:833) ~[na:na]
Caused by: java.sql.BatchUpdateException: java.sql.SQLNonTransientConnectionException: (conn=3610) Socket error
	at org.mariadb.jdbc.export.ExceptionFactory.createBatchUpdate(ExceptionFactory.java:181) ~[mariadb-java-client-3.0.9.jar:na]
	at org.mariadb.jdbc.ClientPreparedStatement.executeBatchBulk(ClientPreparedStatement.java:179) ~[mariadb-java-client-3.0.9.jar:na]
	at org.mariadb.jdbc.ClientPreparedStatement.executeInternalPreparedBatch(ClientPreparedStatement.java:115) ~[mariadb-java-client-3.0.9.jar:na]
	at org.mariadb.jdbc.ClientPreparedStatement.executeBatch(ClientPreparedStatement.java:466) ~[mariadb-java-client-3.0.9.jar:na]
	at com.zaxxer.hikari.pool.ProxyStatement.executeBatch(ProxyStatement.java:127) ~[HikariCP-5.0.1.jar:na]
	at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.executeBatch(HikariProxyPreparedStatement.java) ~[HikariCP-5.0.1.jar:na]
	at org.springframework.jdbc.core.JdbcTemplate.lambda$batchUpdate$4(JdbcTemplate.java:1047) ~[spring-jdbc-6.0.3.jar:6.0.3]
	at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:651) ~[spring-jdbc-6.0.3.jar:6.0.3]
	... 36 common frames omitted
Caused by: java.sql.BatchUpdateException: java.sql.SQLNonTransientConnectionException: (conn=3610) Socket error
	at org.mariadb.jdbc.export.ExceptionFactory.createBatchUpdate(ExceptionFactory.java:206) ~[mariadb-java-client-3.0.9.jar:na]
	at org.mariadb.jdbc.client.impl.StandardClient.executePipeline(StandardClient.java:624) ~[mariadb-java-client-3.0.9.jar:na]
	at org.mariadb.jdbc.ClientPreparedStatement.executeBatchBulk(ClientPreparedStatement.java:148) ~[mariadb-java-client-3.0.9.jar:na]
	... 42 common frames omitted
Caused by: java.sql.SQLNonTransientConnectionException: (conn=3610) Socket error
	at org.mariadb.jdbc.export.ExceptionFactory.createException(ExceptionFactory.java:293) ~[mariadb-java-client-3.0.9.jar:na]
	at org.mariadb.jdbc.export.ExceptionFactory.create(ExceptionFactory.java:359) ~[mariadb-java-client-3.0.9.jar:na]
	at org.mariadb.jdbc.client.impl.StandardClient.sendQuery(StandardClient.java:510) ~[mariadb-java-client-3.0.9.jar:na]
	at org.mariadb.jdbc.client.impl.StandardClient.executePipeline(StandardClient.java:569) ~[mariadb-java-client-3.0.9.jar:na]
	... 43 common frames omitted
Caused by: java.net.SocketException: Connection reset by peer
	at java.base/sun.nio.ch.NioSocketImpl.implWrite(NioSocketImpl.java:420) ~[na:na]
	at java.base/sun.nio.ch.NioSocketImpl.write(NioSocketImpl.java:440) ~[na:na]
	at java.base/sun.nio.ch.NioSocketImpl$2.write(NioSocketImpl.java:826) ~[na:na]
	at java.base/java.net.Socket$SocketOutputStream.write(Socket.java:1035) ~[na:na]
	at org.mariadb.jdbc.client.socket.impl.PacketWriter.writeSocket(PacketWriter.java:834) ~[mariadb-java-client-3.0.9.jar:na]
	at org.mariadb.jdbc.client.socket.impl.PacketWriter.flushBufferStopAtMark(PacketWriter.java:782) ~[mariadb-java-client-3.0.9.jar:na]
	at org.mariadb.jdbc.client.socket.impl.PacketWriter.growBuffer(PacketWriter.java:657) ~[mariadb-java-client-3.0.9.jar:na]
	at org.mariadb.jdbc.client.socket.impl.PacketWriter.writeBytes(PacketWriter.java:234) ~[mariadb-java-client-3.0.9.jar:na]
	at org.mariadb.jdbc.plugin.codec.StringCodec.encodeBinary(StringCodec.java:280) ~[mariadb-java-client-3.0.9.jar:na]
	at org.mariadb.jdbc.codec.Parameter.encodeBinary(Parameter.java:58) ~[mariadb-java-client-3.0.9.jar:na]
	at org.mariadb.jdbc.message.client.BulkExecutePacket.encode(BulkExecutePacket.java:120) ~[mariadb-java-client-3.0.9.jar:na]
	at org.mariadb.jdbc.message.client.RedoableWithPrepareClientMessage.encode(RedoableWithPrepareClientMessage.java:44) ~[mariadb-java-client-3.0.9.jar:na]
	at org.mariadb.jdbc.client.impl.StandardClient.sendQuery(StandardClient.java:490) ~[mariadb-java-client-3.0.9.jar:na]
	... 44 common frames omitted

batch size가 너무 크거나 db쪽의 메모리를 오바해서 발생하는 것으로 추정된다.

@Transactional
	fun saveAll(tmpShowTimes: List<TmpShowTime>) {
		val sql =
			"INSERT IGNORE INTO tmp_show_time(brchen, brchkr, city, date, items, movieen, movie_id, moviekr, movie_theater, play_kind, screenen, screenkr, total_seat, id)" +
					"VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"
		jdbcTemplate.batchUpdate(sql,
			object : BatchPreparedStatementSetter {
				override fun setValues(ps: PreparedStatement, i: Int) {
					ps.setString(1, tmpShowTimes[i].brchEN)
					ps.setString(2, tmpShowTimes[i].brchKR)
					ps.setString(3, tmpShowTimes[i].city)
					ps.setString(4, tmpShowTimes[i].date)
					ps.setString(5, tmpShowTimes[i].items)
					ps.setString(6, tmpShowTimes[i].movieEN)
					ps.setString(7, tmpShowTimes[i].movieId)
					ps.setString(8, tmpShowTimes[i].movieKR)
					ps.setString(9, tmpShowTimes[i].movieTheater)
					ps.setString(10, tmpShowTimes[i].playKind)
					ps.setString(11, tmpShowTimes[i].screenEN)
					ps.setString(12, tmpShowTimes[i].screenKR)
					ps.setInt(13, tmpShowTimes[i].totalSeat)
					ps.setString(14, tmpShowTimes[i].id.toString())
				}
				
				override fun getBatchSize(): Int = tmpShowTimes.size
			}
		)
	}

 

batch size를 1000 단위로 줄인 뒤에 실행을 하면 에러 없이 잘 돌아간다.

@Repository
class TmpShowTimeJdbcTemplateRepository {
	@Autowired
	lateinit var jdbcTemplate: JdbcTemplate
	
	@Transactional
	fun saveAll(tmpShowTimes: List<TmpShowTime>) {
		var tmpShowTimeArray = ArrayList<TmpShowTime>()
		for (i: Int in tmpShowTimes.indices) {
			tmpShowTimeArray.add(tmpShowTimes[i])
			if ((i + 1) % 1000 == 0) {
				batchInsert(tmpShowTimeArray)
				tmpShowTimeArray.clear()
			} else if (i == tmpShowTimes.size - 1) {
				batchInsert(tmpShowTimeArray)
				return
			}
		}
	}
	
	private fun batchInsert(tmpShowTimes: List<TmpShowTime>) {
		val sql =
			"INSERT IGNORE INTO tmp_show_time(brchen, brchkr, city, date, items, movieen, movie_id, moviekr, movie_theater, play_kind, screenen, screenkr, total_seat, id)" +
					"VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"
		jdbcTemplate.batchUpdate(sql,
			object : BatchPreparedStatementSetter {
				override fun setValues(ps: PreparedStatement, i: Int) {
					ps.setString(1, tmpShowTimes[i].brchEN)
					ps.setString(2, tmpShowTimes[i].brchKR)
					ps.setString(3, tmpShowTimes[i].city)
					ps.setString(4, tmpShowTimes[i].date)
					ps.setString(5, tmpShowTimes[i].items)
					ps.setString(6, tmpShowTimes[i].movieEN)
					ps.setString(7, tmpShowTimes[i].movieId)
					ps.setString(8, tmpShowTimes[i].movieKR)
					ps.setString(9, tmpShowTimes[i].movieTheater)
					ps.setString(10, tmpShowTimes[i].playKind)
					ps.setString(11, tmpShowTimes[i].screenEN)
					ps.setString(12, tmpShowTimes[i].screenKR)
					ps.setInt(13, tmpShowTimes[i].totalSeat)
					ps.setString(14, tmpShowTimes[i].id.toString())
				}
				
				override fun getBatchSize(): Int = tmpShowTimes.size
			}
		)
	}
}
728x90

댓글