使用hibernate search后,就会在加载hibernate配置文件时,自动在本地磁盘里建立索引文件,这个只是一个没有将数据库的记录加入到索引文件里去的,而只有一些必要信息的索引文件,因此,当我们将一个原来存在的索引文件删除后,想将它重建起来,那可以使用如下的方式来重建:
1 在重建的过程中,首先我遇到的问题是如何在使用注解的工程里面获取sessionFactory,这个使用另外加载配置文件的方式再实例化一个spring容器也是可以的,不过,这个spring容器产生的bean实例只是用到sessionFactory,而产生大量的bean实例,这若不用单例模式则很容易出现内在溢出的情况。
后来才知道,使用下面的方式可以获取sessionFactory(开始时我使用@Resource放在AnnotationSessionFactoryBean sessionFactory上面来加载它,是不对的)
@Autowired
private ApplicationContext ctx;//用它来获取上下文,其实就相当于加载了spring配置文件一样
private LocalSessionFactoryBean sessionFactory = (LocalSessionFactoryBean) ctx.getBean("&sessionFactory");//用它来获取sessionFactory就可以成功啦
获取sessionFactory的目的是为了从配置文件里读出所有的mapping对象,再进行索引文件的重建,而不用写死在代码里指明那个类要重建索引,不然当你加入一个需索引的类,而忘记在这里改,那重建里就会没有它的信息,所以这里用配置文件里的mapping对象来处理重建的问题比较好。
2 逐一加对每一个类进行加入索引操作
3 重建前要先删除索引,删除时一个没有加入索引文件的类时会发生异常,这个要处理好。
具体实现如下:
//重建索引
public void rebuildIndex() throws Exception{
Session session = getSession();
FullTextSession fullTextSession = Search.getFullTextSession( session);
fullTextSession.setFlushMode(FlushMode.MANUAL);
fullTextSession.setCacheMode(CacheMode.IGNORE);
// Transaction tx = fullTextSession.beginTransaction(); //这里是配置了事务交由spring管理,会自动开启与提交,所以这里就没开启它来
// WebApplicationContext cxt =
// WebApplicationContextUtils.getWebApplicationContext( getServletContext());
// AnnotationSessionFactoryBean factory = (AnnotationSessionFactoryBean) cxt.getBean( "&sessionFactory");
sessionFactory = (LocalSessionFactoryBean) ctx.getBean("&sessionFactory");
if(sessionFactory != null){
log.debug("sessionFactory成功从配置文件里注入");
}
else {
log.debug("sessionFactory未从配置文件里注入,它为空,重建索引操作失败!");
throw new Exception("sessionFactory未从配置文件里注入,它为空,重建索引操作失败!");
}
Iterator iter = sessionFactory.getConfiguration().getClassMappings();
while( iter.hasNext()) {//找出配置文件里写的持久化到数据库去的实体类
RootClass clz = (RootClass) iter.next();
buildClassIndex( fullTextSession, clz.getMappedClass());
}
// tx.commit(); //index are written at commit time
}
private void buildClassIndex(FullTextSession fullTextSession, Class mappedClass) {
//Scrollable results will avoid loading too many objects in memory
try {
fullTextSession.purgeAll( mappedClass);//删除索引
} catch (Exception e) {//小心要处理一些没有加入索引文件的实体而引起的异常
log.error("删除" + mappedClass + "索引的时候发生异常!可能该类没有加入索引文件。 ");
return ;
}
int BATCH_SIZE = 100;
ScrollableResults results = fullTextSession.createCriteria( mappedClass)
.setFetchSize(BATCH_SIZE).scroll( ScrollMode.FORWARD_ONLY );
int index = 0;
Object temp;
while( results.next() ) {//这个是用来遍历一个类的所有记录的,我们可以用调试的方式查看每一个results.next值,它就是每一个封装的对象
index++;
temp = results.get(0);
fullTextSession.index(temp); //index each element
if (index % BATCH_SIZE == 0) {//达到多少条记录就将它写入磁盘中,那个100是我随便设置的
fullTextSession.flush(); //apply changes to indexes
fullTextSession.clear(); //clear since the queue is processed
}
}
if(index % BATCH_SIZE != 0){//确保它们都写出到磁盘,如果是自己开启一个事务来操作的话,我们不用下面的方法,那么只有等到事务提交后,索引文件才被更新
fullTextSession.flush(); //apply changes to indexes
fullTextSession.clear(); //clear since the queue is processed
}
}
另外有关重建索引的还可以参考:
http://simonlei.iteye.com/blog/577068
http://jiangnan2112.iteye.com/blog/777917
http://isoloist.iteye.com/blog/856888
分享到:
相关推荐
### 提高SQL Server性能:通过DBCC DBREINDEX重建索引 #### 一、引言 在数据库管理系统中,SQL Server作为一款广泛使用的数据库产品,其性能优化是确保应用程序高效运行的关键因素之一。其中,索引是提升查询速度的...
这时,重建索引就成为了一个必要的优化手段。 重建索引的主要目的是为了重新组织索引数据,特别是对于聚集索引,还包括实际的表数据。当数据在索引页中分布不均匀时,会导致磁盘I/O性能下降,因为获取请求数据可能...
### 浅谈Oracle中重建索引 #### 一、索引的基本概念与作用 在数据库管理系统(DBMS)中,索引是一种特殊的数据结构,它能够加速数据检索的速度。Oracle数据库同样提供了强大的索引功能来优化查询性能。索引通过在...
用于SqlServer的索引重建,全语句实现,可根据实际情况进行部分关键表的索引重建。
重建索引,整理索引碎片,优化sql执行速度
重建索引脚本.sql 可以帮助用户
数据库检测修复重建索引
根据提供的文件信息,本文将详细解析SQL Server 2000中重建索引与收缩数据库的相关知识点。 ### 一、重建索引 #### 1. 什么是索引 在SQL Server 2000中,索引是提高数据检索速度的重要工具。它可以看作是一种特殊...
一、重建索引的前提条件 当表上的数据频繁进行`UPDATE`和`DELETE`操作,或者执行了`ALTER TABLE ... MOVE`操作导致ROWID改变时,可能需要考虑重建索引。这些操作可能导致索引倾斜,空间浪费,影响查询效率。 二、...
### 如何重建索引 #### 一、何时需要考虑重建索引 索引是数据库管理系统为了提高查询效率而建立的数据结构。随着数据的增删改查操作,索引可能会变得不那么高效,甚至可能导致性能下降。因此,在某些情况下,考虑...
本话题将围绕如何针对CLOB类型字段重建索引以及修复用户表空间索引空间的存储过程进行探讨。 首先,重建CLOB类型字段的索引可能是因为索引碎片过多、性能下降或为了更新索引结构以适应新的数据。重建索引通常涉及...
达梦数据库
### 重建索引示例与知识点解析 #### 标题:重建索引例子 DBCC dbreindex dbcc showcontig #### 描述:本示例通过使用`dbcc showcontig`来展示索引碎片化情况,并利用`dbcc dbreindex`命令对指定表的索引进行重组。...
"SQL重建索引.rar"这个压缩包文件可能包含了一个文本文件,旨在指导用户如何有效地批量重建数据库中的所有索引,以恢复其最佳性能。 首先,我们要理解为什么需要重建索引。在SQL Server 2008中,当数据频繁插入、...
重新修复数据库索引, PRINT '重建表' + @TableName +'的索引........Start!'
导致索引失效: 1、表上频繁发生update,delete操作; 2、表上发生了alter table ..move操作(move操作导致了rowid变化)。
由于重建索引是一项资源密集型操作,所以最好在系统负载较低的时间执行,如凌晨3点。执行次数也不宜过于频繁,可以根据实际需求设置每月执行一到两次。 在选择维护任务阶段,确保包含了“检查数据库完整性”、...
因此,重建索引是恢复索引性能的一种方式,它创建了新的索引页,并将索引数据重新排序和整理。 标题“重建所有索引”指出了一个数据库维护操作,即通过脚本或其他方式重建数据库中所有表的索引。描述中提到,随着...
《SQL Server索引重建手册》详细介绍了如何查看和分析索引碎片,如何选择在线重建索引的方式,以及如何观察索引重建的进度。手册强调了操作前必须进行全库备份的重要性,并指出在线重建索引时应遵循的顺序和原则。...
在SQL Server 2008 R2中,重建索引是一项重要的维护任务,它有助于优化数据库性能,尤其是当数据经过频繁的插入、删除和更新操作后,可能导致索引碎片增加。索引碎片有两种类型:逻辑碎片(页顺序不连续)和物理碎片...