Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

SQL Error: 90098, SQLState: 90098 The database has been closed #49

Closed
sardaukar opened this issue Jan 2, 2020 · 23 comments
Closed

SQL Error: 90098, SQLState: 90098 The database has been closed #49

sardaukar opened this issue Jan 2, 2020 · 23 comments

Comments

@sardaukar
Copy link

Trying to run Komga inside Docker and it all seems to work fine, but after a few minutes of using up 100% of the CPU and ~4.5GB of RAM, it starts showing

WARN 1 --- [kTaskExecutor-1] o.h.engine.jdbc.spi.SqlExceptionHelper   : SQL Error: 90098, SQLState: 90098,
ERROR 1 --- [kTaskExecutor-1] o.h.engine.jdbc.spi.SqlExceptionHelper   : The database has been closed [90098-200],
INFO 1 --- [kTaskExecutor-1] o.h.e.internal.DefaultLoadEventListener  : HHH000327: Error performing load command : org.hibernate.exception.JDBCConnectionException: could not extract ResultSet

in the logs, and all I get is 504 timeouts from that point on. It's still using up a lot of CPU, but the logs have a lot of exceptions about the database being closed.

I have around 600GB of PDFs and CBZ/CBRs.

@sardaukar
Copy link
Author

I also get heap space errors:

ERROR 1 --- [Catalina-utility-4] o.a.coyote.http11.Http11NioProtocol      : Error processing async timeouts

java.util.concurrent.ExecutionException: java.lang.OutOfMemoryError: Java heap space
        at java.base/java.util.concurrent.FutureTask.report(Unknown Source) ~[na:na]
        at java.base/java.util.concurrent.FutureTask.get(Unknown Source) ~[na:na]
        at org.apache.coyote.AbstractProtocol.startAsyncTimeout(AbstractProtocol.java:609) ~[tomcat-embed-core-9.0.29.jar:9.0.29]
        at org.apache.coyote.AbstractProtocol$1.run(AbstractProtocol.java:592) ~[tomcat-embed-core-9.0.29.jar:9.0.29]
        at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source) ~[na:na]
        at java.base/java.util.concurrent.FutureTask.runAndReset(Unknown Source) ~[na:na]
        at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(Unknown Source) ~[na:na]
        at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) ~[na:na]
        at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) ~[na:na]
        at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-9.0.29.jar:9.0.29]
        at java.base/java.lang.Thread.run(Unknown Source) ~[na:na]
Caused by: java.lang.OutOfMemoryError: Java heap space

@gotson
Copy link
Owner

gotson commented Jan 2, 2020

Hi,

database code 90098 doesn't give me much information, it just says the database has been closed, but not for which reason.

Would you be able to provide the complete log file in a gist?

I have ~320gb of books, and Komga goes through that in about 1h30m.

What kind of hardware/os do you run it on ?

@sardaukar
Copy link
Author

I zipped up and put the logs online at http://www.qoob.duckdns.org/komga_logs.7z

I'm running this on a Debian NAS with 16GB of RAM and an Athlon 200GE CPU. I changed the container to have a max of 2GB of RAM, but am now running it with no usage limit.

It seems like the scanning thread takes over and locks up, because after the first minute or so of uptime, I can no longer access the web UI and only get 504s.

@gotson
Copy link
Owner

gotson commented Jan 2, 2020

Could you try running the container without memory limit, add only one library, and let it run until it finishes? You can docker logs -f to tail the logs.

Once finished (if it does!), could you also check this endpoint: /actuator/metrics/process.files.open and report the content?

@sardaukar
Copy link
Author

sardaukar commented Jan 2, 2020

Yeah, I'm starting over with a new database and a smaller share of only magazine PDFs this time (I believe my comics share with CBZs and CBRs triggers the problem). Web UI seems responsive now.

Unrelated, but I'm seeing a lot of

ERROR 1 --- [kTaskExecutor-1] o.a.p.contentstream.PDFStreamEngine      : Cannot read JPEG2000 image: Java Advanced Imaging (JAI) Image I/O Tools are not installed

messages - maybe a good idea to include JAI? Not sure how easy that is.

Here's the current output of the metrics endpoint (still running the scan)

{
  "name":"process.files.open",
  "description":"The open file descriptor count",
  "baseUnit":"files",
  "measurements":[
    {"statistic":"VALUE","value":153.0}
  ],
  "availableTags":[]
}

@gotson
Copy link
Owner

gotson commented Jan 2, 2020

Thanks for the report. As long as the file descriptor count remains under 200 that should be good, if it sky rockets then there's an issue.

Please let me know what you find out about your cbz and cbr shares.

About the jpeg2000 error could you open a new issue, and if possible specify what symptom you observe (cannot generate cover, cannot access pages) and also provide the impacted file? You can send the url via pm to my reddit if you don't want to share publicly (u/redpantshk).

Indeed I read something about JAI in the documentation of Apache pdfbox, but I didn't pay for it 🙄

@sardaukar
Copy link
Author

It seems to be working fine now, consuming 4.9GB of RAM (which is a bit steep :D)

I do see a lot of

2020-01-02 14:37:35.884  INFO 1 --- [analyzeBookTaskExecutor-2] org.hibernate.orm.cache                  : HHH90001005: Cache[cache.media.collection.pages] Key[org.gotson.komga.domain.model.Media._pages#15934]
A soft-locked cache entry was expired by the underlying cache. If this happens regularly you should consider increasing the cache timeouts and/or capacity limits
2020-01-02 14:37:35.886  INFO 1 --- [analyzeBookTaskExecutor-2] o.h.c.s.support.AbstractReadWriteAccess  : Cached entry expired : org.gotson.komga.domain.model.Media._pages#15934
2020-01-02 14:37:35.889  INFO 1 --- [analyzeBookTaskExecutor-2] org.hibernate.orm.cache                  : HHH90001005: Cache[cache.media] Key[org.gotson.komga.domain.model.Media#15934]
A soft-locked cache entry was expired by the underlying cache. If this happens regularly you should consider increasing the cache timeouts and/or capacity limits
2020-01-02 14:37:35.892  INFO 1 --- [analyzeBookTaskExecutor-2] o.h.c.s.support.AbstractReadWriteAccess  : Cached entry expired : org.gotson.komga.domain.model.Media#15934

anything I can configure to help?

@sardaukar
Copy link
Author

By "a lot" I mean 6527 lines on a 54k lines log file.

@sardaukar
Copy link
Author

Well, spoke too soon - I added my comics folder as a library and all hell broke loose:

2020-01-02 14:52:42.385  INFO 1 --- [analyzeBookTaskExecutor-1] o.g.komga.domain.service.BookAnalyzer    : Trying to analyze book: /books/comics/IDW Ultimate Collection (2002-2017)/3 Devils (001-004)(2016).zip
2020-01-02 14:52:42.467  INFO 1 --- [analyzeBookTaskExecutor-1] o.g.komga.domain.service.BookAnalyzer    : Detected media type: application/zip
2020-01-02 14:52:42.663  INFO 1 --- [analyzeBookTaskExecutor-1] o.g.komga.domain.service.BookAnalyzer    : Book has 0 pages 
2020-01-02 14:52:42.666  INFO 1 --- [analyzeBookTaskExecutor-1] o.g.komga.domain.service.BookAnalyzer    : Trying to generate cover for book: /books/comics/IDW Ultimate Collection (2002-2017)/3 Devils (001-004)(2016).zip
2020-01-02 14:52:42.698 ERROR 1 --- [analyzeBookTaskExecutor-1] o.g.komga.domain.service.BookLifecycle   : Error while parsing. Book: /books/comics/IDW Ultimate Collection (2002-2017)/3 Devils (001-004)(2016).zip

java.util.NoSuchElementException: List is empty.
  at kotlin.collections.CollectionsKt___CollectionsKt.first(_Collections.kt:196) ~[kotlin-stdlib-1.3.61.jar:1.3.61-release-180 (1.3.61)]
  at org.gotson.komga.domain.service.BookAnalyzer.analyze(BookAnalyzer.kt:53) ~[app/:na]
  at org.gotson.komga.domain.service.BookLifecycle.analyzeAndPersist(BookLifecycle.kt:35) ~[app/:na]
  at org.gotson.komga.domain.service.BookLifecycle$$FastClassBySpringCGLIB$$6608c007.invoke(<generated>) ~[app/:na]
  at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) ~[spring-core-5.2.2.RELEASE.jar:5.2.2.RELEASE]
  at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:769) ~[spring-aop-5.2.2.RELEASE.jar:5.2.2.RELEASE]
  at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) ~[spring-aop-5.2.2.RELEASE.jar:5.2.2.RELEASE]
  at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:747) ~[spring-aop-5.2.2.RELEASE.jar:5.2.2.RELEASE]
  at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:366) ~[spring-tx-5.2.2.RELEASE.jar:5.2.2.RELEASE]
  at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:99) ~[spring-tx-5.2.2.RELEASE.jar:5.2.2.RELEASE]
  at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.2.2.RELEASE.jar:5.2.2.RELEASE]
  at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:747) ~[spring-aop-5.2.2.RELEASE.jar:5.2.2.RELEASE]
  at org.springframework.aop.interceptor.AsyncExecutionInterceptor.lambda$invoke$0(AsyncExecutionInterceptor.java:115) ~[spring-aop-5.2.2.RELEASE.jar:5.2.2.RELEASE]
  at java.base/java.util.concurrent.FutureTask.run(Unknown Source) ~[na:na]
  at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) ~[na:na]
  at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) ~[na:na]
  at java.base/java.lang.Thread.run(Unknown Source) ~[na:na]

Lots of these :| I guess I'll just use Komga for magazines and books.

@sardaukar
Copy link
Author

And also:

2020-01-02 14:35:11.520  INFO 1 --- [analyzeBookTaskExecutor-1] o.g.komga.domain.service.BookLifecycle   : Analyze and persist book: /books/comics/Gotham Knights/Batman Gotham Knights 53.cbr
2020-01-02 14:35:11.522  INFO 1 --- [analyzeBookTaskExecutor-1] o.g.komga.domain.service.BookAnalyzer    : Trying to analyze book: /books/comics/Gotham Knights/Batman Gotham Knights 53.cbr
2020-01-02 14:35:11.561  INFO 1 --- [analyzeBookTaskExecutor-1] o.g.komga.domain.service.BookAnalyzer    : Detected media type: application/x-rar-compressed
2020-01-02 14:35:11.876  INFO 1 --- [analyzeBookTaskExecutor-1] o.g.komga.domain.service.BookAnalyzer    : Book has 33 pages
2020-01-02 14:35:11.879  INFO 1 --- [analyzeBookTaskExecutor-1] o.g.komga.domain.service.BookAnalyzer    : Trying to generate cover for book: /books/comics/Gotham Knights/Batman Gotham Knights 53.cbr
2020-01-02 14:35:11.910 ERROR 1 --- [analyzeBookTaskExecutor-2] o.g.komga.domain.service.BookLifecycle   : Error while parsing. Book: /books/comics/Gotham Knights/Batman Gotham Knights 52.cbr

com.github.junrar.exception.RarException: ioError
        at com.github.junrar.Archive.getInputStream(Archive.java:541) ~[junrar-4.0.0.jar:na]
        at org.gotson.komga.infrastructure.archive.RarExtractor.getPagesList(RarExtractor.kt:21) ~[app/:na]
        at org.gotson.komga.domain.service.BookAnalyzer.analyze(BookAnalyzer.kt:48) ~[app/:na]
        at org.gotson.komga.domain.service.BookLifecycle.analyzeAndPersist(BookLifecycle.kt:35) ~[app/:na]
        at org.gotson.komga.domain.service.BookLifecycle$$FastClassBySpringCGLIB$$6608c007.invoke(<generated>) ~[app/:na]
        at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) ~[spring-core-5.2.2.RELEASE.jar:5.2.2.RELEASE]
        at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:769) ~[spring-aop-5.2.2.RELEASE.jar:5.2.2.RELEASE]
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) ~[spring-aop-5.2.2.RELEASE.jar:5.2.2.RELEASE]
        at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:747) ~[spring-aop-5.2.2.RELEASE.jar:5.2.2.RELEASE]
        at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:366) ~[spring-tx-5.2.2.RELEASE.jar:5.2.2.RELEASE]
        at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:99) ~[spring-tx-5.2.2.RELEASE.jar:5.2.2.RELEASE]
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.2.2.RELEASE.jar:5.2.2.RELEASE]
        at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:747) ~[spring-aop-5.2.2.RELEASE.jar:5.2.2.RELEASE]
        at org.springframework.aop.interceptor.AsyncExecutionInterceptor.lambda$invoke$0(AsyncExecutionInterceptor.java:115) ~[spring-aop-5.2.2.RELEASE.jar:5.2.2.RELEASE]
        at java.base/java.util.concurrent.FutureTask.run(Unknown Source) ~[na:na]
        at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) ~[na:na]
        at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) ~[na:na]
        at java.base/java.lang.Thread.run(Unknown Source) ~[na:na]
Caused by: com.github.junrar.exception.RarException: crcError
        at com.github.junrar.Archive.doExtractFile(Archive.java:573) ~[junrar-4.0.0.jar:na]
        at com.github.junrar.Archive.extractFile(Archive.java:514) ~[junrar-4.0.0.jar:na]
        at com.github.junrar.Archive.getInputStream(Archive.java:539) ~[junrar-4.0.0.jar:na]
        ... 17 common frames omitted

@sardaukar
Copy link
Author

And the first instance of the DB error on the logs comes from:

2020-01-02 14:47:58.203  INFO 1 --- [analyzeBookTaskExecutor-1] o.g.komga.domain.service.BookLifecycle   : Analyze and persist book: /books/comics/Humble_Transformers_Bundle_Presented_by_IDW/Humble Transformers Bundle Presented by IDW/All Hail Megatron, Vol. 2/transformers_allhailmegatron-vol2_1406591027.pdf
2020-01-02 14:47:58.204  INFO 1 --- [analyzeBookTaskExecutor-1] o.g.komga.domain.service.BookAnalyzer    : Trying to analyze book: /books/comics/Humble_Transformers_Bundle_Presented_by_IDW/Humble Transformers Bundle Presented by IDW/All Hail Megatron, Vol. 2/transformers_allhailmegatron-vol2_1406591027.pdf
2020-01-02 14:47:58.248  INFO 1 --- [analyzeBookTaskExecutor-1] o.g.komga.domain.service.BookAnalyzer    : Detected media type: application/pdf
2020-01-02 14:48:39.208 ERROR 1 --- [Catalina-utility-3] o.a.coyote.http11.Http11NioProtocol      : Error processing async timeouts

java.util.concurrent.ExecutionException: java.lang.OutOfMemoryError: Java heap space
        at java.base/java.util.concurrent.FutureTask.report(Unknown Source) ~[na:na]
        at java.base/java.util.concurrent.FutureTask.get(Unknown Source) ~[na:na]
        at org.apache.coyote.AbstractProtocol.startAsyncTimeout(AbstractProtocol.java:609) ~[tomcat-embed-core-9.0.29.jar:9.0.29]
        at org.apache.coyote.AbstractProtocol$1.run(AbstractProtocol.java:592) ~[tomcat-embed-core-9.0.29.jar:9.0.29]
        at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source) ~[na:na]
        at java.base/java.util.concurrent.FutureTask.runAndReset(Unknown Source) ~[na:na]
        at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(Unknown Source) ~[na:na]
        at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) ~[na:na]
        at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) ~[na:na]
        at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-9.0.29.jar:9.0.29]
        at java.base/java.lang.Thread.run(Unknown Source) ~[na:na]
Caused by: java.lang.OutOfMemoryError: Java heap space
        at java.base/java.util.concurrent.ConcurrentHashMap$KeySetView.iterator(Unknown Source) ~[na:na]
        at java.base/java.util.Collections$SetFromMap.iterator(Unknown Source) ~[na:na]
        at org.apache.coyote.AbstractProtocol$2.run(AbstractProtocol.java:619) ~[tomcat-embed-core-9.0.29.jar:9.0.29]
        ... 7 common frames omitted

2020-01-02 14:48:39.448  WARN 1 --- [analyzeBookTaskExecutor-2] o.h.engine.jdbc.spi.SqlExceptionHelper   : SQL Error: 90098, SQLState: 90098
2020-01-02 14:48:39.450 ERROR 1 --- [analyzeBookTaskExecutor-2] o.h.engine.jdbc.spi.SqlExceptionHelper   : The database has been closed [90098-200]
2020-01-02 14:48:39.465 ERROR 1 --- [analyzeBookTaskExecutor-2] o.s.t.i.TransactionInterceptor           : Application exception overridden by rollback exception

java.lang.OutOfMemoryError: Java heap space

2020-01-02 14:48:39.469  INFO 1 --- [analyzeBookTaskExecutor-2] o.g.komga.domain.service.BookLifecycle   : Analyze and persist book: /books/comics/Humble_Transformers_Bundle_Presented_by_IDW/Humble Transformers Bundle Presented by IDW/All Hail Megatron, Vol. 2/transformers_allhailmegatron_vol2_1405990040.pdf
2020-01-02 14:48:39.472  INFO 1 --- [analyzeBookTaskExecutor-2] o.g.komga.domain.service.BookAnalyzer    : Trying to analyze book: /books/comics/Humble_Transformers_Bundle_Presented_by_IDW/Humble Transformers Bundle Presented by IDW/All Hail Megatron, Vol. 2/transformers_allhailmegatron_vol2_1405990040.pdf
2020-01-02 14:48:39.508  INFO 1 --- [analyzeBookTaskExecutor-2] o.g.komga.domain.service.BookAnalyzer    : Detected media type: application/pdf
2020-01-02 14:48:40.716  INFO 1 --- [analyzeBookTaskExecutor-2] o.g.komga.domain.service.BookAnalyzer    : Book has 154 pages
2020-01-02 14:48:40.719  INFO 1 --- [analyzeBookTaskExecutor-2] o.g.komga.domain.service.BookAnalyzer    : Trying to generate cover for book: /books/comics/Humble_Transformers_Bundle_Presented_by_IDW/Humble Transformers Bundle Presented by IDW/All Hail Megatron, Vol. 2/transformers_allhailmegatron_vol2_1405990040.pdf
2020-01-02 14:48:42.421  WARN 1 --- [analyzeBookTaskExecutor-2] o.a.pdfbox.pdmodel.font.PDTrueTypeFont   : Using fallback font 'LiberationSans' for 'SFSportsNightNSUpright'
2020-01-02 14:48:42.425  WARN 1 --- [analyzeBookTaskExecutor-2] o.a.pdfbox.pdmodel.font.PDTrueTypeFont   : Using fallback font 'LiberationSans' for 'SFTheraminGothic'
2020-01-02 14:48:42.861  WARN 1 --- [analyzeBookTaskExecutor-2] o.h.engine.jdbc.spi.SqlExceptionHelper   : SQL Error: 90098, SQLState: 90098
2020-01-02 14:48:42.862 ERROR 1 --- [analyzeBookTaskExecutor-2] o.h.engine.jdbc.spi.SqlExceptionHelper   : The database has been closed [90098-200]
2020-01-02 14:48:42.866  INFO 1 --- [analyzeBookTaskExecutor-2] o.h.e.internal.DefaultLoadEventListener  : HHH000327: Error performing load command : org.hibernate.exception.JDBCConnectionException: could not extract ResultSet

org.hibernate.exception.JDBCConnectionException: could not extract ResultSet
        at org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:48) ~[hibernate-core-5.4.9.Final.jar:5.4.9.Final]
        at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:42) ~[hibernate-core-5.4.9.Final.jar:5.4.9.Final]
        at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:113) ~[hibernate-core-5.4.9.Final.jar:5.4.9.Final]
        at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:99) ~[hibernate-core-5.4.9.Final.jar:5.4.9.Final]
        at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:67) ~[hibernate-core-5.4.9.Final.jar:5.4.9.Final]
        at org.hibernate.loader.Loader.getResultSet(Loader.java:2292) ~[hibernate-core-5.4.9.Final.jar:5.4.9.Final]
        at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:2050) ~[hibernate-core-5.4.9.Final.jar:5.4.9.Final]
        at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:2012) ~[hibernate-core-5.4.9.Final.jar:5.4.9.Final]
        at org.hibernate.loader.Loader.doQuery(Loader.java:953) ~[hibernate-core-5.4.9.Final.jar:5.4.9.Final]
        at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:354) ~[hibernate-core-5.4.9.Final.jar:5.4.9.Final]
        at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:324) ~[hibernate-core-5.4.9.Final.jar:5.4.9.Final]
        at org.hibernate.loader.Loader.loadEntity(Loader.java:2406) ~[hibernate-core-5.4.9.Final.jar:5.4.9.Final]
        at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:64) ~[hibernate-core-5.4.9.Final.jar:5.4.9.Final]
        at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:54) ~[hibernate-core-5.4.9.Final.jar:5.4.9.Final]
        at org.hibernate.persister.entity.AbstractEntityPersister.load(AbstractEntityPersister.java:4350) ~[hibernate-core-5.4.9.Final.jar:5.4.9.Final]
        at org.hibernate.event.internal.DefaultLoadEventListener.loadFromDatasource(DefaultLoadEventListener.java:569) ~[hibernate-core-5.4.9.Final.jar:5.4.9.Final]
        at org.hibernate.event.internal.DefaultLoadEventListener.doLoad(DefaultLoadEventListener.java:537) ~[hibernate-core-5.4.9.Final.jar:5.4.9.Final]
        at org.hibernate.event.internal.DefaultLoadEventListener.load(DefaultLoadEventListener.java:208) ~[hibernate-core-5.4.9.Final.jar:5.4.9.Final]
        at org.hibernate.event.internal.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:332) ~[hibernate-core-5.4.9.Final.jar:5.4.9.Final]
        at org.hibernate.event.internal.DefaultLoadEventListener.doOnLoad(DefaultLoadEventListener.java:108) ~[hibernate-core-5.4.9.Final.jar:5.4.9.Final]
        at org.hibernate.event.internal.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:74) ~[hibernate-core-5.4.9.Final.jar:5.4.9.Final]
        at org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:118) ~[hibernate-core-5.4.9.Final.jar:5.4.9.Final]
        at org.hibernate.internal.SessionImpl.fireLoadNoChecks(SessionImpl.java:1168) ~[hibernate-core-5.4.9.Final.jar:5.4.9.Final]
        at org.hibernate.internal.SessionImpl.fireLoad(SessionImpl.java:1157) ~[hibernate-core-5.4.9.Final.jar:5.4.9.Final]
        at org.hibernate.internal.SessionImpl.access$2000(SessionImpl.java:197) ~[hibernate-core-5.4.9.Final.jar:5.4.9.Final]
        at org.hibernate.internal.SessionImpl$IdentifierLoadAccessImpl.doLoad(SessionImpl.java:2795) ~[hibernate-core-5.4.9.Final.jar:5.4.9.Final]
        at org.hibernate.internal.SessionImpl$IdentifierLoadAccessImpl.lambda$load$1(SessionImpl.java:2776) ~[hibernate-core-5.4.9.Final.jar:5.4.9.Final]
        at org.hibernate.internal.SessionImpl$IdentifierLoadAccessImpl.perform(SessionImpl.java:2732) ~[hibernate-core-5.4.9.Final.jar:5.4.9.Final]
        at org.hibernate.internal.SessionImpl$IdentifierLoadAccessImpl.load(SessionImpl.java:2776) ~[hibernate-core-5.4.9.Final.jar:5.4.9.Final]
        at org.hibernate.internal.SessionImpl.get(SessionImpl.java:970) ~[hibernate-core-5.4.9.Final.jar:5.4.9.Final]
        at org.hibernate.event.internal.DefaultMergeEventListener.entityIsDetached(DefaultMergeEventListener.java:306) ~[hibernate-core-5.4.9.Final.jar:5.4.9.Final]
        at org.hibernate.event.internal.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:172) ~[hibernate-core-5.4.9.Final.jar:5.4.9.Final]
at org.hibernate.event.internal.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:70) ~[hibernate-core-5.4.9.Final.jar:5.4.9.Final]
        at org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:108) ~[hibernate-core-5.4.9.Final.jar:5.4.9.Final]
        at org.hibernate.internal.SessionImpl.fireMerge(SessionImpl.java:775) ~[hibernate-core-5.4.9.Final.jar:5.4.9.Final]
        at org.hibernate.internal.SessionImpl.merge(SessionImpl.java:762) ~[hibernate-core-5.4.9.Final.jar:5.4.9.Final]
        at jdk.internal.reflect.GeneratedMethodAccessor171.invoke(Unknown Source) ~[na:na]
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[na:na]
        at java.base/java.lang.reflect.Method.invoke(Unknown Source) ~[na:na]
        at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:314) ~[spring-orm-5.2.2.RELEASE.jar:5.2.2.RELEASE]
        at com.sun.proxy.$Proxy167.merge(Unknown Source) ~[na:na]
        at org.springframework.data.jpa.repository.support.SimpleJpaRepository.save(SimpleJpaRepository.java:557) ~[spring-data-jpa-2.2.3.RELEASE.jar:2.2.3.RELEASE]
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) ~[na:na]
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[na:na]
        at java.base/java.lang.reflect.Method.invoke(Unknown Source) ~[na:na]
        at org.springframework.data.repository.core.support.RepositoryComposition$RepositoryFragments.invoke(RepositoryComposition.java:371) ~[spring-data-commons-2.2.3.RELEASE.jar:2.2.3.RELEASE]
        at org.springframework.data.repository.core.support.RepositoryComposition.invoke(RepositoryComposition.java:204) ~[spring-data-commons-2.2.3.RELEASE.jar:2.2.3.RELEASE]
        at org.springframework.data.repository.core.support.RepositoryFactorySupport$ImplementationMethodExecutionInterceptor.invoke(RepositoryFactorySupport.java:657) ~[spring-data-commons-2.2.3.RELEASE.jar:2.2.3.RELEASE]
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.2.2.RELEASE.jar:5.2.2.RELEASE]
        at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.doInvoke(RepositoryFactorySupport.java:621) ~[spring-data-commons-2.2.3.RELEASE.jar:2.2.3.RELEASE]
        at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:605) ~[spring-data-commons-2.2.3.RELEASE.jar:2.2.3.RELEASE]
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.2.2.RELEASE.jar:5.2.2.RELEASE]
        at org.springframework.data.projection.DefaultMethodInvokingMethodInterceptor.invoke(DefaultMethodInvokingMethodInterceptor.java:80) ~[spring-data-commons-2.2.3.RELEASE.jar:2.2.3.RELEASE]
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.2.2.RELEASE.jar:5.2.2.RELEASE]
        at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:366) ~[spring-tx-5.2.2.RELEASE.jar:5.2.2.RELEASE]
        at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:99) ~[spring-tx-5.2.2.RELEASE.jar:5.2.2.RELEASE]
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.2.2.RELEASE.jar:5.2.2.RELEASE]
        at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:139) ~[spring-tx-5.2.2.RELEASE.jar:5.2.2.RELEASE]
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.2.2.RELEASE.jar:5.2.2.RELEASE]
        at org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodInterceptor.invoke(CrudMethodMetadataPostProcessor.java:178) ~[spring-data-jpa-2.2.3.RELEASE.jar:2.2.3.RELEASE]
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.2.2.RELEASE.jar:5.2.2.RELEASE]
        at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:93) ~[spring-aop-5.2.2.RELEASE.jar:5.2.2.RELEASE]
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.2.2.RELEASE.jar:5.2.2.RELEASE]
        at org.springframework.data.repository.core.support.MethodInvocationValidator.invoke(MethodInvocationValidator.java:99) ~[spring-data-commons-2.2.3.RELEASE.jar:2.2.3.RELEASE]
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.2.2.RELEASE.jar:5.2.2.RELEASE]
        at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:212) ~[spring-aop-5.2.2.RELEASE.jar:5.2.2.RELEASE]
        at com.sun.proxy.$Proxy192.save(Unknown Source) ~[na:na]
        at org.gotson.komga.domain.service.BookLifecycle.analyzeAndPersist(BookLifecycle.kt:43) ~[app/:na]
        at org.gotson.komga.domain.service.BookLifecycle$$FastClassBySpringCGLIB$$6608c007.invoke(<generated>) ~[app/:na]
        at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) ~[spring-core-5.2.2.RELEASE.jar:5.2.2.RELEASE]
        at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:769) ~[spring-aop-5.2.2.RELEASE.jar:5.2.2.RELEASE]
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) ~[spring-aop-5.2.2.RELEASE.jar:5.2.2.RELEASE]
        at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:747) ~[spring-aop-5.2.2.RELEASE.jar:5.2.2.RELEASE]
        at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:366) ~[spring-tx-5.2.2.RELEASE.jar:5.2.2.RELEASE]
 at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:99) ~[spring-tx-5.2.2.RELEASE.jar:5.2.2.RELEASE]
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.2.2.RELEASE.jar:5.2.2.RELEASE]
        at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:747) ~[spring-aop-5.2.2.RELEASE.jar:5.2.2.RELEASE]
        at org.springframework.aop.interceptor.AsyncExecutionInterceptor.lambda$invoke$0(AsyncExecutionInterceptor.java:115) ~[spring-aop-5.2.2.RELEASE.jar:5.2.2.RELEASE]
        at java.base/java.util.concurrent.FutureTask.run(Unknown Source) ~[na:na]
        at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) ~[na:na]
        at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) ~[na:na]
        at java.base/java.lang.Thread.run(Unknown Source) ~[na:na]
Caused by: org.h2.jdbc.JdbcSQLNonTransientConnectionException: The database has been closed [90098-200]
        at org.h2.message.DbException.getJdbcSQLException(DbException.java:622) ~[h2-1.4.200.jar:1.4.200]
        at org.h2.message.DbException.getJdbcSQLException(DbException.java:429) ~[h2-1.4.200.jar:1.4.200]
        at org.h2.message.DbException.get(DbException.java:194) ~[h2-1.4.200.jar:1.4.200]
        at org.h2.engine.Session.getTransaction(Session.java:1792) ~[h2-1.4.200.jar:1.4.200]
        at org.h2.engine.Session.startStatementWithinTransaction(Session.java:1815) ~[h2-1.4.200.jar:1.4.200]
        at org.h2.command.Command.executeQuery(Command.java:190) ~[h2-1.4.200.jar:1.4.200]
        at org.h2.jdbc.JdbcPreparedStatement.executeQuery(JdbcPreparedStatement.java:114) ~[h2-1.4.200.jar:1.4.200]
        at com.zaxxer.hikari.pool.ProxyPreparedStatement.executeQuery(ProxyPreparedStatement.java:52) ~[HikariCP-3.4.1.jar:na]
        at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.executeQuery(HikariProxyPreparedStatement.java) ~[HikariCP-3.4.1.jar:na]
        at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:57) ~[hibernate-core-5.4.9.Final.jar:5.4.9.Final]
        ... 78 common frames omitted

2020-01-02 14:48:43.082  WARN 1 --- [analyzeBookTaskExecutor-2] o.h.engine.jdbc.spi.SqlExceptionHelper   : SQL Error: 90098, SQLState: 90098
2020-01-02 14:48:43.084 ERROR 1 --- [analyzeBookTaskExecutor-2] o.h.engine.jdbc.spi.SqlExceptionHelper   : The database has been closed [90098-200]
2020-01-02 14:48:43.086 ERROR 1 --- [analyzeBookTaskExecutor-2] o.s.t.i.TransactionInterceptor           : Application exception overridden by rollback exception

org.springframework.dao.DataAccessResourceFailureException: could not extract ResultSet; nested exception is org.hibernate.exception.JDBCConnectionException: could not extract ResultSet
        at org.springframework.orm.jpa.vendor.HibernateJpaDialect.convertHibernateAccessException(HibernateJpaDialect.java:277) ~[spring-orm-5.2.2.RELEASE.jar:5.2.2.RELEASE]
        at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:255) ~[spring-orm-5.2.2.RELEASE.jar:5.2.2.RELEASE]
        at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.translateExceptionIfPossible(AbstractEntityManagerFactoryBean.java:528) ~[spring-orm-5.2.2.RELEASE.jar:5.2.2.RELEASE]
        at org.springframework.dao.support.ChainedPersistenceExceptionTranslator.translateExceptionIfPossible(ChainedPersistenceExceptionTranslator.java:61) ~[spring-tx-5.2.2.RELEASE.jar:5.2.2.RELEASE]
        at org.springframework.dao.support.DataAccessUtils.translateIfNecessary(DataAccessUtils.java:242) ~[spring-tx-5.2.2.RELEASE.jar:5.2.2.RELEASE]
        at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:153) ~[spring-tx-5.2.2.RELEASE.jar:5.2.2.RELEASE]
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.2.2.RELEASE.jar:5.2.2.RELEASE]
        at org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodInterceptor.invoke(CrudMethodMetadataPostProcessor.java:178) ~[spring-data-jpa-2.2.3.RELEASE.jar:2.2.3.RELEASE]
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.2.2.RELEASE.jar:5.2.2.RELEASE]
        at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:93) ~[spring-aop-5.2.2.RELEASE.jar:5.2.2.RELEASE]
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.2.2.RELEASE.jar:5.2.2.RELEASE]
        at org.springframework.data.repository.core.support.MethodInvocationValidator.invoke(MethodInvocationValidator.java:99) ~[spring-data-commons-2.2.3.RELEASE.jar:2.2.3.RELEASE]
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.2.2.RELEASE.jar:5.2.2.RELEASE]
        at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:212) ~[spring-aop-5.2.2.RELEASE.jar:5.2.2.RELEASE]
        at com.sun.proxy.$Proxy192.save(Unknown Source) ~[na:na]
        at org.gotson.komga.domain.service.BookLifecycle.analyzeAndPersist(BookLifecycle.kt:43) ~[app/:na]
        at org.gotson.komga.domain.service.BookLifecycle$$FastClassBySpringCGLIB$$6608c007.invoke(<generated>) ~[app/:na]
        at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) ~[spring-core-5.2.2.RELEASE.jar:5.2.2.RELEASE]
        at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:769) ~[spring-aop-5.2.2.RELEASE.jar:5.2.2.RELEASE]
 at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) ~[spring-aop-5.2.2.RELEASE.jar:5.2.2.RELEASE]
        at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:747) ~[spring-aop-5.2.2.RELEASE.jar:5.2.2.RELEASE]
        at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:366) ~[spring-tx-5.2.2.RELEASE.jar:5.2.2.RELEASE]
        at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:99) ~[spring-tx-5.2.2.RELEASE.jar:5.2.2.RELEASE]
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.2.2.RELEASE.jar:5.2.2.RELEASE]
        at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:747) ~[spring-aop-5.2.2.RELEASE.jar:5.2.2.RELEASE]
        at org.springframework.aop.interceptor.AsyncExecutionInterceptor.lambda$invoke$0(AsyncExecutionInterceptor.java:115) ~[spring-aop-5.2.2.RELEASE.jar:5.2.2.RELEASE]
        at java.base/java.util.concurrent.FutureTask.run(Unknown Source) ~[na:na]
        at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) ~[na:na]
        at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) ~[na:na]
        at java.base/java.lang.Thread.run(Unknown Source) ~[na:na]
Caused by: org.hibernate.exception.JDBCConnectionException: could not extract ResultSet
        at org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:48) ~[hibernate-core-5.4.9.Final.jar:5.4.9.Final]
        at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:42) ~[hibernate-core-5.4.9.Final.jar:5.4.9.Final]
        at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:113) ~[hibernate-core-5.4.9.Final.jar:5.4.9.Final]
        at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:99) ~[hibernate-core-5.4.9.Final.jar:5.4.9.Final]
        at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:67) ~[hibernate-core-5.4.9.Final.jar:5.4.9.Final]
        at org.hibernate.loader.Loader.getResultSet(Loader.java:2292) ~[hibernate-core-5.4.9.Final.jar:5.4.9.Final]
        at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:2050) ~[hibernate-core-5.4.9.Final.jar:5.4.9.Final]
        at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:2012) ~[hibernate-core-5.4.9.Final.jar:5.4.9.Final]
        at org.hibernate.loader.Loader.doQuery(Loader.java:953) ~[hibernate-core-5.4.9.Final.jar:5.4.9.Final]
        at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:354) ~[hibernate-core-5.4.9.Final.jar:5.4.9.Final]
        at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:324) ~[hibernate-core-5.4.9.Final.jar:5.4.9.Final]
        at org.hibernate.loader.Loader.loadEntity(Loader.java:2406) ~[hibernate-core-5.4.9.Final.jar:5.4.9.Final]
        at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:64) ~[hibernate-core-5.4.9.Final.jar:5.4.9.Final]
        at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:54) ~[hibernate-core-5.4.9.Final.jar:5.4.9.Final]
        at org.hibernate.persister.entity.AbstractEntityPersister.load(AbstractEntityPersister.java:4350) ~[hibernate-core-5.4.9.Final.jar:5.4.9.Final]
        at org.hibernate.event.internal.DefaultLoadEventListener.loadFromDatasource(DefaultLoadEventListener.java:569) ~[hibernate-core-5.4.9.Final.jar:5.4.9.Final]
        at org.hibernate.event.internal.DefaultLoadEventListener.doLoad(DefaultLoadEventListener.java:537) ~[hibernate-core-5.4.9.Final.jar:5.4.9.Final]
        at org.hibernate.event.internal.DefaultLoadEventListener.load(DefaultLoadEventListener.java:208) ~[hibernate-core-5.4.9.Final.jar:5.4.9.Final]
        at org.hibernate.event.internal.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:332) ~[hibernate-core-5.4.9.Final.jar:5.4.9.Final]
        at org.hibernate.event.internal.DefaultLoadEventListener.doOnLoad(DefaultLoadEventListener.java:108) ~[hibernate-core-5.4.9.Final.jar:5.4.9.Final]
        at org.hibernate.event.internal.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:74) ~[hibernate-core-5.4.9.Final.jar:5.4.9.Final]
        at org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:118) ~[hibernate-core-5.4.9.Final.jar:5.4.9.Final]
        at org.hibernate.internal.SessionImpl.fireLoadNoChecks(SessionImpl.java:1168) ~[hibernate-core-5.4.9.Final.jar:5.4.9.Final]
        at org.hibernate.internal.SessionImpl.fireLoad(SessionImpl.java:1157) ~[hibernate-core-5.4.9.Final.jar:5.4.9.Final]
        at org.hibernate.internal.SessionImpl.access$2000(SessionImpl.java:197) ~[hibernate-core-5.4.9.Final.jar:5.4.9.Final]
        at org.hibernate.internal.SessionImpl$IdentifierLoadAccessImpl.doLoad(SessionImpl.java:2795) ~[hibernate-core-5.4.9.Final.jar:5.4.9.Final]
        at org.hibernate.internal.SessionImpl$IdentifierLoadAccessImpl.lambda$load$1(SessionImpl.java:2776) ~[hibernate-core-5.4.9.Final.jar:5.4.9.Final]
        at org.hibernate.internal.SessionImpl$IdentifierLoadAccessImpl.perform(SessionImpl.java:2732) ~[hibernate-core-5.4.9.Final.jar:5.4.9.Final]
        at org.hibernate.internal.SessionImpl$IdentifierLoadAccessImpl.load(SessionImpl.java:2776) ~[hibernate-core-5.4.9.Final.jar:5.4.9.Final]
        at org.hibernate.internal.SessionImpl.get(SessionImpl.java:970) ~[hibernate-core-5.4.9.Final.jar:5.4.9.Final]
        at org.hibernate.event.internal.DefaultMergeEventListener.entityIsDetached(DefaultMergeEventListener.java:306) ~[hibernate-core-5.4.9.Final.jar:5.4.9.Final]
        at org.hibernate.event.internal.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:172) ~[hibernate-core-5.4.9.Final.jar:5.4.9.Final]
        at org.hibernate.event.internal.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:70) ~[hibernate-core-5.4.9.Final.jar:5.4.9.Final]
        at org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:108) ~[hibernate-core-5.4.9.Final.jar:5.4.9.Final]
        at org.hibernate.internal.SessionImpl.fireMerge(SessionImpl.java:775) ~[hibernate-core-5.4.9.Final.jar:5.4.9.Final]
        at org.hibernate.internal.SessionImpl.merge(SessionImpl.java:762) ~[hibernate-core-5.4.9.Final.jar:5.4.9.Final]
        at jdk.internal.reflect.GeneratedMethodAccessor171.invoke(Unknown Source) ~[na:na]
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[na:na]
        at java.base/java.lang.reflect.Method.invoke(Unknown Source) ~[na:na]
        at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:314) ~[spring-orm-5.2.2.RELEASE.jar:5.2.2.RELEASE]
        at com.sun.proxy.$Proxy167.merge(Unknown Source) ~[na:na]
        at org.springframework.data.jpa.repository.support.SimpleJpaRepository.save(SimpleJpaRepository.java:557) ~[spring-data-jpa-2.2.3.RELEASE.jar:2.2.3.RELEASE]
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) ~[na:na]
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[na:na]
        at java.base/java.lang.reflect.Method.invoke(Unknown Source) ~[na:na]
        at org.springframework.data.repository.core.support.RepositoryComposition$RepositoryFragments.invoke(RepositoryComposition.java:371) ~[spring-data-commons-2.2.3.RELEASE.jar:2.2.3.RELEASE]
        at org.springframework.data.repository.core.support.RepositoryComposition.invoke(RepositoryComposition.java:204) ~[spring-data-commons-2.2.3.RELEASE.jar:2.2.3.RELEASE]
        at org.springframework.data.repository.core.support.RepositoryFactorySupport$ImplementationMethodExecutionInterceptor.invoke(RepositoryFactorySupport.java:657) ~[spring-data-commons-2.2.3.RELEASE.jar:2.2.3.RELEASE]
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.2.2.RELEASE.jar:5.2.2.RELEASE]
        at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.doInvoke(RepositoryFactorySupport.java:621) ~[spring-data-commons-2.2.3.RELEASE.jar:2.2.3.RELEASE]
        at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:605) ~[spring-data-commons-2.2.3.RELEASE.jar:2.2.3.RELEASE]
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.2.2.RELEASE.jar:5.2.2.RELEASE]
        at org.springframework.data.projection.DefaultMethodInvokingMethodInterceptor.invoke(DefaultMethodInvokingMethodInterceptor.java:80) ~[spring-data-commons-2.2.3.RELEASE.jar:2.2.3.RELEASE]
  ... 24 common frames omitted
Caused by: org.h2.jdbc.JdbcSQLNonTransientConnectionException: The database has been closed [90098-200]
        at org.h2.message.DbException.getJdbcSQLException(DbException.java:622) ~[h2-1.4.200.jar:1.4.200]
        at org.h2.message.DbException.getJdbcSQLException(DbException.java:429) ~[h2-1.4.200.jar:1.4.200]
        at org.h2.message.DbException.get(DbException.java:194) ~[h2-1.4.200.jar:1.4.200]
        at org.h2.engine.Session.getTransaction(Session.java:1792) ~[h2-1.4.200.jar:1.4.200]
        at org.h2.engine.Session.startStatementWithinTransaction(Session.java:1815) ~[h2-1.4.200.jar:1.4.200]
        at org.h2.command.Command.executeQuery(Command.java:190) ~[h2-1.4.200.jar:1.4.200]
        at org.h2.jdbc.JdbcPreparedStatement.executeQuery(JdbcPreparedStatement.java:114) ~[h2-1.4.200.jar:1.4.200]
        at com.zaxxer.hikari.pool.ProxyPreparedStatement.executeQuery(ProxyPreparedStatement.java:52) ~[HikariCP-3.4.1.jar:na]
        at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.executeQuery(HikariProxyPreparedStatement.java) ~[HikariCP-3.4.1.jar:na]
        at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:57) ~[hibernate-core-5.4.9.Final.jar:5.4.9.Final]
        ... 78 common frames omitted

@sardaukar
Copy link
Author

And finally

2020-01-02 15:02:33.178 ERROR 1 --- [analyzeBookTaskExecutor-2] o.h.engine.jdbc.spi.SqlExceptionHelper   : Referential integrity constraint violation: "FK_BOOK_SERIES_SERIES_ID: PUBLIC.BOOK FOREIGN KEY(SERIES_ID) REFERENCES PUBLIC.SERIES(ID) (17066)"; SQL statement:
insert into book (created_date, last_modified_date, file_last_modified, file_size, media_id, name, number, series_id, url, id) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?) [23506-200]

@gotson
Copy link
Owner

gotson commented Jan 3, 2020

It seems to be working fine now, consuming 4.9GB of RAM (which is a bit steep :D)

The memory footprint seems irrelevant in Java, from what i have seen. Apparently the garbage collection is not triggered if no one else needs the memory. You can have a look also at this issue #17.

I do see a lot of

2020-01-02 14:37:35.884  INFO 1 --- [analyzeBookTaskExecutor-2] org.hibernate.orm.cache                  : HHH90001005: Cache[cache.media.collection.pages] Key[org.gotson.komga.domain.model.Media._pages#15934]
A soft-locked cache entry was expired by the underlying cache. If this happens regularly you should consider increasing the cache timeouts and/or capacity limits
2020-01-02 14:37:35.886  INFO 1 --- [analyzeBookTaskExecutor-2] o.h.c.s.support.AbstractReadWriteAccess  : Cached entry expired : org.gotson.komga.domain.model.Media._pages#15934
2020-01-02 14:37:35.889  INFO 1 --- [analyzeBookTaskExecutor-2] org.hibernate.orm.cache                  : HHH90001005: Cache[cache.media] Key[org.gotson.komga.domain.model.Media#15934]
A soft-locked cache entry was expired by the underlying cache. If this happens regularly you should consider increasing the cache timeouts and/or capacity limits
2020-01-02 14:37:35.892  INFO 1 --- [analyzeBookTaskExecutor-2] o.h.c.s.support.AbstractReadWriteAccess  : Cached entry expired : org.gotson.komga.domain.model.Media#15934

anything I can configure to help?

I need to investigate this, i have never seen it before.

Well, spoke too soon - I added my comics folder as a library and all hell broke loose

It seems there are no image files in your zip. Would you be able to send me one of the files that does this, so i can debug? Do you know how many of those zip have this error? If it's a dozen that could be a problem with the files, but if it's more than that there might be another error somewhere!

Caused by: com.github.junrar.exception.RarException: crcError

Seems the rar is damaged. Some archive utility may be able to parse it, but the rar implementation in java may not be. Do you have many of those ? Can you check the files to see if they are proper? Also, do you know how many of those files have this error?

And finally

2020-01-02 15:02:33.178 ERROR 1 --- [analyzeBookTaskExecutor-2] o.h.engine.jdbc.spi.SqlExceptionHelper   : Referential integrity constraint violation: "FK_BOOK_SERIES_SERIES_ID: PUBLIC.BOOK FOREIGN KEY(SERIES_ID) REFERENCES PUBLIC.SERIES(ID) (17066)"; SQL statement:
insert into book (created_date, last_modified_date, file_last_modified, file_size, media_id, name, number, series_id, url, id) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?) [23506-200]

It might be caused by the other errors that are not properly managed, resulting in a broken state of the relationship in the db :(

@sardaukar
Copy link
Author

sardaukar commented Jan 4, 2020

It seems there is an issue with some of my comics files. I've tested two of the ones Komga complains about, and for both of them one of the JPGs inside has a CRC error. The files are too big to upload here, but here's an example output from unrars test:

UNRAR 5.61 beta 1 freeware      Copyright (c) 1993-2018 Alexander Roshal

Testing archive Realm_of_Kings_One-Shot.cbr

Testing     Realm_of_Kings_001-017.jpg                                OK 
Testing     Realm_of_Kings_001-018.jpg                                OK 
Testing     Realm_of_Kings_001-019.jpg                                OK 
Testing     Realm_of_Kings_001-020.jpg                                OK 
Testing     Realm_of_Kings_001-021.jpg                                OK 
Testing     Realm_of_Kings_001-022.jpg                                19%
Realm_of_Kings_001-022.jpg - checksum error
Testing     Realm_of_Kings_001-023-24.jpg                             OK 
Testing     Realm_of_Kings_001-025-26.jpg                             OK 
Testing     Realm_of_Kings_001-027.jpg                                OK 
Testing     Realm_of_Kings_001-028.jpg                                OK 
Testing     Realm_of_Kings_001-029.jpg                                OK 
Testing     Realm_of_Kings_001-030.jpg                                OK 
Testing     Realm_of_Kings_001-031.jpg                                OK 
Testing     Realm_of_Kings_001-032.jpg                                OK 
Testing     Realm_of_Kings_001-001.jpg                                OK 
Testing     Realm_of_Kings_001-002.jpg                                OK 
Testing     Realm_of_Kings_001-003.jpg                                OK 
Testing     Realm_of_Kings_001-004.jpg                                OK 
Testing     Realm_of_Kings_001-005.jpg                                OK 
Testing     Realm_of_Kings_001-006.jpg                                OK 
Testing     Realm_of_Kings_001-007.jpg                                OK 
Testing     Realm_of_Kings_001-008-09.jpg                             OK 
Testing     Realm_of_Kings_001-010-11.jpg                             OK 
Testing     Realm_of_Kings_001-012.jpg                                OK 
Testing     Realm_of_Kings_001-013.jpg                                OK 
Testing     Realm_of_Kings_001-014.jpg                                OK 
Testing     Realm_of_Kings_001-015.jpg                                OK 
Testing     Realm_of_Kings_001-016.jpg                                OK 
Total errors: 1

My comics reading app just shows a blank page with an error icon and keeps going. Maybe Komga can be a bit more tolerant in these cases?

@sardaukar
Copy link
Author

Yeah, no dice. Even with the scanner running, I still get

2020-01-04 21:00:00.002  WARN 1 --- [   scheduling-1] o.g.k.i.s.PeriodicScannerController      : Another scan is already running, skipping

Exception: java.lang.OutOfMemoryError thrown from the UncaughtExceptionHandler in thread "http-nio-8080-ClientPoller"

Exception: java.lang.OutOfMemoryError thrown from the UncaughtExceptionHandler in thread "Catalina-utility-2"

Exception: java.lang.OutOfMemoryError thrown from the UncaughtExceptionHandler in thread "http-nio-8080-exec-6"
2020-01-04 21:01:07.160  INFO 1 --- [kTaskExecutor-2] o.g.komga.domain.service.BookLifecycle   : Analyze and persist book: /books/comics/Humble_Transformers_Bundle_Presented_by_IDW/Humble Transformers Bundle Presented by IDW/All Hail Megatron, Vol. 3/transformers_allhailmegatron_vol3_1405990027.pdf
Exception in thread "http-nio-8080-exec-19" Exception in thread "HikariPool-1 housekeeper" Exception in thread "Catalina-utility-1" java.lang.OutOfMemoryError: Java heap space
java.lang.OutOfMemoryError: Java heap space
java.lang.OutOfMemoryError: Java heap space
2020-01-04 21:01:07.185 ERROR 1 --- [alina-utility-3] org.apache.catalina.core.ContainerBase   : Exception processing background thread

java.util.concurrent.ExecutionException: java.lang.OutOfMemoryError: Java heap space
        at java.base/java.util.concurrent.FutureTask.report(Unknown Source) ~[na:na]
        at java.base/java.util.concurrent.FutureTask.get(Unknown Source) ~[na:na]
        at org.apache.catalina.core.ContainerBase.threadStart(ContainerBase.java:1276) ~[tomcat-embed-core-9.0.29.jar:9.0.29]
        at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessorMonitor.run(ContainerBase.java:1322) ~[tomcat-embed-core-9.0.29.jar:9.0.29]
        at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source) ~[na:na]
        at java.base/java.util.concurrent.FutureTask.runAndReset(Unknown Source) ~[na:na]
        at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(Unknown Source) ~[na:na]
        at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) ~[na:na]
        at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) ~[na:na]
        at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-9.0.29.jar:9.0.29]
        at java.base/java.lang.Thread.run(Unknown Source) ~[na:na]
Caused by: java.lang.OutOfMemoryError: Java heap space

and the web UI stops working. I guess Komga needs more than 16GB of RAM to analyze my comics :D

@gotson
Copy link
Owner

gotson commented Jan 5, 2020

It seems there is an issue with some of my comics files. I've tested two of the ones Komga complains about, and for both of them one of the JPGs inside has a CRC error. The files are too big to upload here, but here's an example output from unrars test:

UNRAR 5.61 beta 1 freeware      Copyright (c) 1993-2018 Alexander Roshal

Testing archive Realm_of_Kings_One-Shot.cbr

Testing     Realm_of_Kings_001-017.jpg                                OK 
Testing     Realm_of_Kings_001-018.jpg                                OK 
Testing     Realm_of_Kings_001-019.jpg                                OK 
Testing     Realm_of_Kings_001-020.jpg                                OK 
Testing     Realm_of_Kings_001-021.jpg                                OK 
Testing     Realm_of_Kings_001-022.jpg                                19%
Realm_of_Kings_001-022.jpg - checksum error
Testing     Realm_of_Kings_001-023-24.jpg                             OK 
Testing     Realm_of_Kings_001-025-26.jpg                             OK 
Testing     Realm_of_Kings_001-027.jpg                                OK 
Testing     Realm_of_Kings_001-028.jpg                                OK 
Testing     Realm_of_Kings_001-029.jpg                                OK 
Testing     Realm_of_Kings_001-030.jpg                                OK 
Testing     Realm_of_Kings_001-031.jpg                                OK 
Testing     Realm_of_Kings_001-032.jpg                                OK 
Testing     Realm_of_Kings_001-001.jpg                                OK 
Testing     Realm_of_Kings_001-002.jpg                                OK 
Testing     Realm_of_Kings_001-003.jpg                                OK 
Testing     Realm_of_Kings_001-004.jpg                                OK 
Testing     Realm_of_Kings_001-005.jpg                                OK 
Testing     Realm_of_Kings_001-006.jpg                                OK 
Testing     Realm_of_Kings_001-007.jpg                                OK 
Testing     Realm_of_Kings_001-008-09.jpg                             OK 
Testing     Realm_of_Kings_001-010-11.jpg                             OK 
Testing     Realm_of_Kings_001-012.jpg                                OK 
Testing     Realm_of_Kings_001-013.jpg                                OK 
Testing     Realm_of_Kings_001-014.jpg                                OK 
Testing     Realm_of_Kings_001-015.jpg                                OK 
Testing     Realm_of_Kings_001-016.jpg                                OK 
Total errors: 1

My comics reading app just shows a blank page with an error icon and keeps going. Maybe Komga can be a bit more tolerant in these cases?

I could try, but I'll need one of the files to understand where is the problem and how to get around. Can you post it somewhere else?

@gotson
Copy link
Owner

gotson commented Jan 5, 2020

I guess Komga needs more than 16GB of RAM to analyze my comics

I don't know how many of those other errors like crc issues you have, but that could cause memory leaks (maybe). I still need to use a proper profiler on Komga to see how performance could be improved.

@sardaukar
Copy link
Author

@gotson I confirm that on the latest Docker image, JPEG2000 PDFs now work.

@sardaukar
Copy link
Author

@gotson is it possible to add extra resiliency to the web UI code? Having it die while the scanner is still working is a bit annoying.

@sardaukar
Copy link
Author

I found out why this was the case. I had a 3.0GB PDF :D with an equivalent 65MB cbz file. I guess the PDF was 156 high-quality pages. Removing the huge PDF fixed it! Web UI is stable now (or seems to be).

@gotson
Copy link
Owner

gotson commented Jan 7, 2020

What do you mean by resiliency? The front-end is loaded as a Single Page Application in your browser, then it's displaying data from the REST API. If the backend is dying, the REST API won't serve any data, and the UI won't display anything.

I would need to find a way to make the long running tasks (analyzing) less taxing on the system.

@gotson
Copy link
Owner

gotson commented Jan 7, 2020

I found out why this was the case. I had a 3.0GB PDF :D with an equivalent 65MB cbz file. I guess the PDF was 156 high-quality pages. Removing the huge PDF fixed it! Web UI is stable now (or seems to be).

Indeed i think Komga will load most of the file in memory, not sure exactly how much. Komga uses Apache PdfBox to handle PDF, but even a few pages of that massive PDF would be quite big!

@sardaukar
Copy link
Author

What do you mean by resiliency? The front-end is loaded as a Single Page Application in your browser, then it's displaying data from the REST API. If the backend is dying, the REST API won't serve any data, and the UI won't display anything.

I mean maybe respawning the web UI worker if it dies? Not sure how easy that would be.

But anyway, the original issue has been fixed (or at least, I now know big PDFs are a big no-no) so closing this for now. Thanks for your help, and the new releases!

@github-actions github-actions bot locked as resolved and limited conversation to collaborators Sep 7, 2022
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants