【未来虫教育】数据库链接中断如何处理
2025-03-04
数据库的访问底层是通过 tcp 实现的,当链接中断是程序是无法得知,导致程序一直会停顿一段时间在这,最终会导致用户体验不好,因此面对数据库连接中断的异常,该怎么设置 mybatis 呢?
connection 操作底层是一个循环处理操作,因此可以进行时间有关的参数:
- max_idle_time :表明最大的空闲时间,超过这个时间 socket 就会关闭
- connect_timeout :表明链接的超时时间
在开发过程中,经常遇到插入重复的现象,这种情况该如何解决呢?
插入的过程一般都是分两步的:先判断是否存在记录,没有存在则插入否则不插入。如果存在并发操作,那么同时进行了第一步,然后大家都发现没有记录,然后都插入了数据从而造成数据的重复解决插入重复的思路 :
- 先判断数据库是否存在数据,有的话则不进行任何操作。没有数据的话,进行下一步;
- 向 redis set key,其中只有一个插入操作 A 会成功,其他并发的操作(B 和 C...)都会失败的 ;
- 当 set key 成功的操作 A,开始执行插入数据操作,无论是否插入数据成功,都在需要将 redis key 删除。【注】插入不成功可以多尝试几次,增加成功的概率 ;
- 然而 set key 失败的操作 B 和 C,sleep 一下,竞争赢的插入操作重复以上步骤。
总结:多线程同时插入数据,谁获取锁并插入数据成功了其他线程不做任何操作。当插入数据失败后,其他线程抢锁进行插入数据。