轉載自劉茫茫看山
問題背景
某天我們的租戶反饋數據庫連接缺少必要的驅動,我們通過日志查看確實是缺少部分數據庫的驅動,因為DolphinScheduler默認只帶了Oracle和MySQL的驅動,并且需要將pom文件中的test模式去掉才可以在打包的時候引入。我們的任務量比較大,在3.0存在容錯機制的情況下,重啟Master和Worker時,任務會重復容錯多次,對用戶使用很不友好,對Yarn集群的壓力也比較大,所以非必要不會重啟服務,這就需要在不重啟的前提下加載新的驅動包。
遇到的問題
當開始做的時候,想的過于簡單,下面是Worker模塊下的啟動命令,libs目錄后面加載的是*,所以我們認為程序肯定會自動加載jar。
但是當我們將jar放到對應的目錄后,重啟測試數據庫連接,發現還是報了和之前一樣的問題。
Could not load driverClass oracle.jdbc.driver.OracleDriver
我們需要了解java.class.path為什么沒有將我們新添加的驅動包加載進去,于是我們找出了worker服務的進程id,并通過jinfo命令查看類路徑的加載情況,發現java.calss.path
對應的目錄從*變成了jar包的絕對路徑,我們新添加的jar的絕對路徑沒有在里面,所以不會讀取驅動。
解決方法
我們最熟悉的類加載模式就是雙親委派機制,在類加載模式中存在一個ExtensioinClassloader
類,它是java.lang.ClassLoader
的子類,該類加載器負責加載Java的擴展庫JAVA_HOME/jre/lib/ext/*.jar
或者java.ext.dirs
路徑下的內容。
我們通過jinfo命令查看進程中的擴展目錄,發現java.ext.dirs
對應的值不是絕對路徑,也就表示我們可以嘗試通過將額外的驅動jar包放到擴展目錄中加載。
這里以Oracle驅動為例,通過將Oracle驅動jar放到對應的擴展目錄中,測試數據源連接情況,連接成功,希望可以給有需要的小伙伴提供有價值的參考。
本文由 白鯨開源科技 提供發布支持!