用hibernate的getcurrentsession() 造成了数据库和查询的不同步,是怎么回事
1个回答
展开全部
我个人觉得是你这里的getcurrentsession没有提交事务,导致执行了更新操作 但实际底层没有提交事务,意思就是说最终没有进行commit 而不是你说的线程延迟什么问题。
getcurrentsession()和opensession() 的区别重点不是在于线程问题,而是管理事务回滚问题。
比如你用getcurrentsession取了当前session,当你循环List对象并更新每个对象里的一个字段时报了错误,那很多项目中根据公司需求得进行回滚,比如回滚整个List对象,或者回滚当前这一个对象并继续更新下一个对象等。当你用当前session了说明你的每个对象对应的每个事物都被一个session管理,而用了opensession说明你的每个对象每次开启了新session 不但占用了很多资源,而且每个session对应一个事务。大多数情况都是封装用getcurrentsession因为每次逻辑都用一个session来管理 也不占资源。
每次取session时候底层都用的是sessio。load方法,这个方法 就跟hibernate懒惰加载有关系,就比如楼上说的改成lazy=false 但这个也不建议改,如果用了lazy=false了说明勤奋加载 那样程序负担太大。
自从用了spring开始,线程安全,同步都归spring的ThreadLocal管理,用的是临时线程变量机制,一般不会出现并发报错问题。
希望对你有所帮助
getcurrentsession()和opensession() 的区别重点不是在于线程问题,而是管理事务回滚问题。
比如你用getcurrentsession取了当前session,当你循环List对象并更新每个对象里的一个字段时报了错误,那很多项目中根据公司需求得进行回滚,比如回滚整个List对象,或者回滚当前这一个对象并继续更新下一个对象等。当你用当前session了说明你的每个对象对应的每个事物都被一个session管理,而用了opensession说明你的每个对象每次开启了新session 不但占用了很多资源,而且每个session对应一个事务。大多数情况都是封装用getcurrentsession因为每次逻辑都用一个session来管理 也不占资源。
每次取session时候底层都用的是sessio。load方法,这个方法 就跟hibernate懒惰加载有关系,就比如楼上说的改成lazy=false 但这个也不建议改,如果用了lazy=false了说明勤奋加载 那样程序负担太大。
自从用了spring开始,线程安全,同步都归spring的ThreadLocal管理,用的是临时线程变量机制,一般不会出现并发报错问题。
希望对你有所帮助
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询