3

これは私のサンプルコードです:

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);
}

私はこの行で立ち往生しています:IndexWriter writer = new IndexWriter(jdbcDir, analyzer,false);

このコードを実行しようとするたびに、次の例外が発生します。

------"org.apache.lucene.store.LockObtainFailedException: ロック取得タイムアウト: PhantomReadLock[write.lock/tttable]"------------

コードの何が問題なのかわかりません。jar の互換性の問題である可能性があります。

IndexWriter オブジェクトを取得できません。

4

2 に答える 2

4

インデックスがロックされているようです。ロックされるべきではないことが確実な場合は、適切なクリーンアップを行わずにプロセスがクラッシュした可能性があります。

行を追加してみてください

jdbcDir.clearLock();

indexWriter を作成する前に。

そこに放置しないでください、タフ。通常、Lucene にロックを管理させて、2 つの IndexWriter が同じインデックスに書き込めないようにする必要があります。

于 2009-02-04T11:06:20.857 に答える
0

最初にテーブルを作成する必要があります。

そのようなコードを使用してみてください:

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

ロックは IndexWriter によって行われます。何かがおかしいとロックが解除されないので、新しいライターを作成する前にすべてのロックを解除する必要があります (IndexWriter クラスの static メソッドがあります)。

IndexWriter.unlock(dir);
于 2012-01-19T09:21:16.770 に答える