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 管理锁,以禁止两个 IndexWriter 写入同一个索引。

于 2009-02-04T11:06:20.857 回答
0

您应该先创建表。

尝试使用这样的代码:

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

锁是由 IndexWriter 生成的。如果有问题,锁不会被释放,所以你需要在创建新写入器之前释放所有锁(IndexWriter类有静态方法)

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