詳解Java動態(tài)加載數(shù)據(jù)庫驅(qū)動
問題背景
在同一套系統(tǒng)中,要支持連接訪問各種流行的數(shù)據(jù)庫,以及同一數(shù)據(jù)庫的不同版本,例如,oracle9i、oracle10g、oracle11g、oracle12c、sqlserver2000、sqlserver2005、sqlserver2008、sqlserver2012等,其中就會碰到一些問題,就是不同的數(shù)據(jù)庫,數(shù)據(jù)庫驅(qū)動肯定不同,對于這個問題到好解決,只需要將相應(yīng)的驅(qū)動加入即可;然而對于同種數(shù)據(jù)庫,不同版本時,而且不同版本的數(shù)據(jù)庫驅(qū)動不僅不兼容,同時存在還會出現(xiàn)沖突,例如,能滿足sqlserver2000的驅(qū)動,就不能滿足sqlserver2012,而能滿足sqlserver2012的驅(qū)動,就不能滿足sqlserver2000。對于這種問題,面前能想到的解決方案就是動態(tài)加載數(shù)據(jù)庫驅(qū)動,當(dāng)用到某種數(shù)據(jù)庫時,就加載其對應(yīng)的數(shù)據(jù)庫驅(qū)動。
代碼實現(xiàn)
在此只例出核心代碼,就是動態(tài)加載數(shù)據(jù)庫驅(qū)動的類,只是此處暫時沒有考慮到數(shù)據(jù)庫連接池的問題,當(dāng)選擇動態(tài)加載數(shù)據(jù)庫驅(qū)動時,數(shù)據(jù)庫連接池需要自己實現(xiàn),對于數(shù)據(jù)庫池的實現(xiàn),后續(xù)會出一篇文章專門講解。
DynamicLoaderService
package com.tongtongxue.dynamic.service.impl; import java.net.URL; import java.net.URLClassLoader; import java.sql.Connection; import java.sql.Driver; import java.sql.DriverManager; import java.util.HashMap; import java.util.Map; import java.util.Properties; import javax.annotation.PostConstruct; import org.springframework.stereotype.Service; import com.tongtongxue.dynamic.model.DataSourceInfo; import com.tongtongxue.dynamic.service.IDynamicLoaderService; /** * 動態(tài)加載JDBC數(shù)據(jù)庫驅(qū)動服務(wù)類 * * @author lzj * */ @Service public class DynamicLoaderService implements IDynamicLoaderService { // 保存數(shù)據(jù)庫連接信息 private Map>String, DataSourceInfo< dataSourceInfos = null; // 保存數(shù)據(jù)庫相應(yīng)驅(qū)動JAR的路徑 private Map>String, String< paths = null; // 緩存對應(yīng)的Driver對象 private Map>String, Driver< drivers = null; private URLClassLoader classLoader; /** * 初始化方法 * * @throws Exception */ @PostConstruct public void init() throws Exception { dataSourceInfos = new HashMap>String, DataSourceInfo<(); // 此處只已oracle9和oracle12為例,其它數(shù)據(jù)庫信息同理的方式增加即可 DataSourceInfo oracle9Info = new DataSourceInfo(); oracle9Info.setDriver("oracle.jdbc.driver.OracleDriver"); oracle9Info.setUrl("jdbc:oracle:thin:@192.168.0.101:1521:ORACLE"); oracle9Info.setUsername("system"); oracle9Info.setPassword("system"); dataSourceInfos.put("oracle9", oracle9Info); DataSourceInfo oracle12Info = new DataSourceInfo(); oracle12Info.setDriver("oracle.jdbc.driver.OracleDriver"); oracle12Info.setUrl("jdbc:oracle:thin:@192.168.0.102:1521:orcl"); oracle12Info.setUsername("system"); oracle12Info.setPassword("system"); dataSourceInfos.put("oracle12", oracle12Info); // 將數(shù)據(jù)庫對應(yīng)驅(qū)動jar放置容器中 paths = new HashMap>String, String<(); paths.put("oracle9", "/driver/ojdbc14.jar"); paths.put("oracle12", "/driver/ojdbc7.jar"); // 初始化drivers drivers = new HashMap>String, Driver<(); } @Override public Connection getConnection(String dbType) throws Exception { Connection conn = null; Driver driver = drivers.get(dbType); DataSourceInfo dataSourceInfo = dataSourceInfos.get(dbType); if (driver == null) { URL jarUrl = this.getClass().getResource(paths.get(dbType)); classLoader = new URLClassLoader(new URL[]{jarUrl}); Class>?< driverClass = classLoader.loadClass(dataSourceInfo.getDriver()); driver = (Driver) driverClass.newInstance(); drivers.put(dbType, driver); } // 注冊驅(qū)動 DriverManager.registerDriver(driver); Properties properties = new Properties(); properties.put("user", dataSourceInfo.getUsername()); properties.put("password", dataSourceInfo.getPassword()); conn = DriverManager.getConnection(dataSourceInfo.getUrl(), properties); // 卸載驅(qū)動 DriverManager.deregisterDriver(driver); return conn; } }
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
springboot整合apache ftpserver詳細教程(推薦)
這篇文章主要介紹了springboot整合apache ftpserver詳細教程,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2020-01-01IntelliJ IDEA maven 構(gòu)建簡單springmvc項目(圖文教程)
在工作當(dāng)中,我們有時需要創(chuàng)建一個全新的工程,而基于spring-mvc web的工程較為常見,這篇文章主要介紹了IntelliJ IDEA maven 構(gòu)建簡單springmvc項目(圖文教程),感興趣的小伙伴們可以參考一下2018-05-05SpringBoot中Token登錄授權(quán)、續(xù)期和主動終止的方案流程分析
SpringBoot項目中,基于Token的登錄授權(quán)方案主要有兩種:利用Session/Cookie和JWT,Cookie/Session方案有狀態(tài),不適合分布式架構(gòu),而JWT雖無狀態(tài),但存在過期時間不可強制失效、一次性等缺點,本文介紹SpringBoot中Token登錄授權(quán)、續(xù)期和主動終止的方案,感興趣的朋友一起看看吧2024-09-09Java使用GZIP壓縮導(dǎo)致HTTP請求返回亂碼問題解決
這篇文章主要為大家介紹了Java壓縮GZIP導(dǎo)致HTTP請求返回亂碼問題解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-06-06Java實現(xiàn)解析dcm醫(yī)學(xué)影像文件并提取文件信息的方法示例
這篇文章主要介紹了Java實現(xiàn)解析dcm醫(yī)學(xué)影像文件并提取文件信息的方法,結(jié)合實例形式分析了java基于第三方庫文件針對dcm醫(yī)學(xué)影像文件的解析操作相關(guān)實現(xiàn)技巧,需要的朋友可以參考下2018-04-04