我是靠谱客的博主 稳重发夹,最近开发中收集的这篇文章主要介绍问题杂谈:解决连接MySQL数据库,线程休眠导致过满的问题,“too Many Connection”,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

在开发Web应用时,可以自行处理数据连接,也可以交由所使用的Web框架管理。前段时间有人问我,为什么自己已经将的数据连接事务交由Spring管理了,但在使用过程中还是总是出现“too Many Connection”的报错。我在解决过程中发现了一些值得注意的地方,所以在这总结一下。

交代问题解决方法:他在使用Spring时并没有什么问题,只是不建议使用openSession,而是建议使用getcurrentSession,具体原因请转至我的另一篇文章。我们先讲问题出在哪?问题是在MySQL杀死休眠线程的时间。MySQL杀死休眠线程的时间默认是28800秒,所以将其时间更改为60秒(时间你自己看着改,不能太少,过少的话,在事务处理中就可能将线程杀死,一般大于等于你的请求时间),更改方式如下:

[mysqld]
character-set-server=utf8
basedir=C:Program FilesMySQLMySQL Server 5.7
datadir=C:Program FilesMySQLMySQL Server 5.7data
port = 3306
#将下方两行代码加入文件#
wait_timeout=60
interactive_timeout=60

完成上述操作,即可解决线程休眠为杀死,导致连接池满的问题。

那么可能有人会问,不是说将事务交给Spring就可以帮我处理好数据连接的问题么,为什么还要自行设置MySQL的属性呢?这就要理解MySQL中的连接、实例、会话、数据库、线程之间的关系了,下面我简要说明一下。

MySQL中的实例、数据库关系简述

1、MySQL是单进程多线程(Oracle等是多进程),也就是说MySQL实例在系统上表现就是一个服务进程,即进程(通过多种方式可以创建多实例,再安装一个端口号不同的MySQL,或者通过workbench来新建一个端口号不同的服务器实例等),该架构类似于SQL Server和Windows版本的Oracle。

2、MySQL实例是线程和内存组成,实例才是真正用于操作数据库文件的(MySQL数据库是由一些列物理文件组成,类似于frm,MYD,MYI,ibd结尾的文件)。

3、一般情况下,一个实例操作一个或多个数据库(Oracle一个实例对应一个数据库),集群情况下多实例操作一个或多个数据库。

为什么我们在安装MySQL是需要生成一个.ini文件呢?因为在实例启动的时候MySQL会读取配置文件,类似于Oracle的spfile文件,不同的是Oracle如果找不到参数文件会启动失败,MySQL如果找不到配置文件则会按照默认参数设置启动实例。

MySQL中database、instance、session

MySQL中建立一个会话,不是和具体的数据库相连,而是跟某个instance建立会话(每个会话可以使用不同的用户身份)。而一个实例可以操作多个数据库,故一个会话(在操作系统概念里,会话即是线程)可以操作一个实例上的多个数据库。

connection和session的定义和区别

1、连接(connection)是一个物理的概念,它指的是一个通过网络建立的客户端和专用服务器(Dedicated Server)或调度器的一个网络连接。

2、会话(session)是一个逻辑的概念,它存在于实例中。

注:创建一个连接(connection)实际上是在某个实例(instance,或者说是进程)中创建一个或多个线程。

3、一个连接可以拥有多个会话也可以没有会话(实际上,一条连接上的各个会话可以使用不同的用户身份),同一个连接上的不同会话之间不会相互影响。

4、两个会话之间的影响,体现在锁和锁存,即对相同资源的操作(对象定义或数据块)或请求(CPU/内存),它们的处理一般是按队列来处理的,前面的没有处理好,后面的就要等待。如果以打电话来比喻:connect就好比你接通对方,这时,connect就建立了,有没有通话,不管。双方进行通话,则session建立了,如果换人,则新的session建立,原session结束,类似的,可以在同一个connect上进行多个会话。最后,挂机,connect结束。

4、会话可以创建多个事务,比如:使用客端连接数据库,这样你就可以执行很多个事务了

5、一个事务只能由一个会话产生,在数据库里的事务,如果在执行的SQL都是由会话发起的,哪怕是自动执行的JOB也是由系统会话发起的

6、一个事务可能会产生一个或多个线程,比如RMAN备份,是可以创建多个线程可加快备份速度

7、一个线程在同一时间内只能执行一个事务,而一个线程,在没结束当前事务是无法释放资源来执行第二个事务

最后

以上就是稳重发夹为你收集整理的问题杂谈:解决连接MySQL数据库,线程休眠导致过满的问题,“too Many Connection”的全部内容,希望文章能够帮你解决问题杂谈:解决连接MySQL数据库,线程休眠导致过满的问题,“too Many Connection”所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(42)

评论列表共有 0 条评论

立即
投稿
返回
顶部