天天看點

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反正是信了。