在写一个ssm框架的demo中,在spring整合mybatis后开始运行时,服务器出现了一个报错:
org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.PersistenceException: ### Error querying database. Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection; nested exception is java.sql.SQLException: Connections could not be acquired from the underlying database! ### The error may exist in cn/itcast/dao/AccountDao.java (best guess) ### The error may involve cn.itcast.dao.AccountDao.findAll ### The error occurred while executing a query ### Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection; nested exception is java.sql.SQLException: Connections could not be acquired from the underlying database! org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:986) org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:870) javax.servlet.http.HttpServlet.service(HttpServlet.java:655) org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:855) javax.servlet.http.HttpServlet.service(HttpServlet.java:764) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:200) org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
错误:Connections could not be acquired from the underlying database。
看样子是不能连接数据库的错误,为了定位错误原因,我尝试使用单元测试去取数据库数据,发现单元测试可以取到数据,又用DBeaver与数据库做连接,发现DBeaver也可以连接的到本地MySQL8.0数据库。有点不明白了,百度上添加数据库url的时区和编码方式不奏效。开始分析这个Connections could not be acquired from the underlying database错误,首先,这个错误不是密码时区之类错误引起的,所以添加时区的做法并不奏效,其次,单元测试时可以拿到数据,说明url应该没问题,毕竟有方法可以连接上数据库,最后,在断点时,每当走入dao层时就会出现报错。从这些现象上看应该是项目中对数据库的配置有问题。于是开始检查与数据库连接有关的配置,检查了数据库连接池C3P0和驱动依赖jar包mysql-connector-java。C3P0是最新版本,没有问题。但是驱动依赖mysql-connector-java是5.1.6版本的,而我用的是8.0版本的数据库,是不是这个5版本的驱动与8版本的mysql不匹配呢?换用了8.0.11版本的mysql-connector-java包后,再次启动,成功拿到数据。
所以,单元测试可连接,而本地项目不可连接数据库的现象是单元测试和本地用了两套独立的配置文件造成的,如果出现类似错误时,可以检查驱动jar包和数据库版本对应情况。
(ps:偶尔用一下mysql的高版本,安装助手安装起来有点复杂了,不像以前5版本那样解压即用了。)



