异常:严重: Servlet.service() for servlet [jsp] in context with path [/OS_Website] threw exception [javax.servlet.ServletException: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Data source rejected establishment of connection,  message from server: "Too many connections"] with root cause 

 com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Data source rejected establishment of connection,  message from server: "Too many connections" 

     at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 

     at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) 

     at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) 

     at java.lang.reflect.Constructor.newInstance(Constructor.java:513) 

     at com.mysql.jdbc.Util.handleNewInstance(Util.java:409) 

     at com.mysql.jdbc.Util.getInstance(Util.java:384) 

     at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1015) 

     at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:989) 

     at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:984) 

     at com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1105) 

     at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2186) 

     at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:787) 

     at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:49) 

     at sun.reflect.GeneratedConstructorAccessor15.newInstance(Unknown Source) 

     at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) 

     at java.lang.reflect.Constructor.newInstance(Constructor.java:513) 

     at com.mysql.jdbc.Util.handleNewInstance(Util.java:409) 

     at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:357) 

     at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:285) 

     at java.sql.DriverManager.getConnection(DriverManager.java:582) 

     at java.sql.DriverManager.getConnection(DriverManager.java:185) 

     at ch.os.dbc.DatabaseConnection.<init>(DatabaseConnection.java:16) 

     at ch.os.dao.impl.NewsDAOImpl.<init>(NewsDAOImpl.java:21) 

     at ch.os.factory.NewsDAOFactory.getINewsDAOInstance(NewsDAOFactory.java:8) 

     at org.apache.jsp.news_jsp._jspService(news_jsp.java:219) 

     at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70) 

     at javax.servlet.http.HttpServlet.service(HttpServlet.java:727) 

     at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:432) 

     at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390) 

     at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334) 

     at javax.servlet.http.HttpServlet.service(HttpServlet.java:727) 

     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) 

     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 

     at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220) 

     at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122) 

     at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501) 

     at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170) 

     at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98) 

     at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950) 

     at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116) 

     at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408) 

     at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1040) 

     at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:607) 

     at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:313) 

     at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) 

     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) 
    at java.lang.Thread.run(Thread.java:619)

最近网站出现 User 数据库名称 has already more than 'max_user_connections' active connections 的报错,网站瘫痪。有必要研究下这个问题。


max_user_connections 是 MySQL 用户连接数的最大值设置,整段语句的意思是:服务器的 MySQL 的最大连接数参数设置不足。解决方法:修改 MySQL 安装目录下 my.ini 或者 my.cnf 文件内的 max_user_connections 参数的数值,重启 MySQL 服务器。


但是正常来说,MySQL默认的100个连接数是足够的。我们需要从程序上去考虑。MySQL的默认最大连接数为100(N),实际给普通用户使用只有N-1个,保留一个连接是留给超级管理员使用的,防止连接占满了不会把管理员也踢出来。很多网站在运行的时候都会出现连接数受限现象,我认为十之八九并非是网站的真实访问量太大导致连接数超标,更多是因为我们在设计网站程序的时候采用了不合理的设计架构或数据结构引起的。非正常连接超限可能原因如下(天缘即时归纳未必完整或无错讹仅供参考):

  1. 类似人数、在线时间、浏览数等统计功能与主程序数据库同属一个数据空间时就很容易出现。
  2. 复杂的动态页尤其是用户每次浏览都涉及到多数据库或多表操作时候也很容易出现。
  3. 还有就是程序设计的不合理(比如复杂运算、等待等操作放置在数据库交互行为中间进行),或者程序存在释放BUG。
  4. 计算机硬件配置太低却安装太高版、太高配置的MySQL。
  5. 未采用缓存技术。
  6. 数据库未经过优化或表格设计及其复杂。

等等一些原因,都会延长数据库的数据交互时间或增加交互次数。所以,如果大家遇到这类问题,首先要考虑程序是否存在BUG导致连接释放失败,再次就是考虑优化软硬件。当然修改MySQL连接数也是软件优化的操作方法之一,希望大家都能够本着学习的态度通过研究一下自身的原因从而解决这一问题。如果实在是找不到原因,那就只好先修改连接数,暂缓定位真实原因了。