日期:2014-05-20  浏览次数:20780 次

hibernate如何处理复杂查询,优化大数据,和批量sql语句?
hibernate对单表的控制能力比较优秀,但是对于比较复杂的再加上分页的动态查询,它能否做到更方便呢?
对于特别庞大的数据,hibernate的get和load方法也是不管有多少全查的,对大数据,有没有更好的配置去优化呢?
hibernate如何执行批量的sql语句,控制它的事务?

这些问题,我一直都是避开了hibernate本身,自己手动获取了它的connection,拼尽了所学的老底用jdbc去解决的,现在回头想想,对hibernate还是不甚了解,想听听大家的看法

------解决方案--------------------
Hibernate 是一个优秀的 ORM 框架,但不是高效的。

大数据量的查询,以及需要使用本地数据库语言对 SQL 进行逐步调优的应用不适合使用 Hibernate
------解决方案--------------------
hibernate对单表的控制能力比较优秀,但是对于比较复杂的再加上分页的动态查询,它能否做到更方便呢?
仅仅是查询,没有问题。hibernate的分页也已经针对不同的数据库进行了优化的
比如oracle,hibernate就采用的是oracle最快的分页方式,具体的可以去看OracleDialect源代码
其他的数据库也是

对于特别庞大的数据,hibernate的get和load方法也是不管有多少全查的,对大数据,有没有更好的配置去优化呢?
hibernate如何执行批量的sql语句,控制它的事务? 
get或者load是获取一条数据,这里都需要用延迟加载的
批量sql的时候,需要设置batch size,并且关闭二级缓存,同时使用flush来同步数据库,在使用clear来清空session缓存,这样不至于内存溢出,hibernte文档上有这个例子
或者用存储过程,如果你了解hibernate你就会用他的长处,而避免其短处
------解决方案--------------------
hibernate的查询缓存key是查询语句,但是key对应的value其实是数据库表的主键

当查询被缓存后,再次调用查询的时候,通过key找到对应的id集合,然后一个一个的去class缓存中去load
class里没有,再去数据库中获取。所以这又涉及到类缓存上了,当用hibernate进行数据库的修改和删除等操作的时候,都会更新一二级缓存,所以查询缓存会获取最新的数据


------解决方案--------------------
记得还想聚集性的数据库操作 hibernate 并不适合
可以考虑用spring的jdbcTemplate 或者simpleJdbcTemplate
这2个类是spring 封装好的 比完全jdbc好用点