天天看点

spring的beans.xml中引用jdbc.properties遇到的问题

    beans.xml中可以使用类似EL表达式的方式来获取properties文件中的内容:

<context:property-placeholder location="classpath:jdbc.properties"/>

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">

   <property name="driverClassName" value="${driverClassName}"/>

   <property name="url" value="${url}"/>

   <property name="username" value="${username}"/>

   <property name="password" value="${password}"/>

    <!-- 连接池启动时的初始值 -->

<property name="initialSize" value="${initialSize}"/>

<!-- 连接池的最大值 -->

<property name="maxActive" value="${maxActive}"/>

<!-- 最大空闲值.当经过一个高峰时间后,连接池可以慢慢将已经用不到的连接慢慢释放一部分,一直减少到maxIdle为止 -->

<property name="maxIdle" value="${maxIdle}"/>

<!--  最小空闲值.当空闲的连接数少于阀值时,连接池就会预申请去一些连接,以免洪峰来时来不及申请 -->

<property name="minIdle" value="${minIdle}"/>

  </bean>

jdbc.properties文件中:

driverClassName=org.gjt.mm.mysql.Driver

url=jdbc\:mysql\://localhost:3306/ahau?useUnicode\=true&characterEncoding\=UTF-8

username=root

password=root

initialSize=1

maxActive=500

maxIdle=2

minIdle=1

这样写看上去没有问题,我看黎活明老师关于spring2.5的视频中这样写的确没有问题,可是我在spring4.0.2中这样写就不行了。

所有的参数值都获取到了,就是username获取不到。运行时报如下错:

org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is org.apache.commons.dbcp.SQLNestedException: Cannot create PoolableConnectionFactory (Access

denied for user 'cjb'@'localhost' (using password: YES))

可以看到很明显说数据库名错了,我把${username}直接换成root就可以了。显然这没有解决问题。

我实在不明白这个cjb是从哪儿冒出来的,但肯定是跟某些地方冲突了,我也实在不知道在哪儿起的冲突。我的Mysql数据库确实有一个cjb用户。可是我在这里出现了的确很诡异。

打开spring-framework-4.0.2.RELEASE-dist\spring-framework-4.0.2.RELEASE\docs\spring-framework-reference\htmlsingle\index.html,搜索   "${"  来到这里(如图):

可以看到官方文档不是直接写username的,他知道会出问题所以在配置文件中才写成jdbc.username。文档上说了,是它检查了其他文件里的东西。可是我不明白我明明指明了jdbc.properties文件了,而且它也找到了,为什么就这个username它要换掉呢。

所以:

jdbc.properties文件中要写成

jdbc.username=root

spring配置文件里引用的时候写成${jdbc.username}。

其他属性最好也带上前缀。

不管它了,按官方文档的示例来写,问题果然解决。。。以前听老师说遇到问题了一定要去查官方文档,而且是英文版的,一直将信将疑,至于你信不信wo反正是信了。