elasticsearch,hibernate-search,Java,elasticsearch,Hibernate Search" /> elasticsearch,hibernate-search,Java,elasticsearch,Hibernate Search" />

Java 锁定获取超时错误:NativeFSLock@C:\lucene\index\com.srccodes.example.hibernate.Contact\write.lock

Java 锁定获取超时错误:NativeFSLock@C:\lucene\index\com.srccodes.example.hibernate.Contact\write.lock,java,elasticsearch,hibernate-search,Java,elasticsearch,Hibernate Search,我需要为SQLite数据库集成弹性搜索引擎。因此,我使用Hibernate搜索进行搜索引擎集成。在我将新记录放入表中之后,我得到了错误 我收到以下错误: 错误:HSEARCH000058:发生异常org.apache.lucene.store.lockActainFailedException:锁获取超时:NativeFSLock@C:\lucene\index\com.srccodes.example.hibernate.Contact\write.lock 主要故障: 实体com.srcco

我需要为SQLite数据库集成弹性搜索引擎。因此,我使用Hibernate搜索进行搜索引擎集成。在我将新记录放入表中之后,我得到了错误

我收到以下错误:

错误:HSEARCH000058:发生异常org.apache.lucene.store.lockActainFailedException:锁获取超时:NativeFSLock@C:\lucene\index\com.srccodes.example.hibernate.Contact\write.lock 主要故障: 实体com.srccodes.example.hibernate.Contact Id null工作类型org.hibernate.search.backend.PurgeAllLuceneWork

请在下面找到我的代码:

public class App {

private static void doIndex() throws InterruptedException {
    Session session = HibernateUtil.getSession();

    FullTextSession fullTextSession = Search.getFullTextSession(session);
    fullTextSession.createIndexer().startAndWait();

    fullTextSession.close();
}

private static List<Contact> search(String queryString) {
    Session session = HibernateUtil.getSession();
    FullTextSession fullTextSession = Search.getFullTextSession(session);

    QueryBuilder queryBuilder = fullTextSession.getSearchFactory().buildQueryBuilder().forEntity(Contact.class).get();
    org.apache.lucene.search.Query luceneQuery = queryBuilder.keyword().onFields("name").matching(queryString).createQuery();

    // wrap Lucene query in a javax.persistence.Query
    org.hibernate.Query fullTextQuery = fullTextSession.createFullTextQuery(luceneQuery, Contact.class);

    List<Contact> contactList = fullTextQuery.list();

    fullTextSession.close();

    return contactList;
}

private static void displayContactTableData() {
    Session session = null;

    try {
        session = HibernateUtil.getSession();

        // Fetching saved data
        List<Contact> contactList = session.createQuery("from Contact").list();

        for (Contact contact : contactList) {
            System.out.println(contact);
        }

    } catch (Exception ex) {
        ex.printStackTrace();
    } finally{
        if(session != null) {
            session.close();
        }
    }
}

public static void main(String[] args) throws InterruptedException {
    System.out.println("\n\n******Data stored in Contact table******\n");
    displayContactTableData();

    // Create an initial Lucene index for the data already present in the database
    doIndex();

    Scanner scanner = new Scanner(System.in);
    String consoleInput = null;

    while (true) {
        // Prompt the user to enter query string
        System.out.println("\n\nEnter search key (To exit type 'X')");      
        System.out.println();
        consoleInput = scanner.nextLine();

        if("X".equalsIgnoreCase(consoleInput)) {
            System.out.println("End");
            System.exit(0);
        }   

        List<Contact> result = search(consoleInput);            
        System.out.println("\n\n>>>>>>Record found for '" + consoleInput + "'");

        for (Contact contact : result) {
            System.out.println(contact);
        }               
    }           
}
公共类应用程序{
私有静态void doIndex()引发InterruptedException{
Session Session=HibernateUtil.getSession();
FullTextSession FullTextSession=Search.getFullTextSession(会话);
fullTextSession.createIndexer().startAndWait();
fullTextSession.close();
}
私有静态列表搜索(字符串查询字符串){
Session Session=HibernateUtil.getSession();
FullTextSession FullTextSession=Search.getFullTextSession(会话);
QueryBuilder QueryBuilder=fullTextSession.getSearchFactory().buildQueryBuilder().forEntity(Contact.class.get());
org.apache.lucene.search.Query luceneQuery=queryBuilder.keyword().onFields(“name”).matching(queryString.createQuery();
//在javax.persistence.query中包装Lucene查询
org.hibernate.Query fullTextQuery=fullTextSession.createFullTextQuery(luceneQuery,Contact.class);
List contactList=fullTextQuery.List();
fullTextSession.close();
返回联系人列表;
}
私有静态void displayContactTableData(){
会话=空;
试一试{
session=HibernateUtil.getSession();
//获取保存的数据
List contactList=session.createQuery(“来自联系人”).List();
用于(联系人:联系人列表){
系统输出打印项次(联系人);
}
}捕获(例外情况除外){
例如printStackTrace();
}最后{
if(会话!=null){
session.close();
}
}
}
公共静态void main(字符串[]args)引发InterruptedException{
System.out.println(“\n\n*******存储在联系人表中的数据******\n”);
displayContactTableData();
//为数据库中已有的数据创建初始Lucene索引
doIndex();
扫描仪=新的扫描仪(System.in);
字符串consoleInput=null;
while(true){
//提示用户输入查询字符串
System.out.println(“\n\n输入搜索键(以退出类型“X”)”;
System.out.println();
consoleInput=scanner.nextLine();
如果(“X”。相等信号情况(控制台输入)){
系统输出打印项次(“结束”);
系统出口(0);
}   
列表结果=搜索(控制台输入);
System.out.println(“\n\n>>>>为“+”控制台输入+”)找到的记录;
for(联系人:结果){
系统输出打印项次(联系人);
}               
}           
}
}

我的依赖项:

<dependencies>
    <!-- hibernate -->
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <version>4.1.4.Final</version>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-search</artifactId>
        <version>4.1.1.Final</version>
    </dependency>

    <!-- SQLite JDBC library -->
    <dependency>
        <groupId>org.xerial</groupId>
        <artifactId>sqlite-jdbc</artifactId>
        <version>3.7.2</version>
    </dependency>

org.hibernate
冬眠核心
4.1.4.最终版本
org.hibernate
休眠搜索
4.1.1.最终版本
org.xerial
sqlite jdbc
3.7.2

存在多个问题

不关闭会话工厂

错误lockActainFailedException表明您正在运行多个Hibernate SessionFactory实例,我的第一个猜测是HibernateUtil中的代码启动了一个新的SessionFactory,但您没有关闭任何正在启动的SessionFactory实例

请参阅SessionFactory#close()

不使用Elasticsearch

另一个问题是,此错误意味着您使用的是基于Lucene的索引,而不是Elasticsearch集成。您可能希望重新配置Hibernate搜索以使用Elasticsearch

使用旧版本

第三个问题:您使用的是非常旧的Hibernate ORM和Hibernate Search版本。这些旧版本无法连接到Elasticsearch,所以如果您不先升级,就不要麻烦“重新配置”它

我建议使用Hibernate搜索版本5.9.1.Final和Hibernate ORM 5.2.16.Final

关于版本、兼容性和更多的详细信息可以在project vebsite上找到,每个版本都有很好的组织

例如,Hibernate Search 5.9.x的文档如下: