对于数据库的疑问

1.题记

   近日将一个网站部署到服务器上,在访问的过程中,通过linux终端发现,总会有too many connections的错误。为了解决这个错误,从几天前至今,除了两种解决方法,期间涉及到的很多东西,都不理解,估记于此,与给位共同探讨。

 2.问题正文

  网站有个功能,每个半个小时发邮件。测试的发邮件对象有7个。在tomcat刚启动的那会儿,还可以每隔半个半个小时发送邮件给指定的对象。但是,随着时间的推移,不好意思,该功能就不能实现了,每个1个小时,或更长的时间,给7个人中的几个发邮件。手动执行发邮件的job任务,服务器终端便报too many connections错误。而且此时,在本机上通过,Nactive for sql连接服务器上的数据库时,报too many connections 错误。

  面对这种情况,我们的一个猜测是,用完连接后没有将连接释放。

  数据库会有一个最大的连接上限,用max_connections参数来表示。当超过这个连接上线,数据库就不会接受连接,报too many connectios的错误。数据库连接池首先会在池子里放一定数量的数据库连接,给应用程序使用。这个数量在spring 的配置文件中可以设定。此外spring中还可以设定最大的连接数。当并发的数据库访问数量超过最大的连接数时,后面的数据库请求就会处于等待状态。直到某个数据库连接被释放,应用程序获得该请求。上面讲的是数据库连接池的工作原理。

  这个可以解释等待的现象,并发访问数据库达到了设置的最大值。但是too many connections怎么解释呢?


 做个这样一个实验:数据库max_conncections=500   数据库连接池的最小连接数为20,初始化连接数为30,最大连接数为50,如果一个数据库连接就表示一个Thread_connected的话,那么Thread_connected最大也就是50 ,但是show processlist显示Thread_connected超过了400,而且还在不断递增,too many connections是时间的问题而已,即使将wait_timeout 设为100也只能拖延其达到上限的时间。

这到底是怎么回事??数据库连接池中这些参数的设定在这个事实面前怎么觉得毫无意义,Thread_connections中的Thread又到底是什么含义,和数据库连接池中的一个连接有什么关系?是不是数据库连接池中的一个连接被使用或创建然后被使用代表一个Thread,连接被丢弃后,代表该线程消失了?是的话,Thread_connections的最大线程就只有50,不是的话,那数据库连接池中这个最大连接、最小连接设定的意义是什么??

你可能感兴趣的:(spring,thread,数据库,数据库连接池,服务器,终端)