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
'서버 > Kotlin-Spring_Boot' 카테고리의 다른 글
| 코틀린 should have [public, protected] no-arg constructor (0) | 2023.05.29 |
|---|---|
| Suspend function 'await' should be called only from a coroutine or another suspend function (0) | 2023.05.26 |
| Axios, Spring Security 403 혹은 network err 날 때 해결 방법 (0) | 2023.04.20 |
| Could not autowire. No beans of 'JavaMailSender' type found. 에러 해결 (0) | 2023.04.11 |
| JpaRepository SQLInsert ID column 순서 바뀜 주의... (0) | 2023.03.12 |
댓글