gpt4 book ai didi

java - 锁获取超时错误: NativeFSLock@C:\lucene\indexes\com. srccodes.example.hibernate.Contact\write.lock

转载 作者:行者123 更新时间:2023-12-02 11:20:33 30 4
gpt4 key购买 nike

我需要为 SQLite 数据库集成 Elasticsearch 引擎。因此,我使用 Hibernate Search 进行搜索引擎集成。当我在表中添加一条新记录后,出现错误。

我收到以下错误:

错误:HSEARCH000058:发生异常 org.apache.lucene.store.LockObtainFailedException:锁定获取超时:NativeFSLock@C:\lucene\indexes\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);
}
}
}

}

我的依赖项:

<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>

最佳答案

存在多个问题。

不关闭SessionFactory

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

参见SessionFactory#close()

不使用 Elasticsearch

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

使用旧版本

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

我建议使用 Hibernate Search 版本 5.9.1.Final 和 Hibernate ORM 5.2.16.Final。

有关版本、兼容性等的详细信息可以在项目 vebsite 上找到,每个版本都组织得很好。

例如,Hibernate Search 5.9.x 的文档如下: http://hibernate.org/search/releases/5.9

关于java - 锁获取超时错误: NativeFSLock@C:\lucene\indexes\com. srccodes.example.hibernate.Contact\write.lock,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49958636/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com