java - Hibernate Search 仅索引我的部分实体
问题描述
我在一个项目上使用休眠搜索,而 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
解决方案
您的数据库连接在 Hibernate Search 完成之前被关闭。
您是否正在运行连接池?确保它不会过早地回收它认为被放弃的连接。
以 c3p0 为例,通过
hibernate.c3p0.unreturnedConnectionTimeout
在配置文件中设置为 3600 之类的高值来测试它。
如果它现在正确索引,您就有了答案。
推荐阅读
- c# - 如何在 RestSharp 中格式化 JSON 对象
- node.js - 如何在 Mongo 中手动添加或设置 updatedAt 字段
- arrays - 在 Excel 中显示 VBA 返回的数组(不确定长度)
- excel - 启用和禁用 com 加载项
- c# - 与 Access 数据库的 C# 连接失败。研究指出 32 位访问与 64 位项目,但解决方案不起作用
- flutter - 子widget的build方法后触发的设置父widget状态的回调不会触发其父widget的build方法
- linux - 保持活动流式ffmpeg rtmp
- r - 如何将 glm() 整洁地放入类似 lmList 的结构中?
- visual-studio - 需要使用 Azure Devops 中的存储库自动每晚同步服务器硬盘驱动器上的文件
- javascript - 为什么我无法使用 Knex 将 false (0) 设置为我的表格的默认值?