Ошибка блокировки получения тайм-аута: NativeFSLock @ C: \ lucene \ indexes \ com.srccodes.example.hibernate.Contact \ write.lock

Karthikeyan спросил: 28 марта 2018 в 04:13 в: java

У меня есть требование интегрировать модуль поиска поисковых запросов для базы данных SQLite. Таким образом, я использую Hibernate Search для интеграции поисковой системы. После того, как у меня появилась новая запись в таблице, я получаю ошибку.

Получаем следующую ошибку:

ОШИБКА: HSEARCH000058: Исключение произошло org.apache.lucene.store.LockObtainFailedException: Заблокировано время ожидания: NativeFSLock @ C: \ lucene \ indexes \ com.srccodes.example.hibernate.Contact \ write.lockПриматный сбой: Entity 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>

1 ответ

Есть решение
Sanne ответил: 29 марта 2018 в 02:34

Есть несколько проблем.

Не закрывается SessionFactory

Ошибка LockObtainFailedException предполагает, что вы запускаете несколько Hibernate В случаях SessionFactory мое первое предположение состоит в том, что ваш код в HibernateUtil запускает новый SessionFactory , но вы не закрываете ни одну из SessionFactory экземпляры, которые вы запускаете.

Смотрите SessionFactory # close () .

Не используете Elasticsearch

Другая проблема заключается в том, что эта ошибка означает, что вы используете индекс на основе Lucene, а не интеграцию Elasticsearch. Возможно, вы захотите перенастроить Hibernate Search для использования Elasticsearch.

Использование старых версий

Третья проблема: вы используете очень старую версию Hibernate ORM и Поиск в спящем режиме. Эти старые версии не могут быть подключены к Elasticsearch, поэтому не пытайтесь "перенастроить" его, если вы не обновите его в первую очередь.

Я бы предложил использовать Hibernate Search версии 5.9.1.Final и Hibernate ORM 5.2 .16.Final.

Подробную информацию о версиях, совместимости и многом другом можно найти на веб-сайте проекта, красиво организованном по версиям.

Например, документ Hibernate Search 5.9.x описан здесь. : Http://hibernate.org/search/releases/5.9