我们在我们的应用程序中使用Lucene的近乎实时的搜索功能进行全文搜索。由于提交的成本很高,假设我们每添加10个文档就提交索引(我们预计每小时索引大约150到200个文档)。现在,如果我想要终止我的进程,我如何确保在我的进程被终止之前,内存中的所有文档都已提交到磁盘?这里有什么推荐的方法吗?或者我的文档量太少了,不需要操心,我应该在每一次添加时都提交吗?
我是否应该跟踪所有未提交的文档?如果进程在提交到磁盘之前被终止,我是否应该在进程启动时再次索引这些未提交的进程?
Lucene NRT在运行嵌入式Jetty的进程中使用。向jetty发送关闭命令(调用某个servlet)并等待所有文档提交,然后使用System.exit()终止是否是正确的方法?
发布于 2012-01-25 22:10:01
您可以添加一个钩子来提交servlet的destroy方法中的所有缓冲文档,并确保在调用System.exit之前关闭了嵌入的servlet容器(可能是通过向shutdown hook添加一个JVM)。
但这仍然不是完美的。如果您的进程被终止,所有缓冲的数据都将丢失。另一种解决方案是使用软提交。软提交是廉价的提交(不执行fsync ),因此如果您的进程被终止,不会丢失任何数据(但如果服务器意外关闭,数据仍可能丢失)。
总结一下:
如果进程获取killed,
,
https://stackoverflow.com/questions/8998454
复制相似问题