原文: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。这个实现必须是线程安全的。
相关推荐
官方版本,亲测可用
官方版本,亲测可用
官方版本,亲测可用
`maven-archetype-quickstart-1.1.jar` 是一个Maven的快速启动 archetype 包,专门用于帮助开发者快速创建一个新的Maven项目结构。在这个压缩包中,你将找到一个预设的Java项目模板,以便于你能够迅速地开始编码。 ...
解决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 -...
2. **创建项目**:在命令行中,使用`mvn archetype:generate`命令,并指定对应的archetype id,如`maven-archetype-webapp`,然后按照提示输入项目信息,如groupId、artifactId和version。 3. **编译与运行**:生成...
新建maven项目失败,不能下载maven-archetype-webapp-1.0.jar包
更新了配置jdk1.8,web.xml为4.0
本文将深入探讨“新建Maven项目失败”问题以及如何使用`maven-archetype-quickstart-1.1.jar`解决这个问题。 首先,当我们尝试使用Maven创建一个新项目时,通常会使用`mvn archetype:generate`命令,这个命令基于一...
【在本地库中装载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的压缩包,它包含了一个或多个archetype-catalog.xml文件,这些文件是Maven Archetype的目录,列出了所有可用的项目模板。当我们在Eclipse中...
`maven-archetype-quickstart-1.4.jar.zip` 是一个包含Maven快速启动模板的压缩包,版本为1.4。这个模板是Maven提供的基础项目骨架,方便开发者快速搭建新项目,特别是对于初学者,它极大地简化了项目初始化的步骤。...
"maven-archetype-quickstart-1.1.zip"便是为了解决这一问题而提供的一个解决方案。 "Maven Archetype Quickstart"是Maven提供的一种快速启动模板,用于帮助开发者快速创建一个新的Maven项目。这个模板包含了一个...
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"是Maven Archetype插件的一个重要文件,它包含了所有可用的Maven项目模板的元数据。当你在IntelliJ IDEA(简称IDEA)中创建一个新的Maven项目并选择“从Archetype创建”时,IDEA会...
《 Maven 深度解析:基于maven-archetype-3.1.2-source-release的实践与探索》 Maven,作为Java世界中广受欢迎的项目管理和构建工具,以其强大的依赖管理和标准化的构建流程,极大地简化了软件开发过程。本文将深入...