Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate搜索仅为我的实体的一部分编制索引_Java_Hibernate_Spring Boot_Hibernate Search - Fatal编程技术网

Java Hibernate搜索仅为我的实体的一部分编制索引

Java Hibernate搜索仅为我的实体的一部分编制索引,java,hibernate,spring-boot,hibernate-search,Java,Hibernate,Spring Boot,Hibernate Search,我在一个项目上使用hibernate搜索,MassIndexer只是索引我记录的一部分。例如,在一个表中,我有601条记录,但根据我当前的设置,它只索引了300个文档 我当前的设置是: txtEm.createIndexer( ) .batchSizeToLoadObjects( 25 ) .threadsToLoadObjects( 12 ) .cacheMode( CacheMode.NORMAL ) .idF

我在一个项目上使用hibernate搜索,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

可能是在mass indexer仍在使用会话时以某种方式关闭了会话。也许您正在使用一些奇特的设置或集成,在单个事务完成后自动关闭会话


若要确定是否是,请在调试模式下启动批量索引过程,并在
org.hibernate.internal.SessionImpl#close
中设置断点,或者将
org.hibernate.internal.SessionImpl
的日志级别设置为跟踪。然后查看会话是否在海量索引停止之前关闭:如果是,则说明代码中有错误,应该延迟关闭,直到海量索引完成。

在Hibernate搜索完成之前,数据库连接已关闭

您正在运行连接池吗?确保它不会过早地恢复它认为已放弃的连接

以c3p0为例,通过设置
hibernate.c3p0.unreturnedConnectionTimeout
在配置文件中设置为3600之类的高值


如果它现在索引正确,您就有了答案。

调试应用程序后,我已经能够确定质量索引器运行每个实体的第一批,而不是终止会话。存储在数据库中的记录数与
batchSizeToLoadObjects
threadsToLoadObjects
属性成正比。。。例如:带有12个线程的batch=25只会导致300条记录被索引。。。我使用的是Spring Boot,hibernate的SessionImpl类是无状态SessionImpl.class。。他们之间有什么联系吗?这看起来很奇怪。您可能需要仔细检查事务配置。如果没有什么特别的,也许我们可以创建一个最小的复制机,并创建一张票,让我们可以看看?我们提供测试用例模板来帮助您做到这一点: