Hibernate的一些其他问题

Session是非线程安全的,生命周期较短,代表一个和数据库的连接,在b/s系统中一般不会超过一个请求;内部维护一级缓存和数据库连接,如果session长时间打开,会长时间占用内存和数据库连接。
SessionFactory是线程安全的,一个数据库对应一个SessionFactory,生命周期长,一般在整个系统生命周期内有效;SessionFactory保存着和数据库连接的相关信息(user,password,url)和映射信息,以及hibernate运行时要用到的一些信息
其他问题:
flush时将一级缓存与数据库同步,最好不要自己去调用,hibernate自己会调用
大批量操作数据时可能造成内存溢出,解决办法如下
1.清除session中的数据
for(int i=0;i<100000;i++)session.save(obj);
下面是解决办法
for(int i=0;i<100000;i++){
session.save(obj);
if(i%50==0){
  session.flush();session.clear();}}
}

 

上面只是人工解决 每次都要判断,效率低。。。不建议用

如何大批量的数据操作用StatelessSession代替Session

2.用StatelessSession接口,它不和一级缓存,二级缓存交互,也不会触发任何事件,监听器,拦截器,通过该接口的操作会立刻发送给数据库,与JDBC的功能一样,
StatelessSession s=sessionFactory.openStatelessSession();该接口的方法与Session类似。
3.Query.executeUpate()执行批量更新,会清除相关联的类多的二级缓存(sessionFactory.evict(class)),也可能造成级联,和乐观锁定出现问题

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值