`
struggle2036
  • 浏览: 6514 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Hibernate Search(基于version3.4)--第二章Archetype

阅读更多

原文:http://sin90lzc.iteye.com/blog/1098564

Archetype

 

2.1概述

Hibernate Search由建立索引和索引搜索两个组件组成,并且都是基于Apache Lucene。

 

每次一个实体从数据库中被插入,更新或移除,Hibernate Search会跟踪这些事件并维护index的更新。所有index更新工作都会由Hibernate Search完成而不需要你去使用Lucene API。

 

为了与Lucene的index交互,Hibernate Search有一个DirectoryProvider的概念。DirectoryProvider会管理Lucene中的Directory类型。你可 以配置DirectoryProvider来调整Directory的类型。

 

Hibernate Search通过Lucene Index来搜索实体,返回持久化的实体列表,这样你就不需要花时间把对象映射到Lucene document的工作。另外,Hibernate和Hibernate Search之间持久化上下文是共享的。事实上,FullTextSession是基于Hibernate Session建立的,因此在应用中可以使用统一的org.hibernate.Query 或 javax.persistence.Query API,如通过HQL,JPAQL或本地查询。

 

为了得到更好性能,Hibernate Search捆绑了Lucene Index写操作。当前有两种的捆绑方式,第一种是没有事务处理的,index更新操作是在实际的数据库操作之后进行。另一种是在运行中的事务 中,index的更新操作是在事务的提交阶段,当事务回滚时放弃更新。这个捆绑范围是基于事务。这有两处好处:

  • 性能更好:当操作是在捆绑中运行,Lucene的indexing能工作得更好。
  • ACID:工作的过程与数据库的事务捆绑在一起,仅当事务提交时工作才会被执行。严格来说,这并不是ACID,但ACID对于全文搜索来说并不是很有用的,因为index可以通过数据源重建。

你可以这样理解两种捆绑模式(no scope vs transactional),它们就好像是auto commit vs transactional的表现一样。从性能的角度来看,推荐使用基于事务的模式。no scope模式是透明,Hibernate Search会探测当前的事务并调整范围。

 

Tip :It is recommended - for both your database and Hibernate Search - to execute your operations in a transaction, be it JDBC or JTA.

 

Note :Hibernate Search works perfectly fine in the Hibernate / EntityManager long conversation pattern aka. atomic conversation.

 

Note :Depending on user demand, additional scoping will be considered, the pluggability mechanism being already in place.

 

2.2后端

Hibernate Search可以让批处理工作交给不同的后端来处理。Hibernate Search提供了三种开箱即用的后端,你可以选择去嵌入到你的实现中。

 

2.2.1后端类型

2.2.1.1 Lucene

在这种模式下,所有的index更新操作会应用到同一个index。这种模式的index是共享的并要小心地处理锁操作,可以应用于集群环境或非集群环境。这种模式的优点是简单并在查询时可以立即看到改变。

 

2.2.1.2 JMS

所有的index更新操作会把更新操作的命令发送到JMS队列。一个唯一的reader会处理JMS队列并更新主index。之后,主index将 会被复制到各个从index。这就是众所周知的主/从模式。主方唯一的责任是维护index的更新,从方可以接受写和读的操作。然而从方只会对本地 index进行读操作,而把写操作委托给主方。

这种模式面向的是集群环境,并有很高的吞吐量,而且可以接受index的延迟更新。可靠性由JMS provider和本地的index副本来确保。

 

2.2.1.3 JGroup

JGroups工作模式与JMS相似,也同样设计成主/从模式。不同的是,JGroup使用自身的工具包完成复制工作。当对响应时间要求比较严格时,考虑使用JGroup模式,不过不支持JNDI服务。

 

2.2.2建立索引工作的运行

indexing可以运行在事务提交的同步方式,或异步方式。

 

2.2.2.1同步方式

这是一种安全的,因为indexing与事务提交相一致。在高并发环境中,这会限制了应用的吞吐量(由于Lucene的锁机制),如果后端运行比事务处理更慢或有大量的IO操作的话,这将增加系统的响应时间。

 

2.2.2.2异步方式

这种方式后端委托indexing工作由不同的线程来完成。这样的话,吞吐量与响应时间将与后端的性能无关。该方式的缺点是在事务提交后,index更新操作会有一些延时,并要花一点开销来管理线程。

 

推荐先使用同步方式,当因为同步方式而出现性能问题时再应用异步方式。

 

2.3Reader strategy

当执行一个查询,Hibernate Search与Lucene index交互是通过reader strategy。选择怎么样的reader strategy依赖于应用的实际情况(经常更新,多数情况只读,异步方式更新index)。

 

2.3.1Shared策略

这种策略下,Hibernate Search将共享同一个IndexReader,不管是不同的查询(query)还是不同的线程,都会保持IndexReader up-to-date。IndexReader由多个SegmentReader组成。这种策略只会重新打开修改过的或新生成的segment,那些没修 改过的segment将会重用。

 

2.3.2 Not-shared策略

每执行一次查询,便重新生成一次IndexReader,这种策略是低效的,因为打开一次IndexReader是相当大的资源消耗。

 

2.3.3 Custom

你自定义一个reader strategy通过实现org.hibernate.search.reader.ReaderProvider。这个实现必须是线程安全的。

 

分享到:
评论

相关推荐

    antlr3-maven-archetype-3.4-sources.jar

    官方版本,亲测可用

    antlr3-maven-archetype-3.4-beta4-sources.jar

    官方版本,亲测可用

    antlr3-maven-archetype-3.4-beta3-sources.jar

    官方版本,亲测可用

    maven-archetype-quickstart-1.1.jar包下载

    `maven-archetype-quickstart-1.1.jar` 是一个Maven的快速启动 archetype 包,专门用于帮助开发者快速创建一个新的Maven项目结构。在这个压缩包中,你将找到一个预设的Java项目模板,以便于你能够迅速地开始编码。 ...

    maven-archetype-webapp-1.0.jar下载

    2. **创建项目**:在命令行中,使用`mvn archetype:generate`命令,并指定对应的archetype id,如`maven-archetype-webapp`,然后按照提示输入项目信息,如groupId、artifactId和version。 3. **编译与运行**:生成...

    maven-archetype-webapp-1.0.jar

    新建maven项目失败,不能下载maven-archetype-webapp-1.0.jar包

    maven-archetype-quickstart-1.1.jar下载

    解决Unable to create project from archetype [org.apache.maven.archetypes:maven-archetype-quickstart:1.1] 1. 下载maven-archetype-quickstart-1.1.jar 文件地址: 2.cmd窗口执行mvn install:install-file -...

    maven-archetype-webapp-1.4

    更新了配置jdk1.8,web.xml为4.0

    新建maven项目失败需要的jar包,maven-archetype-quickstart-1.1.jar

    本文将深入探讨“新建Maven项目失败”问题以及如何使用`maven-archetype-quickstart-1.1.jar`解决这个问题。 首先,当我们尝试使用Maven创建一个新项目时,通常会使用`mvn archetype:generate`命令,这个命令基于一...

    maven-archetype-quickstart-1.1.jar.zip

    【在本地库中装载maven-archetype-quickstart】 1. 下载该文件 2. 打开cmd窗口,执行mvn install:install-file -DgroupId=org.apache.maven.archetypes -DartifactId=maven-archetype-quickstart -Dversion=1.1 -...

    maven_archetype-catalog.zip

    标题中的"maven_archetype-catalog.zip"就是一个Maven Archetype Catalog的压缩包,它包含了一个或多个archetype-catalog.xml文件,这些文件是Maven Archetype的目录,列出了所有可用的项目模板。当我们在Eclipse中...

    maven-archetype-quickstart-1.4.jar.zip

    `maven-archetype-quickstart-1.4.jar.zip` 是一个包含Maven快速启动模板的压缩包,版本为1.4。这个模板是Maven提供的基础项目骨架,方便开发者快速搭建新项目,特别是对于初学者,它极大地简化了项目初始化的步骤。...

    maven-archetype-quickstart-1.1.zip

    "maven-archetype-quickstart-1.1.zip"便是为了解决这一问题而提供的一个解决方案。 "Maven Archetype Quickstart"是Maven提供的一种快速启动模板,用于帮助开发者快速创建一个新的Maven项目。这个模板包含了一个...

    maven-archetype-quickstart

    1.maven-archetype-quickstart-1.1.jar 用于搭建maven模块项目 2.打开cmd窗口,执行mvn install:install-file -DgroupId=org.apache.maven.archetypes -DartifactId=maven-archetype-quickstart -Dversion=1.1 -...

    archetype-catalog.xml

    标题中的"archetype-catalog.xml"是Maven Archetype插件的一个重要文件,它包含了所有可用的Maven项目模板的元数据。当你在IntelliJ IDEA(简称IDEA)中创建一个新的Maven项目并选择“从Archetype创建”时,IDEA会...

    maven-archetype-3.1.2-source-release.zip

    《 Maven 深度解析:基于maven-archetype-3.1.2-source-release的实践与探索》 Maven,作为Java世界中广受欢迎的项目管理和构建工具,以其强大的依赖管理和标准化的构建流程,极大地简化了软件开发过程。本文将深入...

Global site tag (gtag.js) - Google Analytics