这是我的示例代码:
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对象。
答案 0 :(得分:4)
似乎索引已被锁定。如果您确定它不应该被锁定,那么可能有一些进程在没有正确清理的情况下崩溃。
尝试添加行
jdbcDir.clearLock();
在创建indexWriter之前。
不要把它留在那里,坚韧。您通常希望让Lucene管理锁,禁止两个IndexWriters写入相同的索引。
答案 1 :(得分:0)
您应首先创建表格。
尝试使用这样的代码:
if (!dir.tableExists())
{
dir.create();
}
锁由IndexWriter制作。如果出现错误,则锁定未释放,因此您需要在创建新编写器之前释放所有锁定(存在IndexWriter类的静态方法)
IndexWriter.unlock(dir);