com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException:Lock wait timeout exceeded
使用parallelstream编列查询的数据并新增数据的时候,数据库报锁等待超时
换成stream后不再报错
猜想:
1.Parallelstream并行操作是同步进行的,所以会造成同一时间内对数据库的插入量过大
2.插入语句会短时间内占有表锁
3.同一个表插入数据太频繁导致表占有锁超时
正解:
1.parallelstream会并行执行操作,并行操作不能确定执行完成时间,可能会延缓事务提交速度,会引起数据库事务锁超时
2.开启大量事务执行会导致锁占有超时
解决方法
方法一:不开启事务
方法二:使用stream代替parallelstream
stream or parallelStream?
上面我们也看到了parallelStream所带来的隐患和好处,那么,在从stream和parallelStream方法中进行选择时,我们可以考虑以下几个问题:
1.是否需要并行?
2.任务之间是否是独立的?是否会引起任何竞态条件?
3.结果是否取决于任务的调用顺序?
对于问题1,在回答这个问题之前,你需要弄清楚你要解决的问题是什么,数据量有多大,计算的特点是什么?并不是所有的问题都适合使用并发程序来求解,比如当数据量不大时,顺序执行往往比并行执行更快。毕竟,准备线程池和其它相关资源也是需要时间的。但是,当任务涉及到I/O操作并且任务之间不互相依赖时,那么并行化就是一个不错的选择。通常而言,将这类程序并行化之后,执行速度会提升好几个等级。
对于问题2,如果任务之间是独立的,并且代码中不涉及到对同一个对象的某个状态或者某个变量的更新操作,那么就表明代码是可以被并行化的。
对于问题3,由于在并行环境中任务的执行顺序是不确定的,因此对于依赖于顺序的任务而言,并行化也许不能给出正确的结果。
参考博客:深入浅出parallelStream