首页 文章

Hibernate Search and Play Framework,如何构建索引

提问于
浏览
0

我正在尝试将Hibernate Search集成到已经运行的Play Framework应用程序中 . 我有 Build 索引的问题,或者那就是我认为的问题 .

我有一个用户:

@Indexed
@Entity
public class User extends Model {
    @Field
    public String firstname;
    @Field
    public String lastname;
    @Field
    public String email;
}

这是我的persistence.xml:

http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd“version =”2.0“>

<persistence-unit name="default" transaction-type="RESOURCE_LOCAL">
    <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
    <non-jta-data-source>DefaultDS</non-jta-data-source>
    <class>models.User</class>

    <properties>
        <property name="hibernate.dialect"          value="org.hibernate.dialect.MySQLDialect"/>
        <property name="hibernate.hbm2ddl.auto" value="update"/>

        <property name="hibernate.search.default.directory_provider"
                  value="filesystem"/>

        <property name="hibernate.search.default.indexBase"
                  value="/Users/<user>/lucene/indexes"/>
    </properties>
</persistence-unit>

因此,我认为索引的构建(对于数据库中已存在的数据)应该发生在GlobalAdmin对象的 onStart 中 . 我使用 JPA.withTransaction 来调用索引器:

JPA.withTransaction(new F.Callback0() {
    @Override
    public void invoke() throws Throwable {
        FullTextEntityManager fullTextEntityManager = org.hibernate.search.jpa.Search.getFullTextEntityManager(JPA.em());
        try {
            fullTextEntityManager.createIndexer().startAndWait();
        } catch (Exception e) {
            Logger.error(e.getMessage());
        }
    }
});

问题是我得到:

[error] o.h.e.j.s.SqlExceptionHelper - Timed out waiting for a free available connection.
[error] o.h.s.e.i.LogErrorHandler - HSEARCH000058: HSEARCH000211: An exception occurred while the MassIndexer was fetching the primary identifiers list
org.hibernate.exception.JDBCConnectionException: Could not open connection
    at org.hibernate.exception.internal.SQLStateConversionDelegate.convert(SQLStateConversionDelegate.java:132) ~[hibernate-core-4.3.9.Final.jar:4.3.9.Final]
    at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:49) ~[hibernate-core-4.3.9.Final.jar:4.3.9.Final]
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:126) ~[hibernate-core-4.3.9.Final.jar:4.3.9.Final]
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:112) ~[hibernate-core-4.3.9.Final.jar:4.3.9.Final]
    at org.hibernate.engine.jdbc.internal.LogicalConnectionImpl.obtainConnection(LogicalConnectionImpl.java:235) ~[hibernate-core-4.3.9.Final.jar:4.3.9.Final]
Caused by: java.sql.SQLException: Timed out waiting for a free available connection.
    at com.jolbox.bonecp.DefaultConnectionStrategy.getConnectionInternal(DefaultConnectionStrategy.java:88) ~[bonecp-0.8.0.RELEASE.jar:na]
    at com.jolbox.bonecp.AbstractConnectionStrategy.getConnection(AbstractConnectionStrategy.java:90) ~[bonecp-0.8.0.RELEASE.jar:na]
    at com.jolbox.bonecp.BoneCP.getConnection(BoneCP.java:553) ~[bonecp-0.8.0.RELEASE.jar:na]
    at com.jolbox.bonecp.BoneCPDataSource.getConnection(BoneCPDataSource.java:131) ~[bonecp-0.8.0.RELEASE.jar:na]
    at org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl.getConnection(DatasourceConnectionProviderImpl.java:139) ~[hibernate-core-4.3.9.Final.jar:4.3.9.Final]

谢谢你的帮助 .

编辑:

我在控制器中的搜索方法:

正如在建议的评论中,我在'onStart'中取消注释了Indexer .

@Transactional
    public static Result list(int page, String filter, String sortby, String order) {

        EntityManager em = JPA.em();

        FullTextEntityManager fullTextEntityManager = org.hibernate.search.jpa.Search.getFullTextEntityManager(em);

        QueryBuilder qb = fullTextEntityManager.getSearchFactory().buildQueryBuilder().forEntity(User.class).get();
        Query luceneQuery = qb
                        .keyword()
                        .onFields("firstname", "lastname", "email")
                        .matching(filter)
                        .createQuery();
        // wrap Lucene query in a javax.persistence.Query
        javax.persistence.Query jpaQuery = fullTextEntityManager.createFullTextQuery(luceneQuery, User.class);
        // execute search
        List result = jpaQuery.getResultList();

        Page<User> userPage = new Page<>(result,1,1,1);

        //Page<User> userPage = User.page(page, 30, sortby, order, filter);
        return ok(views.html.admin.customers.list.render(userPage, filter, sortby, order));
    }

这是我第一次尝试使用Hibernate Search的方法 . 然而,这不会返回任何东西 .

1 回答

  • 1

    您的问题似乎不在于直接搜索 . 看看堆栈跟踪,似乎你的JDBC连接已经用完了 . 我自己不认识BoneCP,但它似乎是一个JDBC池库 . 你的配置是什么?您是否尝试过增加连接池大小?

相关问题