因項目需要能動態修改數據源的配置,及修改后不用重啟整個應用。使用的數據源是apache的BasicDataSource,網上千篇一律的是如下實現:
BasicDataSource bds=getDataSource();
try{
bds.close();
}
catch(Exception e){
e.printStackTrace();
}
bds.setUsername("sa");
bds.setPassword("admin");
還說要先關閉,再修改配置才能生效。
這樣的代碼根本就實現不了所說的功能,直接運行出錯。連接池關閉后,就無法使用了。本身也沒有open,reopen之類的方法。
也有說C3P0支持熱修改,但本身好像有bug,容易出錯死鎖錯誤。也就沒有去研究到底支持不。
BasicDataSource 的close方法其實只設置了一個標識變量:closed,標記為關閉就取不到連接,要是能修改該標識為非關閉,就可以繼續使用了。
所以實現的思路是:先關閉,再修改配置,再打開標識。問題是BasicDataSource並沒有這樣的接口提供出來,幸運的是,BasicDataSource中的
closed屬性是protected,也就是我們可以在子類中訪問到這個屬性,也就可以進行修改了。
所以只要自定義一個類繼承於BasicDataSource,提供如下方法即可:
public void open(){
this.closed=false;
}
當然配置文件中使用的數據源的類名就需要改為這個自定義類了。
說明:文章為作者從CSDN遷移過來
