`
xiao5233
  • 浏览: 26220 次
  • 性别: Icon_minigender_1
  • 来自: 湖南
社区版块
存档分类
最新评论

hibernate search 大数据量,批量重建索引时,内存爆掉的问题

阅读更多

Session session = hibernateTemplate.getSessionFactory()
				.getCurrentSession();
		FullTextSession ftSession = org.hibernate.search.Search
				.getFullTextSession(session);
		Criteria criteria = ftSession.createCriteria(clazz);
			for (Criterion cr : criterions) {
				criteria.add(cr);
			}
			//criteria.add(Restrictions.between("id", 300000, 400000));
			criteria.setMaxResults(MAX_RESULT);
			int start = 1;
			int resultNum =MAX_RESULT;
			ftSession.setFlushMode(FlushMode.MANUAL);   
			ftSession.setCacheMode(CacheMode.IGNORE);  
			while (resultNum >= MAX_RESULT) {
				ftSession.beginTransaction();
				criteria.setFirstResult(start);
				List<T> results = criteria.list();
				for (T result : results) {
					ftSession.index(result);
				}
				
				resultNum = results.size();
				start+=MAX_RESULT;
				ftSession.flushToIndexes();
				ftSession.clear();//原本没有这一句,结果每次完全重建索引内存就爆掉了
				ftSession.getTransaction().commit();
			}

 

开始没有clear 结果每次建立索引20w条数据之后内存就爆掉了

 

因为ftSession会管理托管的pojo对象,也就是hibernate的一级缓存,将当前session的查询对象全部缓存在内存中,也就是当前session关闭前一直不会释放,最终结果就是内存不足。

 

加上 ftSession.clear()  后手动释放就好了。

 

 

 

分享到:
评论

相关推荐

    Hibernate中大量数据的更新

    然而,在将大量数据插入到数据库时,Hibernate 经常会出现性能和内存溢出问题。本文将讨论使用 Hibernate 批量更新大量数据的方法和技巧。 批量更新的必要性 在实际应用中,我们经常需要将大量数据插入到数据库中...

    Hibernate下数据批量处理解决方案

    在上述例子中,当尝试向数据库插入100,000条数据时,由于默认情况下Hibernate会将所有持久化对象保留在一级缓存中,随着数据量的增加,内存消耗也会迅速增长,最终导致内存溢出。因此,我们需要对一级缓存进行管理。...

    hibernate search全文索引的创建及查询

    本文将深入探讨如何创建和查询Hibernate Search的全文索引。 首先,我们来看一下`hibernate-search-analyzers-4.1.1.Final.jar`这个库。这个文件包含了Hibernate Search使用的各种分析器,分析器是处理文本的关键...

    hibernateSearch+demo

    索引是实时更新的,因此当数据库中的数据发生变化时,索引也会相应更新。 2. **领域对象映射**:如同 Hibernate ORM 将数据库表映射为 Java 对象,Hibernate Search 将这些对象映射到 Lucene 索引。你可以通过注解...

    Hibernate Search In Action

    Hibernate Search的一个显著优势是它能够自动化管理索引与数据库之间的同步问题。开发者不再需要编写复杂的代码来确保当数据库中的数据发生变化时,相应的索引也能实时更新。Hibernate Search利用其集成的机制,能够...

    hibernate Search in action

    《Hibernate Search in Action》这本书深入探讨了Hibernate Search这一强大的全文搜索引擎集成框架,它将全文搜索功能无缝地融入到Java持久层框架Hibernate之中。通过利用Lucene库的强大功能,Hibernate Search为...

    Hibernate Search配置及简单应用

    这个功能尤其在处理大量文本数据时非常有用,比如在电商网站的商品搜索或者新闻平台的文章检索。 首先,我们需要在项目中引入Hibernate Search的相关依赖。通常,这涉及到在`pom.xml`(如果你的项目是Maven)或`...

    Hibernate批量处理数据

    然而,在处理大量数据时,如果仍然采用逐条处理的方式,将会导致性能低下甚至内存溢出等问题。因此,本文将详细介绍Hibernate如何高效地进行批量数据处理,包括批量插入、批量更新和批量删除。 #### 二、批量插入 ...

    hibernateSearch 搜索 索引列子源代码

    **hibernateSearch 搜索 索引列子源代码** Hibernate Search 是 Hibernate 的一个扩展模块,它将全文搜索引擎的功能集成到了 Java 应用中,允许开发者在数据库中进行复杂的文本搜索。本教程将深入探讨 Hibernate ...

    hibernate search4.2

    - 延迟加载:只在需要时加载索引,减少内存占用。 ### 结论 Hibernate Search 4.2 是一个强大的搜索引擎集成解决方案,简化了 Java 应用程序中的全文检索实现。尽管现在已经有更新的版本,但 4.2 版本仍能满足许多...

    hibernate search reference card

    因此,Hibernate Search提供了`Indexer`工具类,它允许批量索引实体,显著提高初始索引的速度。 #### 查询索引 Hibernate Search提供了多种查询索引的方式,包括基于字符串的查询、布尔查询、短语查询等。这些查询...

    Hibernate搜索框架HibernateSearch.zip

    它是hibernate对著名的全文检索系统Lucene的一个集成方案,作用在于对数据表中某些内容庞大的字段(如声明为text的字段)建立全文索引,这样通过hibernate search就可以对这些字段进行全文检索后获得相应的POJO,...

    hibernate search-3.4.0.Final-dist

    2. **实时索引**:当数据库中的数据发生变化时,Hibernate Search能够实时更新对应的索引,确保搜索结果始终与数据库状态同步。 3. **多字段搜索**:支持对多个字段进行复合条件的搜索,可以通过布尔逻辑(AND、OR...

    Hibernate Search in action (pdf && code)

    此外,还会涉及实时更新索引、批量导入数据和优化索引性能等实际操作技巧。 在高级主题中,读者将学习到如何实现分布式搜索,利用Lucene的多节点集群技术(如Lucene Solr)提高系统的可伸缩性和可用性。同时,也会...

    基于Spring的Hibernate Search全文检索功能示例

    3. **Hibernate Search**:作为Hibernate的一个扩展,Hibernate Search提供了基于Lucene的全文检索功能,使得在数据库中的数据可以被快速、精确地搜索。 **二、集成Hibernate Search** 1. **配置依赖**:首先,你...

    在Hibernate中处理批量更新和批量删除

    这种方法的问题在于,每次更新都需要执行一个单独的SQL语句,这不仅消耗了过多的网络资源,而且极大地降低了数据库的性能,尤其是在更新大量数据时。 ### 优化批量更新 为了优化批量更新操作,可以采取以下策略: ...

    Getting Started with Hibernate Search

    - **错误处理**:在处理大量数据时,确保异常处理机制的健全性,避免因个别数据问题导致整个索引构建过程失败。 - **社区资源**:充分利用Hibernate Search社区的资源,如官方文档、论坛、示例代码等,可以快速解决...

Global site tag (gtag.js) - Google Analytics