当前位置: 首页 > news >正文

苏州住房建设局网站首页百科网站怎么做

苏州住房建设局网站首页,百科网站怎么做,网站模板文件扫描,网上做网站网站索引文件锁LockFactory LockFactory在Lucene中用来对索引文件所在的目录进行加锁#xff0c;使得同一时间总是只有一个IndexWriter对象可以更改索引文件#xff0c;即保证单进程内(single in-process)多个不同IndexWriter对象互斥更改#xff08;多线程持有相同引用的IndexW…索引文件锁LockFactory LockFactory在Lucene中用来对索引文件所在的目录进行加锁使得同一时间总是只有一个IndexWriter对象可以更改索引文件即保证单进程内(single in-process)多个不同IndexWriter对象互斥更改多线程持有相同引用的IndexWriter对象视为一个IndexWriter不会受制于LockFactory而是受制于对象锁synchronized(this)、多进程内(multi-processes)多个对象互斥更改。 LockFactory的具体实现类 LockFactory是一个抽象类提供了以下几种子类即NoLockFactory、SingleInstanceLockFactory、SimpleFSLockFactory、NativeFSLockFactory、VerifyingLockFactory下面一一介绍。 图1 NoLockFactory 该类的功能同类名一样即不会对索引文件进行加锁如果使用者有把握certain使得IndexWriter对象总是能互斥更改索引文件那么可以不对索引文件所在的目录进行加锁。 SingleInstanceLockFactory 该类是RAMDirectory默认使用的索引文件锁RAMDirectory属于Directory类的子类Directory类描述了索引文件所在目录的一些信息以后会有文章介绍Directory类。 对于拥有相同RAMDirectory对象的多个IndexWriter对象实现不同IndexWriter之间对索引文件的互斥更改。 获得索引文件锁 该过程十分的简单故给出完整的代码 final HashSetString locks new HashSet(); ​ // 尝试获得索引文件锁如果已经占用则抛出异常 public Lock obtainLock(Directory dir, String lockName) throws IOException { synchronized (locks) { if (locks.add(lockName)) { return new SingleInstanceLock(lockName); } else { throw new LockObtainFailedException(lock instance already obtained: (dir dir , lockName lockName )); } } } 在IndexWriter类中定义了一个不可更改的lockName使得无论哪个线程通过IndexWriter来获得索引文件锁时lockName的值都是相同的这样就能通过判断该lockName是否在locks容器中来实现互斥lockName在IndexWriter类中的定义如下 图2 释放索引文件锁 释放锁的过程即从locks容器(HashSet对象)中移除键值为write.lock的元素。 FSLockFactory FSLockFactory是一个抽象类它有两个子类分别是SimpleFSLockFactoryNativeFSLockFactory用来专门指定给FSDirectory类提供索引文件锁(can only be used with FSDirectory subclasses)。 SimpleFSLockFactory 该类只能用于FSDirectoryFSDirectory跟RAMDirectory一样是Directory的子类。 该类通过在索引文件所在目录创建一个名为write.lock文件的方式来实现索引文件锁该方法的缺点在于如果JVM异常退出那么索引文件锁可能无法被释放即没有删除write.lock文件。 解决的方法只能是通过手动删除write.lock文件注意是手动删除前用户得自己保证(certain)目前没有IndexWriter正在写入否则非常容易破坏corrupt索引文件比如说由于删除了write.lock文件使得多个IndexWriter对象同时更改了索引文件。 获得索引文件锁 在索引文件所在目录生成一个write.lock文件并且记录该文件的创建时间目的是在任意阶段可以检查该文件是否被外在力量external force篡改了从而判定该锁的合法性(valid)在该类中如果发现被篡改那么就抛出异常。 比如每次添加一篇文档Document后将该Document的信息写入索引文件之前会做检查调用该类的ensureValid( )方法如果此时发现write.lock被篡改了比如说被删除了那么这次写入就会失败后续的处理会在以后介绍IndexWriter时详细介绍。 释放索引文件锁 释放锁的过程即删除write.lock文件如果发现write.lock文件的创建时间跟获得该锁的时间不同那么就抛出异常来让用户决定如何处理这种情况使用Files.delete(Path path)的方法来尝试删除write.lock文件如果出错了那么同样地抛出异常让用户决定如何处理这种情况。 NativeFSLockFactory NativeFSLockFactory同SimpleFSLockFactory一样只能用于FSDirectory它是Directory默认使用的LockFactory的同样的通过在索引文件所在目录生成一个write.lock文件但是该类还使用了FileChannel来管理write.lock文件。 获得索引文件锁 NativeFSLockFactory获得索引文件锁的过程分为两步 第一步判断write.lock文件是否已经被进程内(in-process)的其他线程的不同IndexWriter对象占有通过一个线程安全的同步Set容器(Collection.synchronizedSet())实现最先到的(first come)的线程会将write.lock文件的绝对路径写入到同步Set容器中后来的线程尝试添加路径时会抛出异常第二步使用FileChannel来尝试获得进程间inter-process级别的文件锁FileLock即判断write.lock文件是否被其他进程占用如果占用则直接抛出异常。另外也会记录write.lock文件的创建时间用法跟SimpleFSLockFactory一样。 同SimpleFSLockFactory一样在运行过程中当更改索引文件时添加文档、更新、commit、flush等变更索引文件的操作依次判断下面的条件任意一个条件不满足时说明当前索引文件锁是不合法的 条件1进程内的某个线程调用了close()如果该线程继续执行更改索引操作会抛出异常条件2如果同步Set容器不包含write.lock文件的绝对路径会抛出异常条件3FileChannel的锁FileLock是不合法的状态这种情况是未知的外部力量external force导致的 会抛出异常条件4FileChannel中的channel的值不是0Lucene不会对write.lock文件写入任何数据所以如果发现该文件中被添加了数据则抛出异常条件5当前write.lock文件的创建时间跟获得锁时的创建时间不一致说明被未知的external force修改了会抛出异常 释放索引文件锁 该类释放锁的过程分两步走 释放write.lock文件的FileLock清空同步Set容器中的内容 SimpleFSLockFactory与NativeFSLockFactory各自的特点 尽管NativeFSLockFactory是默认的FSDirectory的索引文件锁但基于实际场景有时候使用SimpleFSLockFactory能更好的工作(work perfectly)。 NativeFSLockFactory基于 java.nio.*来获得FileLock但在某些文件系统下可能会受限比如说在NFS下可能无法获得FileLock(the lock can incorrectly be double acquired)此时使用SimpleFSLockFactory就不会有这个问题当JVM异常退出时残留的leftoverwrite.lock文件无法删除如果使用SimpleFSLockFactory需要手动的去删除该文件否则尝试获得索引文件锁时就直接抛出异常而使用NativeFSLockFactory时不用关心当前write.lock文件是否被正确删除因为它只关心write.lock是否被其他进程占用而JVM异常退出后会自动释放FileLock(操作系统会释放FileLock)所以不能通过判断write.lock文件在索引文件的目录中就认为索引文件被锁定了(locked)Lucene从不会因为异常去删除write.lock文件 VerifyingLockFactory 该类不同于上面提到的NoLockFactory、SingleInstanceLockFactory、SimpleFSLockFactory、NativeFSLockFactory如果上述这些索引文件锁在实际业务还是无法正确的工作(not working properly)那么可以使用VerifyingLockFactory封装上述的LockFactory通过一个开启一个LockVerifyServer单独的服务来实现认证(verify)保证不会发生同一时间两个进程同时获得锁的情况。 认证方法 Lucene7.5.0中通过Socket向LockVerifyServer发送特定的字节来尝试获得锁同样的通过发送特定字节来释放锁由于源码中的实现过于简单一般不会直接使用故不详细介绍。 结语 本文介绍了实现互斥访问索引文件的索引文件锁LockFactory。 转载https://www.codercto.com/a/84611.html
http://www.huolong8.cn/news/49562/

相关文章:

  • 怎么写简历 网站开发WordPress怎么封装APP
  • 报告网站开发环境建设部网站投诉核查
  • 烟台网站制作套餐服装网页设计网站
  • 中盛腾龙建设工程有限公司网站为什么语音转文字里面没有海南的
  • 四川做网站个人名片模板
  • 郑州网站推广公司上海专业高端网站建设
  • 网站中英文切换代码做网站配置服务器
  • 公司网站备案网址建网站 主流软件
  • 建设网站需要什么条件建筑公司招聘信息
  • 常用企业网站模板对比开发新软件需要多少钱
  • 做网站通过什么挣钱青岛新闻最新消息
  • 网站策划书撰写流程制作一个介绍洛阳网站
  • 山东网站建设负面消息处理怎样做士产品销售网站
  • 阿坝住房和城乡建设厅网站网站域名怎么设置
  • 旅行网站定制公司网站开发应该学哪门语言
  • 阿里云 oss做网站线上平台名称大全
  • 做网站软件下载软件公司 网站模板
  • 宿州做企业网站公司seo线下培训机构
  • seo对企业网站运营有何意义百度商家平台
  • 甘肃省建设工程168网站新闻发稿渠道
  • 阿里云clouder网站建设恩施兴州建设工程责任有限公司网站
  • 电视直播网站开发怎么做网站在线玩游戏
  • 上海企业网站制作费用做网站怎么收费的
  • 西安网站seo技术厂家各大网站rss订阅源地址
  • 罗村建网站建设网站过水
  • 针对不同网站的cdn加速wordpress支付宝付费
  • 建设网站成本预算企业门户网站需求文档
  • 一个虚拟主机能安装2个网站吗简述新建站点的步骤
  • 个人网站效果图网站建设厘金手指排名十九
  • 新余网站开发阿里云域名注册步骤