【未来虫教育】数据库链接中断如何处理

2025-03-04ASPCMS社区 - fjmyhfvclm

数据库的访问底层是通过 tcp 实现的,当链接中断是程序是无法得知,导致程序一直会停顿一段时间在这,最终会导致用户体验不好,因此面对数据库连接中断的异常,该怎么设置 mybatis 呢?

connection 操作底层是一个循环处理操作,因此可以进行时间有关的参数:

  • max_idle_time :表明最大的空闲时间,超过这个时间 socket 就会关闭
  • connect_timeout :表明链接的超时时间
数据库服务器活的杠杠的,但是因为网络用塞,客户端仍然连不上服务器端,这个时候就要设置 timeout,别一直傻等着

在开发过程中,经常遇到插入重复的现象,这种情况该如何解决呢?

插入的过程一般都是分两步的:先判断是否存在记录,没有存在则插入否则不插入。如果存在并发操作,那么同时进行了第一步,然后大家都发现没有记录,然后都插入了数据从而造成数据的重复

解决插入重复的思路 :

  • 先判断数据库是否存在数据,有的话则不进行任何操作。没有数据的话,进行下一步;
  • 向 redis set key,其中只有一个插入操作 A 会成功,其他并发的操作(B 和 C...)都会失败的 ;
  • 当 set key 成功的操作 A,开始执行插入数据操作,无论是否插入数据成功,都在需要将 redis key 删除。【注】插入不成功可以多尝试几次,增加成功的概率 ;
  • 然而 set key 失败的操作 B 和 C,sleep 一下,竞争赢的插入操作重复以上步骤。

总结:多线程同时插入数据,谁获取锁并插入数据成功了其他线程不做任何操作。当插入数据失败后,其他线程抢锁进行插入数据。

全部评论