Hibernate Search индексирует только часть моих сущностей - PullRequest
0 голосов
/ 02 июля 2018

Я использую поиск в спящем режиме для проекта, а MassIndexer индексирует только часть моих записей. Например, в одной таблице у меня 601 запись, но с моими текущими настройками она индексирует только 300 документов.

Мои текущие настройки:

txtEm.createIndexer(  )
          .batchSizeToLoadObjects( 25 )
          .threadsToLoadObjects( 12 )
          .cacheMode( CacheMode.NORMAL )
          .idFetchSize( 150 )
          .transactionTimeout( 1800 )
          .startAndWait();

Я тестировал с batchSizeToLoadObjects(1000), и, похоже, он проиндексировал все мои записи. Но этот проект, над которым я работаю, является новым, и в базе данных есть только несколько записей на таблицу. Я обеспокоен тем, что при увеличении таблиц объекты не будут правильно проиндексированы.

Может кто-нибудь помочь с этим? Я искал некоторые ответы и рекомендации по настройке, но не смог найти решение.

Что-то, что может помочь, - это журнал, сгенерированный при индексации таблицы. Смотрите ниже:

2018-07-02 17:45:52.794  INFO 648 --- [ntifierloader-1] o.h.s.b.i.SimpleIndexingProgressMonitor  : HSEARCH000027: Going to reindex 601 entities
2018-07-02 17:45:52.812 ERROR 648 --- [ntifierloader-1] o.h.s.exception.impl.LogErrorHandler     : HSEARCH000058: HSEARCH000211: An exception occurred while the MassIndexer was fetching the primary identifiers list

org.hibernate.SessionException: Session was already closed!
    at org.hibernate.internal.StatelessSessionImpl.managedClose(StatelessSessionImpl.java:378) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final]
    at org.hibernate.internal.StatelessSessionImpl.close(StatelessSessionImpl.java:358) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final]
    at org.hibernate.search.batchindexing.impl.IdentifierProducer.inTransactionWrapper(IdentifierProducer.java:118) ~[hibernate-search-orm-5.6.4.Final.jar:5.6.4.Final]
    at org.hibernate.search.batchindexing.impl.IdentifierProducer.run(IdentifierProducer.java:85) ~[hibernate-search-orm-5.6.4.Final.jar:5.6.4.Final]
    at org.hibernate.search.batchindexing.impl.OptionallyWrapInJTATransaction.runWithErrorHandler(OptionallyWrapInJTATransaction.java:69) ~[hibernate-search-orm-5.6.4.Final.jar:5.6.4.Final]
    at org.hibernate.search.batchindexing.impl.ErrorHandledRunnable.run(ErrorHandledRunnable.java:32) ~[hibernate-search-orm-5.6.4.Final.jar:5.6.4.Final]
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) ~[na:1.8.0_172]
    at java.util.concurrent.FutureTask.run$$$capture(FutureTask.java:266) [na:1.8.0_172]
    at java.util.concurrent.FutureTask.run(FutureTask.java) [na:1.8.0_172]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [na:1.8.0_172]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_172]
    at java.lang.Thread.run(Thread.java:748) [na:1.8.0_172]

2018-07-02 17:45:52.883  INFO 648 --- [entityloader-10] o.h.s.b.i.SimpleIndexingProgressMonitor  : HSEARCH000030: 200 documents indexed in 902 ms
2018-07-02 17:45:52.883  INFO 648 --- [entityloader-10] o.h.s.b.i.SimpleIndexingProgressMonitor  : HSEARCH000031: Indexing speed: 221,729492 documents/second; progress: 25,54%
2018-07-02 17:45:52.886 ERROR 648 --- [entityloader-10] s.b.i.IdentifierConsumerDocumentProducer : HSEARCH000065: Error while rolling back transaction after Session is closed!

org.hibernate.SessionException: Session is closed!
    at org.hibernate.internal.AbstractSessionImpl.errorIfClosed(AbstractSessionImpl.java:132) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final]
    at org.hibernate.internal.AbstractSessionImpl.getTransaction(AbstractSessionImpl.java:311) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final]
    at org.hibernate.search.batchindexing.impl.IdentifierConsumerDocumentProducer.rollbackTransaction(IdentifierConsumerDocumentProducer.java:205) ~[hibernate-search-orm-5.6.4.Final.jar:5.6.4.Final]
    at org.hibernate.search.batchindexing.impl.IdentifierConsumerDocumentProducer.loadList(IdentifierConsumerDocumentProducer.java:182) ~[hibernate-search-orm-5.6.4.Final.jar:5.6.4.Final]
    at org.hibernate.search.batchindexing.impl.IdentifierConsumerDocumentProducer.loadAllFromQueue(IdentifierConsumerDocumentProducer.java:140) ~[hibernate-search-orm-5.6.4.Final.jar:5.6.4.Final]
    at org.hibernate.search.batchindexing.impl.IdentifierConsumerDocumentProducer.run(IdentifierConsumerDocumentProducer.java:117) ~[hibernate-search-orm-5.6.4.Final.jar:5.6.4.Final]
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [na:1.8.0_172]
    at java.util.concurrent.FutureTask.run$$$capture(FutureTask.java:266) [na:1.8.0_172]
    at java.util.concurrent.FutureTask.run(FutureTask.java) [na:1.8.0_172]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [na:1.8.0_172]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_172]
    at java.lang.Thread.run(Thread.java:748) [na:1.8.0_172]

Также это SessionException происходит, и я не мог найти решение для этого. Метод, который создает индекс, помечен @Transacional.

Я использую Spring Boot 1.5.6 и Hibernate Search 5.6.4

Ответы [ 2 ]

0 голосов
/ 11 февраля 2019

Соединения с вашей базой данных закрываются до того, как с ними завершится Hibernate Search.

Вы используете пул соединений? Убедитесь, что он преждевременно не восстанавливает соединения, которые он считает заброшенными.

Используя c3p0 в качестве примера, проверьте это, установив hibernate.c3p0.unreturnedConnectionTimeout до чего-то высокого, например, 3600 в вашем файле конфигурации.

Если теперь он правильно проиндексирован, у вас есть ответ.

0 голосов
/ 03 июля 2018

Возможно, вы как-то закрываете сеансы, пока индексатор массы все еще использует их. Может быть, вы используете какие-то экзотические настройки или интеграцию, которые автоматически закрывают сеанс после одной транзакции?

Чтобы выяснить, есть ли вы, либо запустите процесс массовой индексации в режиме отладки и установите точку останова в org.hibernate.internal.SessionImpl#close, либо установите для уровня журнала для org.hibernate.internal.SessionImpl значение TRACE. Затем посмотрите, закрыт ли сеанс до прекращения массовой индексации: если это так, в вашем коде что-то не так, и вам следует отложить закрытие, пока не будет выполнена массовая индексация.

...