zoukankan      html  css  js  c++  java
  • c3p0数据库连接池无法连接数据库—错误使用了username关键字

    一、问题描述

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

    已确定的情况:相关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,究竟是怎么运行通过的,也或者他们也没有通过,嘎嘎嘎嘎嘎。。。。。。。。

    三、总结

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


  • 相关阅读:
    桟错误分析方法
    gstreamer调试命令
    sqlite的事务和锁,很透彻的讲解 【转】
    严重: Exception starting filter struts2 java.lang.NullPointerException (转载)
    eclipse 快捷键
    POJ 1099 Square Ice
    HDU 1013 Digital Roots
    HDU 1087 Super Jumping! Jumping! Jumping!(动态规划)
    HDU 1159 Common Subsequence
    HDU 1069 Monkey and Banana(动态规划)
  • 原文地址:https://www.cnblogs.com/hhx626/p/7534605.html
Copyright © 2011-2022 走看看