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

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

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

問(wèn)題背景

在同一套系統(tǒng)中,要支持連接訪問(wèn)各種流行的數(shù)據(jù)庫(kù),以及同一數(shù)據(jù)庫(kù)的不同版本,例如,oracle9i、oracle10g、oracle11g、oracle12c、sqlserver2000、sqlserver2005、sqlserver2008、sqlserver2012等,其中就會(huì)碰到一些問(wèn)題,就是不同的數(shù)據(jù)庫(kù),數(shù)據(jù)庫(kù)驅(qū)動(dòng)肯定不同,對(duì)于這個(gè)問(wèn)題到好解決,只需要將相應(yīng)的驅(qū)動(dòng)加入即可;然而對(duì)于同種數(shù)據(jù)庫(kù),不同版本時(shí),而且不同版本的數(shù)據(jù)庫(kù)驅(qū)動(dòng)不僅不兼容,同時(shí)存在還會(huì)出現(xiàn)沖突,例如,能滿足sqlserver2000的驅(qū)動(dòng),就不能滿足sqlserver2012,而能滿足sqlserver2012的驅(qū)動(dòng),就不能滿足sqlserver2000。對(duì)于這種問(wèn)題,面前能想到的解決方案就是動(dòng)態(tài)加載數(shù)據(jù)庫(kù)驅(qū)動(dòng),當(dāng)用到某種數(shù)據(jù)庫(kù)時(shí),就加載其對(duì)應(yīng)的數(shù)據(jù)庫(kù)驅(qū)動(dòng)。

代碼實(shí)現(xiàn)

在此只例出核心代碼,就是動(dòng)態(tài)加載數(shù)據(jù)庫(kù)驅(qū)動(dòng)的類(lèi),只是此處暫時(shí)沒(méi)有考慮到數(shù)據(jù)庫(kù)連接池的問(wèn)題,當(dāng)選擇動(dòng)態(tài)加載數(shù)據(jù)庫(kù)驅(qū)動(dòng)時(shí),數(shù)據(jù)庫(kù)連接池需要自己實(shí)現(xiàn),對(duì)于數(shù)據(jù)庫(kù)池的實(shí)現(xiàn),后續(xù)會(huì)出一篇文章專門(mén)講解。

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;

/**
 * 動(dòng)態(tài)加載JDBC數(shù)據(jù)庫(kù)驅(qū)動(dòng)服務(wù)類(lèi)
 * 
 * @author lzj
 *
 */
@Service
public class DynamicLoaderService implements IDynamicLoaderService {
 // 保存數(shù)據(jù)庫(kù)連接信息
 private Map>String, DataSourceInfo< dataSourceInfos = null;
 
 // 保存數(shù)據(jù)庫(kù)相應(yīng)驅(qū)動(dòng)JAR的路徑
 private Map>String, String< paths = null;

 // 緩存對(duì)應(yīng)的Driver對(duì)象
 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ù)庫(kù)信息同理的方式增加即可
   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ù)庫(kù)對(duì)應(yīng)驅(qū)動(dòng)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);
 }

 // 注冊(cè)驅(qū)動(dòng)
 DriverManager.registerDriver(driver);
 Properties properties = new Properties();
 properties.put("user", dataSourceInfo.getUsername());
   properties.put("password", dataSourceInfo.getPassword());
 
   conn = DriverManager.getConnection(dataSourceInfo.getUrl(), properties);
   // 卸載驅(qū)動(dòng)
   DriverManager.deregisterDriver(driver);
   
 return conn;
 }
}

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

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

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

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

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

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

    IntelliJ IDEA maven 構(gòu)建簡(jiǎn)單springmvc項(xiàng)目(圖文教程)

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

    Java異常類(lèi)型及處理詳情

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

    SpringBoot中Token登錄授權(quán)、續(xù)期和主動(dòng)終止的方案流程分析

    SpringBoot項(xiàng)目中,基于Token的登錄授權(quán)方案主要有兩種:利用Session/Cookie和JWT,Cookie/Session方案有狀態(tài),不適合分布式架構(gòu),而JWT雖無(wú)狀態(tài),但存在過(guò)期時(shí)間不可強(qiáng)制失效、一次性等缺點(diǎn),本文介紹SpringBoot中Token登錄授權(quán)、續(xù)期和主動(dòng)終止的方案,感興趣的朋友一起看看吧
    2024-09-09
  • Java使用GZIP壓縮導(dǎo)致HTTP請(qǐng)求返回亂碼問(wèn)題解決

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

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

    Java多線程通信問(wèn)題深入了解

    下面小編就為大家?guī)?lái)一篇深入理解JAVA多線程之線程間的通信方式。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2021-07-07
  • 詳解Java中類(lèi)與對(duì)象的關(guān)系

    詳解Java中類(lèi)與對(duì)象的關(guān)系

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

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

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

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

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

最新評(píng)論