javax.servlet.UnavailableException

今天,我改了几个类文件上传到虚拟空间,应用自动重启不能成功。在log中报告:


2006-12-07 21:25:37,578 - Initializing application data source dataSource

org.apache.commons.dbcp.SQLNestedException: Cannot create PoolableConnectionFactory (User xyz has already more than 'max_user_connections' active connections)

at org.apache.commons.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:855)

at org.apache.commons.dbcp.BasicDataSource.setLogWriter(BasicDataSource.java:598)

at org.apache.struts.action.ActionServlet.initModuleDataSources(ActionServlet.java:808)

at org.apache.struts.action.ActionServlet.init(ActionServlet.java:335)

at javax.servlet.GenericServlet.init(GenericServlet.java:82)

at com.caucho.server.http.Application.createServlet(Application.java:3114)

at com.caucho.server.http.Application.loadServlet(Application.java:3065)

at com.caucho.server.http.Application.initServlets(Application.java:1923)

at com.caucho.server.http.Application.init(Application.java:1849)

at com.caucho.server.http.VirtualHost.startApplication(VirtualHost.java:1207)

at com.caucho.server.http.VirtualHost.getInvocation(VirtualHost.java:1007)

at com.caucho.server.http.ServletServer.getInvocation(ServletServer.java:1249)

at com.caucho.server.http.RunnerRequest.handleRequest(RunnerRequest.java:343)

at com.caucho.server.http.RunnerRequest.handleConnection(RunnerRequest.java:274)

at com.caucho.server.TcpConnection.run(TcpConnection.java:139)

at java.lang.Thread.run(Thread.java:595)

Caused by: java.sql.SQLException: User xyz has already more than 'max_user_connections' active connections

at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2928)

at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:771)

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

at com.mysql.jdbc.Connection.createNewIO(Connection.java:2558)

at com.mysql.jdbc.Connection.<init>(Connection.java:1485)

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

at org.apache.commons.dbcp.DriverConnectionFactory.createConnection(DriverConnectionFactory.java:37)

at org.apache.commons.dbcp.PoolableConnectionFactory.makeObject(PoolableConnectionFactory.java:290)

at org.apache.commons.dbcp.BasicDataSource.validateConnectionFactory(BasicDataSource.java:877)

at org.apache.commons.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:851)

... 15 more

2006-12-07 21:25:37,593 - connect fail in CallHtml.callOnePage()!

2006-12-07 21:25:37,593 - excute manager.deleteExpiredRecords() 1 times.

于是,我连接mysql查看当前活动连接数(show porcesslist;)确实达到了空间的最大活动连接数。

然后,只要一进入*.do形式的链接均在页面上报告上面相似的错误。也不知道是我上传的类文件是否触犯了Struts框架哪根神经?

上网用出现错误的关键字查了一下,其中有一篇http://mail-archives.apache.org/mod_mbox/struts-dev/200312.mbox/%3C20031204011632.14053.qmail@nagoya.betaversion.org%3E 上面的话:“Struts missing commons-dbcp and commons-pooling jar files.”启发了我。于是,我把lib中的那个:commons-pool-1.3.jar移走了。然后,我再输入*.do的链接,错误信息变了,为:


2006-12-07 22:11:07,765 - Unable to initialize Struts ActionServlet due to an unexpected exception or error thrown, so marking the servlet as unavailable.  Most likely, this is due to an incorrect or missing library dependency.

java.lang.NoClassDefFoundError: org/apache/commons/pool/impl/GenericObjectPool

at java.lang.Class.getDeclaredConstructors0(Native Method)

at java.lang.Class.privateGetDeclaredConstructors(Class.java:2328)

at java.lang.Class.getConstructor0(Class.java:2640)

at java.lang.Class.newInstance0(Class.java:321)

at java.lang.Class.newInstance(Class.java:303)

at org.apache.struts.util.RequestUtils.applicationInstance(RequestUtils.java:143)

at org.apache.struts.action.ActionServlet.initModuleDataSources(ActionServlet.java:805)

at org.apache.struts.action.ActionServlet.init(ActionServlet.java:335)

at javax.servlet.GenericServlet.init(GenericServlet.java:82)

at com.caucho.server.http.Application.createServlet(Application.java:3114)

at com.caucho.server.http.Application.loadServlet(Application.java:3065)

at com.caucho.server.http.Application.initServlets(Application.java:1923)

at com.caucho.server.http.Application.init(Application.java:1849)

at com.caucho.server.http.VirtualHost.startApplication(VirtualHost.java:1207)

at com.caucho.server.http.VirtualHost.cron(VirtualHost.java:1359)

at com.caucho.server.http.ServletServer.cron(ServletServer.java:1940)

at com.caucho.server.http.ServletServer.handleCron(ServletServer.java:1774)

at com.caucho.util.Cron$CronThread.evaluateCron(Cron.java:199)

at com.caucho.util.Cron$CronThread.run(Cron.java:163)

2006-12-07 22:11:07,812 - connect fail in CallHtml.callOnePage()!

2006-12-07 22:11:07,812 - excute manager.deleteExpiredRecords() 1 times.

看来,应用已经有反应了(先前是没有任何反应,改变类文件也没反应,log信息一点不变。我又不能手动重启位于虚拟主机上应用,因为他们还暂时不提供这个功能),于是,我再把那个commons-pool-1.3.jar加进去。然后,系统成功自动重启,log信息如下:


2006-12-07 22:12:16,187 - Enter updateCache!

2006-12-07 22:12:21,609 - connect success in CallHtml.callOnePage()!

2006-12-07 22:12:21,609 - excute manager.deleteExpiredRecords() 1 times.

我也不知道是什么原因,就这样糊里糊涂的出问题,又糊里糊涂的解决了问题:)