欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解Java動態(tài)加載數(shù)據(jù)庫驅(qū)動

 更新時間:2017年05月21日 10:14:49   作者:芝加哥  
本篇文章主要介紹了詳解Java動態(tài)加載數(shù)據(jù)庫驅(qū)動,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

問題背景

在同一套系統(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)文章

  • idea使用jclasslib插件查看字節(jié)碼

    idea使用jclasslib插件查看字節(jié)碼

    這篇文章主要為大家介紹了idea使用jclasslib插件查看字節(jié)碼,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-05-05
  • springboot整合apache ftpserver詳細教程(推薦)

    springboot整合apache ftpserver詳細教程(推薦)

    這篇文章主要介紹了springboot整合apache ftpserver詳細教程,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-01-01
  • IntelliJ IDEA maven 構(gòu)建簡單springmvc項目(圖文教程)

    IntelliJ IDEA maven 構(gòu)建簡單springmvc項目(圖文教程)

    在工作當(dāng)中,我們有時需要創(chuàng)建一個全新的工程,而基于spring-mvc web的工程較為常見,這篇文章主要介紹了IntelliJ IDEA maven 構(gòu)建簡單springmvc項目(圖文教程),感興趣的小伙伴們可以參考一下
    2018-05-05
  • Java異常類型及處理詳情

    Java異常類型及處理詳情

    這篇文章主要介紹了Java異常類型及處理, 異常指的是程序在執(zhí)行過程中,出現(xiàn)了非正常情況,導(dǎo)致了java的jvm停止。感興趣的小伙伴就和小編一起來學(xué)習(xí)下面文章的具體內(nèi)容吧
    2021-09-09
  • SpringBoot中Token登錄授權(quán)、續(xù)期和主動終止的方案流程分析

    SpringBoot中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-09
  • Java使用GZIP壓縮導(dǎo)致HTTP請求返回亂碼問題解決

    Java使用GZIP壓縮導(dǎo)致HTTP請求返回亂碼問題解決

    這篇文章主要為大家介紹了Java壓縮GZIP導(dǎo)致HTTP請求返回亂碼問題解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-06-06
  • Java多線程通信問題深入了解

    Java多線程通信問題深入了解

    下面小編就為大家?guī)硪黄钊肜斫釰AVA多線程之線程間的通信方式。小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2021-07-07
  • 詳解Java中類與對象的關(guān)系

    詳解Java中類與對象的關(guān)系

    這篇文章主要介紹了詳解Java中類與對象的關(guān)系,類的關(guān)鍵字是class,在Java編程里,類的作用相當(dāng)于機械師手中的構(gòu)造圖,如果沒有構(gòu)造圖,就無法打造武器,同樣如果沒有類,就無法實例化,需要的朋友可以參考下
    2023-05-05
  • Java中操作Word修訂功能的示例詳解

    Java中操作Word修訂功能的示例詳解

    Word的修訂功能是一種在文檔中進行編輯和審閱的功能,它允許多個用戶對同一文檔進行修改并跟蹤這些修改,以便進行審查和接受或拒絕修改,下面我們就來學(xué)習(xí)一下Java中操作Word修訂功能的方法,需要的可以參考下
    2023-12-12
  • Java實現(xiàn)解析dcm醫(yī)學(xué)影像文件并提取文件信息的方法示例

    Java實現(xiàn)解析dcm醫(yī)學(xué)影像文件并提取文件信息的方法示例

    這篇文章主要介紹了Java實現(xiàn)解析dcm醫(yī)學(xué)影像文件并提取文件信息的方法,結(jié)合實例形式分析了java基于第三方庫文件針對dcm醫(yī)學(xué)影像文件的解析操作相關(guān)實現(xiàn)技巧,需要的朋友可以參考下
    2018-04-04

最新評論