最近有一个老项目做二开,项目使用了SSH架构,c3p0作为数据库连接池,但是项目启动的时候,tomcat会卡在下面这行代码:
Initializing connection provider: org.springframework.orm.hibernate3.LocalDataSourceConnectionProvider
很久之后,tomcat会抛出异常:
Caused by: java.sql.SQLException: Connections could not be acquired from the underlying database!
at com.mchange.v2.sql.SqlUtils.toSQLException(SqlUtils.java:106) at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutPooledConnection(C3P0PooledConnectionPool.java:529) at com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource.getConnection(AbstractPoolBackedDataSource.java:128) at org.quartz.utils.PoolingConnectionProvider.getConnection(PoolingConnectionProvider.java:247) at org.quartz.utils.DBConnectionManager.getConnection(DBConnectionManager.java:108) at org.quartz.impl.jdbcjobstore.JobStoreSupport.getConnection(JobStoreSupport.java:774) ... 23 more
在网上搜索了很久,网上的解决办法总结如下:
- 驱动配置有误;
- 数据库连接地址有误;
- 密码或帐号有误;
- 数据库未启动或无权访问;
- 重新启动mysql;
- clean tomcat,并重新发布项目;
- tomcat lib文件夹下未引入对应的数据库驱动jar包;
- 项目未引入对应的数据库驱动jar包;
其中第五点引起了我的注意,因为项目一开始用的是5.5.X版本的mysql,而我本地的环境是8.0.X,于是抱着激动的心情赶紧下载了一个对应的jar驱动包,然而结果让我失望了,还是报一样的错,而其它几点我确定配置是没有错的。
最后,在网上偶然看到有人说使用相同的配置用jdbc方式连接数据库,试试能不能连通,结果还真是连不上,报错如下:
java.sql.SQLException: The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the serverTimezone configuration property) to use a more specifc time zone value if you want to utilize time zone support.
com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:127)
com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:95)
com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:87)
com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:61)
com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:71)
com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:76)
com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:862)
com.mysql.cj.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:444)
com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:230)
com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:226)
com.mchange.v2.c3p0.DriverManagerDataSource.getConnection(DriverManagerDataSource.java:175)
com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:220)
com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:206)
com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1PooledConnectionResourcePoolManager.acquireResource(C3P0PooledConnectionPool.java:203)
com.mchange.v2.resourcepool.BasicResourcePool.doAcquire(BasicResourcePool.java:1138)
com.mchange.v2.resourcepool.BasicResourcePool.doAcquireAndDecrementPendingAcquiresWithinLockOnSuccess(BasicResourcePool.java:1125)
com.mchange.v2.resourcepool.BasicResourcePool.access$700(BasicResourcePool.java:44)
com.mchange.v2.resourcepool.BasicResourcePool$ScatteredAcquireTask.run(BasicResourcePool.java:1870)
com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:696)
mysql时区错误.....解决办法如下:
show variables like '%time_zone%';
set global time_zone='+8:00';
在命令行进入mysql后,执行以上sql语句,然后再启动项目,项目果然能正常运行了!!
另外,执行以上并不能实际解决问题,因为每次重启mysql的话,都需要重新设置时区,下面是一劳永逸的办法:
在url中拼接:&serverTimezone=Asia/Shanghai。
大功告成!!!
记录本次解决错误的过程,希望能帮助到有需要的人....解决这个错误的过程真是太痛苦了....