• Hibernate


    1-及时清除Session一级缓存

    在处理大数据量时,会有大量的数据缓冲保存在Session的一级缓存中,这缓存大太时会严重显示性能,

    所以在使用Hibernate处理大数据量的,可以使用session. clear()或者session. evict(Object) 在处理过程中,清除全部的缓存或者清除某个对象。

    2-推荐使用延迟加载机制

    在一对多、多对一的关系中,使用延迟加载机制,会使不少的对象在使用时才会初始化,这样可使得节省内存空间以及减少数据库的负荷,而且若PO中的集合没有被使用时,就可减少互数据库的交互从而减少处理时间。

    立即加载的缺点

    Hibernate在查询某个对象时,立即查询与之关联的对象,我们可以看出这种加载策略存在两大不足:

    • select的语句数目太多,需要频繁的访问数据库,会影响查询的性能。
    • 在应用程序只需要访问要的对象,而不需要访问与他关联的对象的场景下,加载与之关联的对象完全是多余的操作,这些多余的操作是会占内存,这就造成了内存空间的浪费。

    什么时候使用延迟加载?什么时候使用立即加载?

    • 如果程序加载一个持久化对象的目的是为访问他的属性,则可以采用立即加载。
    • 如果程序加载一个持久化对象的目的仅仅是为了获得他的引用,则可以采用延迟加载。

      Hibernate中允许使用延迟加载的地方主要有以下几个地方:

    <hibernate-mapping default-lazy=(true|false)”true”>:设置全局的延迟加载策略。
    <class lazy=(true|false)>:DTD没设置默认值,推理默认值为true
    <property lazy=(true|false)>:设置字段延迟加载,默认为false
    <component lazy=(true|false):默认为false
    <subclass lazy=(true|false)>:默认设置为true
    <join-subclass lazy=(true|false)>:默认设置为true
    <union-subclass lazy=(true|false)>:默认设置为true
    <many-to-one lazy=(proxy|no-proxy|false)>:默认为proxy
    <one-to-one lazy=(proxy|no-proxy|false)>:默认为proxy
    <map lazy=(true|extra|false)>:默认为true
    <set lazy=(true|extra|false)>:默认为true
    <bag lazy=(true|extra|false)>:默认为true
    <ibag lazy=(true|extra|false)>:默认为true
    <list lazy=(true|extra|false)>:默认为true
    

    3-少用“多对多”“一对一”,拆分为“多对一”或者“一对多”

    由于“多对多”关联的性能不佳(由于引入了中间表,一次读取操作需要反复数次查询),因此在设计中应该避免大量使用。

    如果纯粹地使用“一对一”, 关联表的主键就是主表的主键,这样一旦业务有变更那就得改结构。所以不如直接建立成“多对一”的

    4-关键参数设置

    1)show_sql设置为false,避免大量写入日志,会产生巨大的IO操作。如果真的要显示sql,可以提高日志级别降低日志的写入量,亦或通过缓存批量的写入。

    2)设置下面两个属性,这两个选项非常重要!!!将严重影响Hibernate的CRUD性能!

    参考:hibernate的速度问题--hibernate.jdbc.fetch_size和 hibernate.jdbc.batch_size

    //hiberante.cfg.xml(Oracle ,sql server 支持,mysql不支持)
    
    <property name="hibernate.jdbc.fetch_size">50</property>
    <property name="hibernate.jdbc.batch_size">30</property>
    

     hibernate.jdbc.fetch_size 是设定JDBC的Statement“读取”数据的时候每次从数据库中取出的记录条数。

    • 例如一次查询1万条记录,对于Oracle的JDBC驱动来说,是不会1次性把1万条取出来的,而只会取出Fetch Size条数,当纪录集遍历完了这些记录以后,再去数据库取Fetch Size条数据。
    • 因此大大节省了无谓的内存消耗。当然Fetch Size设的越大,读数据库的次数越少,速度越快;Fetch Size越小,读数据库的次数越多,速度越慢。

    hibernate.jdbc.batch_size 是设定对数据库进行"批量删除,批量更新和批量插入"的时候的批次大小,有点相当于设置Buffer缓冲区大小的意思。

  • 相关阅读:
    一步一步自定义SpringMVC参数解析器
    Git客户端TortoiseGit(Windows系统)的使用方法
    Tiles入门和Tiles 框架和体系结构
    SpringMVC整合Tiles框架
    JQuery和JSON方式参数传递并处理JAVAWEB中文乱码问题
    spring mvc接收JSON格式的参数
    Spring MVC Controller与jquery ajax请求处理json
    扩展SpringMVC以支持绑定JSON格式的请求参数
    SpringMVC从Control中响应json数据
    JSONP 教程
  • 原文地址:https://www.cnblogs.com/frankcui/p/13997346.html
Copyright © 2020-2023  润新知