一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專(zhuān)注于服務(wù)器技術(shù)及軟件下載分享
分類(lèi)導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語(yǔ)言|JavaScript|易語(yǔ)言|vb.net|

服務(wù)器之家 - 編程語(yǔ)言 - Java教程 - 詳解Java動(dòng)態(tài)加載數(shù)據(jù)庫(kù)驅(qū)動(dòng)

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

2020-10-21 21:38芝加哥 Java教程

本篇文章主要介紹了詳解Java動(dòng)態(tài)加載數(shù)據(jù)庫(kù)驅(qū)動(dòng),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

問(wèn)題背景

在同一套系統(tǒng)中,要支持連接訪(fǎ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)沖突,例如,能滿(mǎn)足sqlserver2000的驅(qū)動(dòng),就不能滿(mǎn)足sqlserver2012,而能滿(mǎn)足sqlserver2012的驅(qū)動(dòng),就不能滿(mǎn)足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ì)出一篇文章專(zhuān)門(mén)講解。

DynamicLoaderService

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
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í)有所幫助,也希望大家多多支持服務(wù)器之家。

原文鏈接:http://www.tongtongxue.com/archives/5642.html?utm_source=tuicool&utm_medium=referral

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产精品对白刺激久久久 | 小仙夜晚慰自催眠mp3护士篇 | videos欧美肥婆| 欧美日韩精品乱国产538 | 女性性色生活片免费观看 | 日本人妖在线 | 男人和女人上床 | 精品午夜视频 | 人禽l交免费视频观看+视频 | 女人麻豆国产香蕉久久精品 | 婷婷综合久久中文字幕 | 天天色一色 | 欧美在线欧美 | 久久水蜜桃亚洲AV无码精品偷窥 | 亚洲免费大全 | 农村妇女野战bbxxx农村妇女 | 精品网站一区二区三区网站 | 国产欧美日韩精品在线 | 四虎成人网 | 久久这里只精品国产99re66 | 韩国三级理韩国三级理人伦 | 色多多在线视频 | 成人在线第一页 | 希岛爱理作品在线观看 | 花唇肿胀无法合拢双性 | 免费观看www视频 | 日本四虎影视 | 欧美大片一区二区 | 欧美性bbbbbxxxxxddd| 欧美一级专区免费大片 | 男人与禽交的方法 | jazz中国女人护士 | 国产精品一在线观看 | 精品国产无限资源免费观看 | 私人家庭影院5577 | 70岁多老妇人特黄a级毛片 | 欧美成人三级伦在线观看 | 欧美高清videosex极品 | 午夜十八岁禁 | 国产精品短视频 | 99精品视频一区在线观看miya |