@Transactional引发的生产问题
在项目中,因为遗留问题,@Transactional注解都是加在类上,这样所有的方法都会开启事务注解。
问题:
开启事务后,会占用一条数据库连接,因为很多地方都会调用http请求,http请求可能会因为各种原因占用时间,这样数据库连接就不会释放,如果并发量一高就会导致数据库连接占满,系统出现问题。
思考:
为什么会在类上加@Transactional注解? 猜测第一是偷懒,第二是因为hibernate的一个机制。
系统都是使用currentSession,这样的前提是有一个session才能获取当前session,否则会报错。
开启session的方法有两个,一个是过滤器中添加OpenSessionInViewFilter
另一个是添加事务@Transactional。
filter是servlet的,如果是定时任务的方法,就不经过filter,如果方法还没事务的话就会报错。
所以可能开发在写定时任务的时候发现要创建session才能不报错,就在所有类里面添加了事务,这也算是hibernate的一个小坑吧。
总结:
1、不要在类上添加事务,这样消耗性能,占用大量数据库连接。
2、避免方法中含有http请求的长事务,由于http占用时间长,最好是拆开成多个事务。
3、增大数据库连接池的最大连接数,保证数据库连接不会被占用完。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix