索引多个实体类型时,MassIndexer.createIndexer()会冻结

时间:2012-08-25 14:34:14

标签: java hibernate lucene hibernate-search

出于这个问题的目的,我有两个业务类:

@Entity
@Indexed
public class MyClassOne implements MyInterface {

    @Id
    private Integer id;

    @OneToMany(orphanRemoval = true)
    @Cascade(CascadeType.ALL)
    private List<MyClassTwo> myClassTwos;

    @Field
    private String someField;
}

@Entity
@Indexed
public class MyClassTwo implements MyInterface {

    @Id
    private Integer id;

    @Field
    private String someField;
}

然后我使用以下代码创建索引(如Hibernate Search文档中所建议的那样):

Search.getFullTextSession(session).createIndexer(MyClassOne.class, MyClassTwo.class).startAndWait();

问题是,这冻结了。 MassIndexer.createIndexer()无限期挂起,我无处可去。

如果我删除任何一个Class参数,那么剩下的类被索引并且一切正常 - 当我尝试同时索引这两个实体时,这只是一个问题。我的理解是hibernate默认为每个实体创建一个单独的索引,我当然没有做任何配置来改变它。

为了清楚起见,我删除了@ AnalyzerDef,@ Boost注释以及@Field和@Indexed注释参数,但删除这些参数对底层问题没有任何影响。我留下了这样一个事实:两个类都实现了相同的接口,并且一个包含另一个的List(尽管注意这不是@IndexEmbedded),以防它相关。

(我也发现一个线程暗示线程池大小是一个问题所以我把它增加到50但没有运气)

据推测,我做的事情显然是错误的,但我没有想法 - 任何人都可以帮忙吗?

由于

2 个答案:

答案 0 :(得分:1)

当数据库连接耗尽时,它似乎会冻结;它实际上是死锁,它依赖于从数据库池库到#34;获得免费的连接超时&#34;。

不要增加线程池,而应该降低它,以免耗尽你的连接;每个线程都将使用一个。或者,如果您可以更有效地提高与数据库的最大允许连接数。

我已经打开了一个JIRA问题,通过某种方式检测它来解决这个问题,最糟糕的情况是文档更好。

答案 1 :(得分:0)

我有同样的问题,索引实体一个接一个帮助。

fullTextEntityManager.createIndexer(MyClassOne.class).startAndWait();
fullTextEntityManager.createIndexer(MyClassTwo.class).startAndWait();
相关问题