使用了Hibernate Search 之后,在集群的环境下,就需要牵扯到同步index文件的问题, 《Hibernate Search In action》 提到了两种方式,一种是同步更新,一种是异步更新,下面来分别说说这种更新试的使用及实现:
1. 同步方式
同步方式就是一个节点的更新能被其它的节点实时获得,最经典的方式就是各个节点都读写同一个文件夹,当然了,如果节点在不同的机器上,那就需要能够无验证网络访问这个文件夹。在节点比较少的情况下,这种情况可以很好的工作,如果节点很多,而且更新又比较频繁,这种情况可能会带来锁竞争及其它的一些问题。
如何实现:《Hibernate Search In action》提到的比较多的是NFS,这是种在UNIX系统中使用的文件共享技术。windows下面也有对应的实现,但是,在64位的windows下可能会遇到一些麻烦。因为我的系统是windows64位的,所以我选用了另外一种实现方式,如在windows环境下,有两台机器A 和 B, A设置一个共享文件夹admin, 但在访问的时候需要用户名和密码,这时候可以用下面的这行命令在B机器上运行一下
rundll32 netplwiz.dll,UsersRunDll
命令,然后将需要访问A机器的用户名和密码设在B机器上,就可以访问这个
共享文件夹时不需要userName和Passwd了。
2. 异步方式
在《Hibernate Search In action》中提及一种JMS方式,即对Index文件的更先方到一个JMS队列中,然后由一个master节点统一进行index, 其它slave节点定时去master节点同步被Index后的文件,从而达到同步文件的目的。因为是异步的,所以有新的数据会被延迟搜索出来的情况发生, 除此之外,因为使用了JSM,所以一种JMS技术需要被引入及维护,部署上也带来子一定的难度。但是相比较这些不足,这种方式比较稳定,当在节点比较多的环境下, 应该是作为首先的。下面来谈谈如何实现。
其实在下面这篇文章中已经讲了如果去实现这种做法:
分布式Hibernate search
但是按照文中的说法进行部署的时候,也遇到了一些小的问题,特在下面记录一下,以做为这篇文章的补充:
A. 上面这文章中提到,在你的环境中配置activemq.xml文件,然后使用如下的配置去启动,
<bean id="broker" class="org.apache.activemq.xbean.BrokerFactoryBean">
<property name="config" value="WEB-INF/activemq.xml" />
<property name="start" value="true" />
</bean>
我认为不可取,应该让activemq在一上单独的Server中运行。因为当MQ是嵌在你的Application中运行时,如果你的Application挂了,那Slave节点就不可以将数据写到Q中,这样就会有丢数据的可能,而放在一个单独了Server中,如果master挂了,slave还是可以将数据放到Q中的,当master重启之后,又可以接着处理,当然了,为了保险,可能MQ也需要做集群。如单独启动,需要将下面的配置放在{ActiveMQ_HOME}/conf/activemq.xml文件中:
<amq:broker brokerName="HibernateSearchBroker">
<amq:managementContext>
<amq:managementContext createConnector="false"/>
</amq:managementContext>
<amq:transportConnectors>
<amq:transportConnector uri="tcp://localhost:61616" />
</amq:transportConnectors>
</amq:broker>
<amq:queue name="queue/hibernatesearch" physicalName="hibernateSearchQueue" />
启动之后,手动创建一个Q,名字叫hibernateSearchQueue。
B. 所有的都配置好了之后,在运行的过程中,发现slave节点的message可以正常发送,Master节点也可以获取到这个message,但是就是index不正确,通过Debug才发现在取session的时候,出错了,但是没有报出来错误信息。Master节点都要包含一个类继承自AbstractJMSHibernateSearchController来处理message,需要实现getSession这个方法,一开始我的写法如下:
@Repository("hibernateSearchController")
@Tansactional
public class JMSHibernateSearchController extends AbstractJMSHibernateSearchController implements MessageListener {
@Autowired
private SessionFactory sessionFactory;
@Override
protected void cleanSessionIfNeeded(Session session) {}
@Override
protected Session getSession() {
return sessionFactory.getCurrentSession();
}
}
后来无论如何都不能获取到,后来改成如下的方式,成功:
@Override
protected Session getSession() {
return sessionFactory.openSession();
}
有些时候能进行Debug还是很重要的。
分享到:
相关推荐
技术栈涵盖了从后端服务框架到前端框架的各种组件,如`Druid`数据库连接池、`Hibernate Validator`服务端验证、`SiteMesh`布局框架、`Activiti`工作流引擎等。前端方面,使用了`jQuery`、`Bootstrap`、`JQuery ...
Java视频教程+ActiveMq+Docker+ElasticSearch+Hadoop+Hibernate+ 多线程+Kafka+MondoDB+Mybatis+WebSocket+SpringCloud+SpringBoot+Solr+Shiro+Redis+Nginx+Mysql;全部是视频教程,收藏不易,给个好评。
Server端架构: Struts2+ Spring + Spring Data(简化持久层) + JPA接口+ Hibernate(JPA显现) 后台管理系统 页面架构 :jQuery Easyui 框架 前端互联网系统 页面架构 :BootStrap 响应式 + AngularJS Excel解析...
同时,还创建了一个名为"queue/hibernatesearch"的队列,用于存储Hibernate Search的消息。 另外,JNDI资源也需要在Tomcat的`MEAT-INF/context.xml`文件中配置,包括JMS Connection Factory和Queue。这使得应用程序...
他对于Spring全家桶(Spring、SpringMVC、Mybatis、Hibernate、SpringBoot、SpringData)有深入的理解,同时熟悉SSH(Spring+Struts+Hibernate)、SSM(Spring+SpringMVC+Mybatis)、以及SSS(Spring+SpringMVC+...
Connecting to Elasticsearch by Using Spring Data 30.6.3. Spring Data Elasticsearch Repositories 30.7. Cassandra 30.7.1. Connecting to Cassandra 30.7.2. Spring Data Cassandra Repositories 30.8. ...
自我娱乐项目模块简介activemq模块主要是测试消息中间件的一些特性,包括持久订阅,连续/定时投递,死信变量,kafka的生产者和消费者,指定位置自定义读取主题,了解分区和分组机制amazingt是一个常用的springweb...
开发通常采用Java Web技术,如JSP/Servlet,或者使用成熟的框架组合,如Maven+Spring+Struts+Hibernate或Maven+Spring+SpringMVC+MyBatis。通过JDBC进行数据库操作。这种架构成本低,易于部署,但存在扩展性和容错性...
1. **鲜果任务水果配送项目**:使用Springmvc、Spring、Mybatis、Webservice CXF、Shiro、Redis、ActiveMQ和ElasticSearch等技术。项目中,利用Webservice CXF进行服务发布,Shiro结合Ehcache进行权限验证,Redis...
Hibernate Mybatis 消息中间件框架 ActiveMQ kafka 全文搜索引擎 ElasticSearch DSL语法 Kibana 微服务架构 Spring Boot Spring Cloud 开发语言 Java JavaSE JavaEE SQL Python 数据库相关 关系型数据库 MySql 非...
- **明宇乐购**:这是一个为明宇公司开发的网上商城平台,采用的技术栈包括Spring、SpringMVC、Mybatis、Redis、Solr、Dubbo、ActiveMQ、MySQL等。项目中使用了SSM框架和Dubbo+Zookeeper的分布式框架,主要分为客户...
消息队列MQ,如ActiveMQ和RabbitMQ(5天),以及Spring框架,包括SpringCloud、SpringMVC和Spring核心(10天)。Dubbo作为RPC框架的学习,也会有5天的时间。 在JavaEE项目实战方面,可以选择支付宝内部OA系统(15天...
* 熟练使用 Struts2、Spring、SpringMVC、Hibernate、Mybatis 框架 * 熟悉 Oracle、Mysql 等关系型数据库,熟悉 PL/SQL 语言 * 熟悉 ActiveMQ、Apache Shiro、QuartZ 的基本使用 * 熟悉 WebService、Dubbo 等中间件...
- **ActiveMQ/RabbitMQ**(5天):理解消息中间件原理,用于解耦应用和服务间通信。 5. **Spring框架**: - **Spring Cloud/Spring MVC/Spring**(10天):微服务架构、MVC模式和核心容器。 6. **RPC框架**: -...
4. **消息队列**: 如ActiveMQ或RabbitMQ,实现异步处理,提高系统响应速度。 5. **测试框架**: 如JUnit和Mockito,用于编写和执行单元测试,确保代码质量。 6. **模板引擎**: 如FreeMarker或Thymeleaf,生成动态...
ORM(对象关系映射)框架如Hibernate和MyBatis则提供了更高级别的抽象,使得开发者可以更专注于业务逻辑,而不是数据库操作。此外,数据库连接池如HikariCP和C3P0能有效地管理和复用数据库连接,提升系统性能。 在...
2. **商品管理**:商品分类、添加、编辑、删除,商品展示,可能会用到MyBatis或Hibernate进行数据持久化。 3. **订单系统**:购物车、下单、支付、订单状态跟踪,涉及到了Spring MVC处理HTTP请求,与后端服务交互,...
2. 数据访问:JPA(Java Persistence API)和Hibernate是Java进行数据库操作的主流工具,它们提供了ORM(对象关系映射)功能,简化了SQL操作。MyBatis则是另一种灵活的半自动ORM框架,允许开发者直接编写SQL语句。 ...