0

我目前正在研究一個運行Java 6應用程序的問題,當第一次啓動時,會創建一個BasicDataSource,它在第一次創建時會存儲創建到數據庫的連接所需的所有必要信息,如下所示:當數據庫密碼更改時,Java BasicDataSource如何創建與數據庫的新連接?

DS.setUserName(username); 
DS.setPassword(password); 
DS.setUrl(url); 
DS.setMinIdle(minIdle); 
. 
. 
. 

然後使用set屬性創建一個到數據庫的連接池。該BasicDataSource然後存儲在Map,然後每次需要像這樣的時間返回給調用的方法:

if (dataSources.contains(databaseDS)) { 
    return dataSources.get(databaseDS.getConnection()); 
} 

我的理解是,BasicDataSource的連接池具有對數據庫不要活連接「 t要求使用密碼登錄到數據庫,而是該連接已經建立了與數據庫建立的會話。這些連接將返回到調用方法,不需要使用數據庫重新進行身份驗證。

但是,當數據庫密碼更新並且需要/產生新連接時,BasicDataSource如何創建該連接?它是否嘗試使用存儲在BasicDataSource中的密碼進行數據庫驗證以獲得新連接?

謝謝

+0

您已將數據庫憑據存儲在某處並將它們傳遞給BasicDataSource。如果數據庫服務器端的憑證已更改,則需要更改客戶端應用程序中的憑證。至少你必須用新的證書重新啓動你的應用程序。 –

+0

@RobertMoskal感謝您的快速回復。這是否意味着BasicDataSource在嘗試產生新的數據庫連接時會嘗試發送舊密碼並導致運行時異常,因爲數據庫將返回登錄失敗? – Mark

+0

我編輯了我原來的帖子並添加了一些更多的細節。我之前忘記提到密碼存儲在'BasicDataSource'對象本身 – Mark

回答

0

所以最後,我最終決定從池中同步連接的拉動。當我們斷開連接並且BasicDataSource需要再次驗證新連接時,我們將創建到數據庫的新連接。但是,當密碼發生變化時,我們會向數據庫收到驗證錯誤,然後我會從中刪除BasicDataSourceDataSource。之後,我用新密碼創建一個新的BasicDataSource

原因同步(如果這是沒有意義可能有人拍一些感覺入我?)是爲了讓沒有身份驗證數據庫中只會發生一次,所以我們最終不會想太多次命中數據庫密碼錯誤。之前的連接會變得陳舊,最終會被清理乾淨,然後對象應該被垃圾收集。