問(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