天天看点

c3p0数据库连接池无法连接数据库—错误使用了username关键字一、问题描述二、解决过程三、总结

一、问题描述

上篇博客说到了关于maven无法下载依赖jar包的问题,这篇博客再说一下关于在本个项目中遇到的关于使用C3P0连接池连接数据库的问题,真心很奇葩,在此,也请大家引起注意。首先看我的项目基本结构:

c3p0数据库连接池无法连接数据库—错误使用了username关键字一、问题描述二、解决过程三、总结

已确定的情况:相关jar包均已正确下载,路径跳转正常,jdbc所配置的内容,完全正确。相关数据库连接池和spring的整合也都完全正确,但事实就是没法儿连接上!

解决了几个拼写错误,小的属性配置错误后,仍是连接失败,报错最多的就是:

1,Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is java.sql.SQLException: Connections could not be acquired from the underlying database!

2,com.mchange.v2.resourcepool.CannotAcquireResourceException: A ResourcePool could not acquire a resource from its primary factory or source.

和另外一个刚开始没看明白的,事实上提示很清楚的错误:

java.sql.SQLException: Access denied for user 'AngelHHX'@'localhost' (using password: YES)

二、解决过程

2.1,找工具的原因

从网上查的无法连接的解决办法是:开放MySQL的权限,让当前用户获取访问权限;修改密码;重装数据库;可能没有下载MySQL的驱动。经过一一排查,都尝试了一遍,就差重装数据库了。

这时候,查看了之前用的关于c3p0数据库连接池的用法,也用可视化工具连接了自己 的数据库,确定从理论上都没有任何问题,所以,就感觉是不是这个版本的c3p0连接池出问题了,所以给换了之前也用过的Druid,结果还是报一样的错,这时候就明显感觉到不是连接池的原因了,为了解决最初的问题,又给换回了c3p0.

2.2,找代码的原因

等到确立了连接池和数据库都没有问题后,就从jdbc.properties文件里面找问题,于是写了段代码,直接用jdbc拿着文件里面的用户名、密码、驱动、数据库连接地址进行数据库操作测试,结果是正常的。也就是说jdbc.properties文件里面的变量赋值也都完全正确。

2.3,找工具与工具之间结合的原因

因为再一次确定变量的值都没有问题,那么就开始查看spring和数据库连接池的配置文件,首先是检查jdbc.properties的文件路径,正确! 然后再是检查了相应的数据库连接池的属性配置(不同的数据库连接池,属性可能不一样,就像c3p0用jdbcUrl,而Druid用url)结果都能对上。最后检查从jdbc.properties里面取值是否正确,也依然正确。这时候问题就好像往奇葩和无解的路上,又走了一步。

因为再三检查各地配置,而直接用jdbc连接是正常的,所以问题还是被定位到了配置文件从jdbc.properties文件取变量值的这一步。于是,先不用变量,直接把值赋到配置文件,经过测试,成功。问题进一步明确,绝对是出在了变量取值的过程中,所以一个一个变量进行测试,最终确定是数据库连接用户名username的变量出了问题。

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/XXXXX
username=root
password=XXXXX
           
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">  
   <property name="driverClass" value="${driver}" />  
   <property name="jdbcUrl" value="${url}" />  
   <property name="user" value="${username}" />  
   <property name="password" value="${password}" /> 
           

又回到最开始系统报错的提示上:java.sql.SQLException: Access denied for user 'AngelHHX'@'localhost' (using password: YES)  我当时还想,这个AngelHHX用户名是什么意思,从哪儿来的,这不是我的电脑用户名吗,怎么跑到这里来了。  但问题也就出在了这里,当我在jdbc.properties用username变量名称的时候,它根本没有被我指定的root赋值,而是获取了我本地电脑用户名,进一步导致程序出错。当我把这个变量名称换成别的任何规范名称后,无问题!

2.4,找电脑默认语言的原因

经过了第三步,我已经确认那个username可能是用到电脑的关键字了,我一想到我的默认语言是英语,然后这是不是有影响呢?(因为我看别人用username当变量,貌似没有出问题)于是,我将系统默认语言改回了中文。测试,仍然报错,也肯定了一个事实:跟我系统的默认语言没有关系

到此,很费解别人那个代码上的username,究竟是怎么运行通过的,也或者他们也没有通过,嘎嘎嘎嘎嘎。。。。。。。。

三、总结

问题解决了,但是从解决这个问题的过程中,发现了自己很多有待提升的地方。审视我最近解决项目问题的步骤和思路,很明显的发现,我这逻辑和步骤都不是那么快、准、狠。这可能是和我对程序运行的基本步骤不甚了解有关,也可能是和我自己看问题的全局观有关。不管怎样,我感觉我接下来要做的一件大事,就是去分析我解决每一个问题的惯用思维和效率。