[feature request] - detect duplicates
I found out that refreshing the library crashes if the method find duplicate files (same name, same size). A method to skip (and better to log) it woud be awesome!
2025-06-20T10:25:27.660+02:00 WARN 1 --- [booklore-api] [ virtual-354] o.m.jdbc.message.server.ErrorPacket : Error: 1205-HY000: Lock wait timeout exceeded; try restarting transaction 2025-06-20T10:25:27.661+02:00 INFO 1 --- [booklore-api] [ virtual-354] org.hibernate.orm.jdbc.batch : HHH100503: On release of batch it still contained JDBC statements 2025-06-20T10:25:27.661+02:00 WARN 1 --- [booklore-api] [ virtual-354] org.hibernate.orm.jdbc.error : HHH000247: ErrorCode: 1205, SQLState: HY000 2025-06-20T10:25:27.661+02:00 WARN 1 --- [booklore-api] [ virtual-354] org.hibernate.orm.jdbc.error : (conn=32) Lock wait timeout exceeded; try restarting transaction Exception in thread "" org.springframework.dao.CannotAcquireLockException: could not execute batch [(conn=32) Lock wait timeout exceeded; try restarting transaction] [update book set added_on=?,book_type=?,file_name=?,file_size_kb=?,file_sub_path=?,library_id=?,library_path_id=?,metadata_match_score=?,similar_books_json=? where id=?]; SQL [update book set added_on=?,book_type=?,file_name=?,file_size_kb=?,file_sub_path=?,library_id=?,library_path_id=?,metadata_match_score=?,similar_books_json=? where id=?] at org.springframework.orm.jpa.vendor.HibernateJpaDialect.convertHibernateAccessException(HibernateJpaDialect.java:287) at org.springframework.orm.jpa.vendor.HibernateJpaDialect.convertHibernateAccessException(HibernateJpaDialect.java:256) at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:244) at org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:566) at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:795) at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:758) at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:698) at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:416) at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:728) at com.adityachandel.booklore.service.fileprocessor.PdfProcessor$$SpringCGLIB$$0.processFile(<generated>) at com.adityachandel.booklore.service.library.LibraryProcessingService.processLibraryFile(LibraryProcessingService.java:271) at com.adityachandel.booklore.service.library.LibraryProcessingService.processLibraryFiles(LibraryProcessingService.java:259) at com.adityachandel.booklore.service.library.LibraryProcessingService.rescanLibrary(LibraryProcessingService.java:171) at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(Unknown Source) at java.base/java.lang.reflect.Method.invoke(Unknown Source) at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:359) at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:380) at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:728) at com.adityachandel.booklore.service.library.LibraryProcessingService$$SpringCGLIB$$0.rescanLibrary(<generated>) at com.adityachandel.booklore.service.library.LibraryService.lambda$rescanLibrary$9(LibraryService.java:183) at java.base/java.lang.VirtualThread.run(Unknown Source) Caused by: org.hibernate.exception.LockTimeoutException: could not execute batch [(conn=32) Lock wait timeout exceeded; try restarting transaction] [update book set added_on=?,book_type=?,file_name=?,file_size_kb=?,file_sub_path=?,library_id=?,library_path_id=?,metadata_match_score=?,similar_books_json=? where id=?] at org.hibernate.dialect.MariaDBDialect.lambda$buildSQLExceptionConversionDelegate$1(MariaDBDialect.java:362) at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:34) at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:115) at org.hibernate.engine.jdbc.batch.internal.BatchImpl.lambda$performExecution$1(BatchImpl.java:278) at org.hibernate.engine.jdbc.mutation.internal.PreparedStatementGroupSingleTable.forEachStatement(PreparedStatementGroupSingleTable.java:63) at org.hibernate.engine.jdbc.batch.internal.BatchImpl.performExecution(BatchImpl.java:253) at org.hibernate.engine.jdbc.batch.internal.BatchImpl.execute(BatchImpl.java:232) at org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl.executeBatch(JdbcCoordinatorImpl.java:187) at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:672) at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:508) at org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:372) at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:39) at org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:140) at org.hibernate.internal.SessionImpl.doFlush(SessionImpl.java:1448) at org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:490) at org.hibernate.internal.SessionImpl.flushBeforeTransactionCompletion(SessionImpl.java:2351) at org.hibernate.internal.SessionImpl.beforeTransactionCompletion(SessionImpl.java:2020) at org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl.beforeTransactionCompletion(JdbcCoordinatorImpl.java:379) at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.beforeCompletionCallback(JdbcResourceLocalTransactionCoordinatorImpl.java:167) at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl$TransactionDriverControlImpl.commitNoRollbackOnly(JdbcResourceLocalTransactionCoordinatorImpl.java:249) at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl$TransactionDriverControlImpl.commit(JdbcResourceLocalTransactionCoordinatorImpl.java:243) at org.hibernate.engine.transaction.internal.TransactionImpl.commit(TransactionImpl.java:90) at org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:562) ������ ... 23 more Caused by: java.sql.BatchUpdateException: (conn=32) Lock wait timeout exceeded; try restarting transaction at org.mariadb.jdbc.export.ExceptionFactory.createBatchUpdate(ExceptionFactory.java:221) at org.mariadb.jdbc.client.impl.StandardClient.executePipeline(StandardClient.java:1129) at org.mariadb.jdbc.ClientPreparedStatement.executeBatchPipeline(ClientPreparedStatement.java:160) at org.mariadb.jdbc.ClientPreparedStatement.executeInternalPreparedBatch(ClientPreparedStatement.java:140) at org.mariadb.jdbc.BasePreparedStatement.executeBatchInternal(BasePreparedStatement.java:1694) at org.mariadb.jdbc.BasePreparedStatement.executeBatch(BasePreparedStatement.java:1680) at com.zaxxer.hikari.pool.ProxyStatement.executeBatch(ProxyStatement.java:128) at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.executeBatch(HikariProxyPreparedStatement.java) at org.hibernate.engine.jdbc.batch.internal.BatchImpl.lambda$performExecution$1(BatchImpl.java:264) ������ ... 42 more Caused by: java.sql.SQLException: (conn=32) Lock wait timeout exceeded; try restarting transaction at org.mariadb.jdbc.export.ExceptionFactory.createException(ExceptionFactory.java:306) at org.mariadb.jdbc.export.ExceptionFactory.create(ExceptionFactory.java:378) at org.mariadb.jdbc.message.ClientMessage.readPacket(ClientMessage.java:187) at org.mariadb.jdbc.client.impl.StandardClient.readPacket(StandardClient.java:1364) at org.mariadb.jdbc.client.impl.StandardClient.readResults(StandardClient.java:1303) at org.mariadb.jdbc.client.impl.StandardClient.readResponse(StandardClient.java:1222) at org.mariadb.jdbc.client.impl.StandardClient.executePipeline(StandardClient.java:1062)