最近項目中需要在配置中將數據庫密碼加密,就使用了阿里的druid來實現,將流程和問題和大家分享一下。
項目使用的是Spring加jetty,原先數據庫連接使用的是Apache的DBCP:commons-dbcp2-2.1.1.jar+ojdbc6.jar
配置:<New class="com.alibaba.druid.pool.DruidDataSource">
<Set name="driverClassName">oracle.jdbc.driver.OracleDriver</Set>
<Set name="url">jdbc:derby:memory:spring-test;create=true</Set>
<Set name="username">test123</Set>
<Set name="password">test123</Set>
<Set name="validationQuery">select 1 from dual</Set>
</New>
改成druid:druid-1.0.13.jar+ojdbc6.jar
配置:(只需將class修改為com.alibaba.druid.pool.DruidDataSource)
<New class="com.alibaba.druid.pool.DruidDataSource">
<Set name="driverClassName">oracle.jdbc.driver.OracleDriver</Set>(不配也可以,會根據url自動識別)
<Set name="url">jdbc:derby:memory:spring-test;create=true</Set>
<Set name="username">test123</Set>
<Set name="password">OkBVtGCZIhSXT7Fcg==</Set>
<Set name="filters">config</Set>
<Set name="connectionProperties">config.decrypt=true</Set>
<Set name="validationQuery">select 1 from dual</Set>
<Call name="init"/>
</New>
以上配置的解釋:其他的參數配置不詳述,重點解釋數據庫密碼加密
1.password:使用命令java -cp druid-1.0.13.jar com.alibaba.druid.filter.config.ConfigTools you_password來生成密碼
每次執行生成的密文是不一樣的
如果使用的是druid-1.0.31.jar會生成privateKey、passwordKey和publicKey,配置需改成
<Set name="password">OkBVtGCZIhSXT7Fcg==</Set><!-- 生成的passwordKey -->
<Set name="filters">config</Set>
<Set name="connectionProperties">config.decrypt=true;config.decrypt.key=DSDFGTGETGsd</Set> <!-- 生成的publicKey
-->(不改也可以,有默認)
2.filters:配置監控
3.connectionProperties:config.decrypt=true提示Druid數據源需要對數據庫密碼進行解密
4. <Call name="init"/>:必須配置這個方法。
在https://github.com/alibaba/druid/tree/master下載源碼項目導入工程中,debug源碼之后發現參數都能接收進去,但是不去執行解密的操作,一直報錯用戶名\口令無效,登錄被拒絕,加上這個方法配置之后能走通
其他相關的問題可參考https://github.com/alibaba/druid/wiki/%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98
https://github.com/alibaba/druid/wiki/%E4%BD%BF%E7%94%A8ConfigFilter
配置好之后,報錯package oracle.jdbc.driver is sealed,數據庫的包被加密,一般情況是jar包沖突。
排查了好久終於在一個war包中找到ojdbc7.jar,去除7之后,終於能正常運行了。