南京网站建设 雷,相册制作软件,网软志成个人商城网站,外贸公司推广方案1. 循环分页或者循环进行部分读取处理数据的时候#xff0c;使用 session.clear() ; 2. 对应1N#xff08;N1#xff09;问题使用如下解决方式#xff1a; 1#xff09;#xff1a; 使用createCriteria进行查询(join fetch) 2#xff09;#xff1a;HQL - joi… 1. 循环分页或者循环进行部分读取处理数据的时候使用 session.clear() ; 2. 对应1NN1问题使用如下解决方式 1 使用createCriteria进行查询(join fetch) 2HQL - join fetch 3 使用fetch设置LAZY 4在Entity下使用注解BatchSize(size5) BatchSize 指定每次 读 取数据的数量 3. List 与 iterate 进行遍历取出数据库数据的list(); 区别1List 直接取出对象 iterate先会取出组件需要使用才会使用 区别2同一个session中每次执行list()取出数据时都会发送SQL语句但是iterate只会发出一条默认会去session缓存去找 4. 缓存session级别的缓存称为一级缓存每个session都有独立的一级缓存例如多个线程同时取同一个对象数据 解决方案建立一个共用的总缓存总缓存二级缓存如果找不到然后再到各自的session一级混村中寻找具体操作如下首先看缓存策略 type 其中memory支持缓存内存中disk支持缓存存放硬盘中 Cluster Safe 是否支持使用在集群环境 Query Cache Supported是否支持查询缓存3级缓存 假设使用EhCacheProvider二级缓存 1修改hibernate.cfg.xml配置文件 ? 1 2 property namecache.use_second_level_cachetrue/property property namecache.provider_classorg.hibernate.cache.EhCacheProvider/property 2 在/hibernate-distribution-3.3.2.GA/project/etc/ehcache.xml 配置文件拷贝到项目中 在ehcache.xml中默认如下设置 ? 1 diskStore pathjava.io.tmpdir/ ? 1 2 3 4 5 6 7 defaultCache maxElementsInMemory10000 eternalfalse timeToIdleSeconds120 timeToLiveSeconds1200 overflowToDisktrue / maxElementsInMemory:在内存中最多缓存的对象数量 eternal: 缓存内存对象是否永久保存不删除 timeToIdleSeconds: 当timeToIdleSeconds 周期时间没有被使用过自动清除掉秒 timeToLiveSeconds: 缓存对象的生存时间秒后自动清楚 overflowToDisk溢出的时候是否放置在硬盘上 diskStore path:默认临时存放硬盘缓存的路径 注意cache namesampleCache1 / 可以自定义cache名不自定义不指定默认是用 defauleCache ..... / 3将类使用二级缓存直接在Entity下使用注解 Cache 其设置如下 常用的READ_ONLY (只读), READ_WRITE读写 其中Cache(region) 使用自定义ehcache.xml的自定义缓存策略设置 4加入ehcache的jar包路径如下/hibernate-distribution-3.3.2.GA/lib/optional/ehcache/ehcache.jar 加入 commons-logging.jar包 1. 放入二级缓存如下规则 a) 经常访问 b) 不经常改动改动不大 c) 数据不是很大 例如用户权限 2. load 默认使用二级缓存iterate 默认使用二级缓存 3. list 默认往二级缓存加数据list查询的使用不使用缓存 4. 如果要 query 查询语句使用二级缓存需要打开查询缓存同样的重复的查询 1 hibernate.cfg.xml配置文件加入配置 property namecache.use_query_cachetrue/property 2) 使用Query的setCachable(true) 方法指明使用二级缓存 ; 5. 缓存算法LRU 、 LFU 、 FIFO LRU 最近最少被使用的 时间 LFU 使用率比较少的次数 FIFO按照数据从0开始拿走堆栈 设置方法在ehcache.xml继续设置一个参数 memoryStoreEvictionPolicyLRU 6. 事务隔离机制为了避免事务并发出现的问题 1. read-uncommitted : 能读取没有提交的数据 【会出现脏读等问题一般不设置此种】 2. read-committed : 只有提交后才读Hibernate建议使用【能解决脏读但会出现不可重复读和幻读问题手动解决】 3. repeatable read : 加锁MySQL默认使用 repeatable read 4. serializable : 序列化解决任何问题但是效率最低 MySQL 支持这四种事务隔离机制 事务隔离级别越高效率越慢 使用 select tx_isolation; 查询事务隔离机制 设置隔离机制 set session tx_isolationxxx; Hibernate解决并发事务方案使用Hibernate悲观锁和乐观锁进行设置 1事务机制的值为1248 ps. 二进制为0001 ,0010,0100,1000 这样算法效率高 1.a使用悲观锁(依赖于数据库的锁 解决 repeatable read问题) 在读取load数据的时候加入第三个参数 session.load(xxx.class, 1,LockMode.xxx); LockMode的值如下 一般只设置LockMode.UPGRADE 原因 NONE 无锁的机制Transaction结束时切换到此模式 READ 在查询的时候 hibernate会自动获取锁 write insert update hibernate 会自动获取锁 以上 3种锁的模式是hibernate内部使用的 UPGRADE—NOWAIT -是oracle数据库 支持的锁 1.b使用乐观锁(程序内使用字段version进行加锁与数据库没有关系) 可以定义一个version属性然后在getVersion上使用注解 Version 注意当并发的时候会报错那么找个错误交给我们自己来处理 悲观与乐观悲观一开始就进行加锁不论是否有其他事务来同时并发但是乐观锁则不进行直接加锁而是等待更新时候进行检查对比下如果与去之前version不一致那么更新下即可乐观锁效率高 本文转自 xiaominghimi 51CTO博客原文链接http://blog.51cto.com/xiaominghimi/969788如需转载请自行联系原作者