我在云环境中的应用程序中使用hibernate lucene search(4.5.1)。对于每个租户,都会维护一个单独的hibernate配置(除hibernate.search.default.indexBase
属性外,所有属性都相同。每个租户都有单独的文件系统位置)。在启动应用程序时,我通过调用方法Search.getFullTextSession(session).createIndexer().startAndWait()
使逻辑为每个租户的唯一位置索引一些表数据(例如:d:/ dbindex / tenant1 /,d:/ dbindex / tenant2 /)。对于第一个租户来说,每件事都很好,索引完美无缺。对于第二个租户,startAndWait未完成。它不会从startAndWait()
出来,但有一段时间它正在发挥作用。有些时间不会从startAndWait()
出来。经过认真调试后,我发现BatchIndexingWorkspace
有两个线程生产者和消费者,其中生产者从DB中获取Id列表并将其放入队列中,Consumer接受并对其进行索引。在生产者方(IdentifierProducer),名为inTransactionWrapper
的方法有一个语句
Transaction transaction = Helper.getTransactionAndMarkForJoin( session );
transaction.begin();
语句transaction.begin()
挂起并且事务没有开始,因此不会生成生产者,因此消费者没有编入索引并且startAndWait冻结。经过长时间的搜索,一些帖子说池的大小将会成为一个死锁。但是我使用BoneCPConnectionProvider
和maxConnectionsPerPartition
一起使用50(每个租户)。我在启动时监控了活动连接,它不超过10.更多连接可用。但我不知道这是什么问题。