我的基本问题是:当有多个线程需要对同一索引进行查询(读取)时,创建/使用 NIOFSDirectory 和 SimpleFSDirectory 实例的正确方法是什么。更重要的是:应该为每个需要执行查询并检索一些结果的线程创建一个 XXXFSDirectory 的实例(然后在同一个线程中立即关闭它),还是应该创建一个“全局”(单例?) 传递给所有线程的实例,然后它们都同时使用它(并且不再由每个线程在完成查询时关闭它)?
这里有更多细节:
我已经阅读了 NIOFSDirectory 和 SimpleFSDirectory 的文档,我得到的是:
- 它们都支持多线程:
NIOFSDirectory :“使用 java.nio 的 FileChannel 的位置读取的 FSDirectory 实现,它允许多个线程从同一个文件中读取而无需同步。 ”
SimpleFSDirectory :“使用 java.io.RandomAccessFile 的 FSDirectory 的简单实现。但是,此类具有较差的并发性能(多线程将成为瓶颈),因为当多个线程从同一个文件中读取时它会同步。通常最好使用 NIOFSDirectory 或 MMapDirectory 。 ”
NIOFSDirectory 在多线程上下文中比 SimpleFSDirectory 更适合(基本上更快)(见上文)
NIOFSDIrectory 在 Windows 上无法正常工作。建议在 Windows 上使用 SimpleFSDirectory。但是在 *nix OS NIOFSDIrectory 上工作正常,并且由于多线程时性能更好,建议在 SimpleFSDirectory 上使用。
"注意:不建议在 Windows 上使用 NIOFSDirectory,因为在 Sun 的 JRE 中实现 FileChannel.read 的方式存在错误。在实现内部,位置显然是同步的。 "
我问这个的原因是我看过一些实际的项目,其中目标操作系统是 Linux,NIOFSDirectory 用于从索引中读取,但它的一个实例是为每个请求(来自每个线程)创建的,并且一旦查询完成并返回结果,线程就会关闭该实例(仅在下一个请求时创建一个新实例,等等)。所以我想知道这是否真的比简单地让所有线程共享一个 NIOFSDirectory 实例更好的方法,并且只是在应用程序启动时打开它,然后在某个(多线程)作业完成后关闭它。 ..
更重要的是,对于 Web 应用程序,拥有一个上下文侦听器之类的东西不是更好吗当应用程序关闭时关闭它?