2026/4/6 5:15:27
网站建设
项目流程
房地产类的网站建设,后台很慢wordpress,网页设计与网站建设考试名词解释2019,2022注册公司取名前言:
一般这个报错大多是网络原因导致的#xff0c;确保你不是网络问题再往下看
问题
在一个方法上#xff08;该方法非常复杂执行时间长#xff09;加了 Transactional(rollbackFor Exception.class)后出现了如下图所示的错误解决#xff1a;
经过排查并非网络问题。复现…前言:一般这个报错大多是网络原因导致的确保你不是网络问题再往下看问题在一个方法上该方法非常复杂执行时间长加了 Transactional(rollbackFor Exception.class)后出现了如下图所示的错误解决经过排查并非网络问题。复现时在数据库执行show processlist;发现出现了很多存在时间非常长的锁非死锁那么大概率是因为数据库连接池的连接数不够导致的数据库连接失败中断。在长事务中每次进行数据库操作都要占用连接数并且因为事务没有提交的原因一直没有释放连接。细化事务的范围即可(不保证整个过程一致)比如你的主方法在A类调用了B类的方法就别在A类方法上加事务注解而是在B类被调用的上方法加。如果A类调用B类方法是多次调用的话(比如循环)那么他会在B类开启你循环次数个事务每个事务独立。例如你调用了100次前99次全成功最后一次失败他是不会回滚前99次的操作的而是会回滚你第100次的操作。扩展解释Override public void B() { // 操作数据库的方法 } Transactional(rollbackFor Exception.class) public void A(ListString strs) { for (String s: strs) { B(); } } Override Transactional(rollbackFor Exception.class) public void B() { // 操作数据库的方法 } public void A(ListString strs) { for (String s: strs) { B(); } }第一段代码中只会启动一个事务在循环的数据库操作还未全部完成之前事务未提交会一直占用连接池第二段代码中会启动strs集合大小个事务遍历完一个元素便提交一次事务。如果两个方法都加注解子方法启动事务的时候会判断上一层有没有事务如果有那么会加入到上一层事务管理而不是自己启一个事务。这就涉及到事务的传播特性了2024.1.04补充在调试一个复杂的导出时又出现了Communications link failure的错误第一反应就是sql执行时间太长超过了druid设置的maxwait获取连接等待超时时间。分析sql执行explain 你的sql。id为执行优先级数值一样则从上到下执行。其他参数我就不解释了网上都有搜索explain各个参数的意义主要看table表别名、type扫描类型不要看到all就觉得很影响性能其实表小的话不走索引反而更快、row预估扫描条数如果数量很大那你的sql就需要优化了、extra一般是看排序请客尽量让Using index出现多点。如果条件允许我建议把所有连接条件中的字段一般是id为主和order by 、 group by后面的字段都加索引