2009-02-04 4 views
3

Ceci est mon exemple de code:Comment stocker l'index lucene dans une base de données?

MysqlDataSource dataSource = new MysqlDataSource(); 

dataSource.setUser("root"); 
dataSource.setPassword("ncl"); 
dataSource.setDatabaseName("userdb"); 
dataSource.setEmulateLocators(true); //This is important because we are dealing with a blob type data field 
try{  
    JdbcDirectory jdbcDir = new JdbcDirectory(dataSource, new MySQLDialect(), "tttable"); 
    StandardAnalyzer analyzer = new StandardAnalyzer(); 
    IndexWriter writer = new IndexWriter(jdbcDir, analyzer,false); 
    writer.optimize(); 
    writer.close(); 
}catch(Exception e){ 
System.out.print(e); 
} 

Je suis coincé à cette ligne: IndexWriter writer = new IndexWriter(jdbcDir, analyzer,false);

Chaque fois que j'essaie d'exécuter ce code, je reçois l'exception suivante:

--- --- "org.apache.lucene.store.LockObtainFailedException: Le verrouillage a expiré: PhantomReadLock [write.lock/tttable]" ------------

Je ne trouve pas ce qui ne va pas avec le code. Il se peut que ce soit un problème de compatibilité de pot.

Je ne parviens pas à obtenir un objet IndexWriter.

Répondre

4

Il semble que l'index soit verrouillé. Si vous êtes sûr qu'il ne devrait pas être verrouillé, peut-être que certains processus se sont écrasés sans nettoyage approprié.

Essayez d'ajouter la ligne

jdbcDir.clearLock(); 

avant de créer le indexWriter.

Ne le laissez pas là, dur. Vous voulez généralement laisser Lucene gérer les verrous, pour empêcher deux IndexWriters d'écrire dans le même index.

0

Vous devez d'abord créer une table.

Essayez d'utiliser un tel code:

if (!dir.tableExists()) 
    { 
     dir.create(); 
    } 

Serrures sont faites par IndexWriter. Si quelque chose ne va pas, le verrou n'est pas libéré, donc vous devez libérer tous les verrous avant de créer un nouveau scripteur (il existe une méthode statique de la classe IndexWriter)

IndexWriter.unlock(dir); 
IndexWriter.unlock(dir); 
Questions connexes