问题背景
在同一套系统中,要支持连接访问各种流行的数据库,以及同一数据库的不同版本,例如,oracle9i、oracle10g、oracle11g、oracle12c、sqlserver2000、sqlserver2005、sqlserver2008、sqlserver2012等,其中就会碰到一些问题,就是不同的数据库,数据库驱动肯定不同,对于这个问题到好解决,只需要将相应的驱动加入即可;然而对于同种数据库,不同版本时,而且不同版本的数据库驱动不仅不兼容,同时存在还会出现冲突,例如,能满足sqlserver2000的驱动,就不能满足sqlserver2012,而能满足sqlserver2012的驱动,就不能满足sqlserver2000。对于这种问题,面前能想到的解决方案就是动态加载数据库驱动,当用到某种数据库时,就加载其对应的数据库驱动。
代码实现
在此只例出核心代码,就是动态加载数据库驱动的类,只是此处暂时没有考虑到数据库连接池的问题,当选择动态加载数据库驱动时,数据库连接池需要自己实现,对于数据库池的实现,后续会出一篇文章专门讲解。
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;
/**
* 动态加载JDBC数据库驱动服务类
*
* @author lzj
*
*/
@Service
public class DynamicLoaderService implements IDynamicLoaderService {
// 保存数据库连接信息
private Map>String, DataSourceInfo< dataSourceInfos = null ;
// 保存数据库相应驱动JAR的路径
private Map>String, String< paths = null ;
// 缓存对应的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为例,其它数据库信息同理的方式增加即可
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);
// 将数据库对应驱动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);
}
// 注册驱动
DriverManager.registerDriver(driver);
Properties properties = new Properties();
properties.put( "user" , dataSourceInfo.getUsername());
properties.put( "password" , dataSourceInfo.getPassword());
conn = DriverManager.getConnection(dataSourceInfo.getUrl(), properties);
// 卸载驱动
DriverManager.deregisterDriver(driver);
return conn;
}
}
|
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持快网idc。
原文链接:http://www.tongtongxue.com/archives/5642.html?utm_source=tuicool&utm_medium=referral
相关文章
猜你喜欢
- ASP.NET自助建站系统中的用户注册和登录功能定制方法 2025-06-10
- ASP.NET自助建站系统的域名绑定与解析教程 2025-06-10
- 个人服务器网站搭建:如何选择合适的服务器提供商? 2025-06-10
- ASP.NET自助建站系统中如何实现多语言支持? 2025-06-10
- 64M VPS建站:如何选择最适合的网站建设平台? 2025-06-10
TA的动态
- 2025-07-10 怎样使用阿里云的安全工具进行服务器漏洞扫描和修复?
- 2025-07-10 怎样使用命令行工具优化Linux云服务器的Ping性能?
- 2025-07-10 怎样使用Xshell连接华为云服务器,实现高效远程管理?
- 2025-07-10 怎样利用云服务器D盘搭建稳定、高效的网站托管环境?
- 2025-07-10 怎样使用阿里云的安全组功能来增强服务器防火墙的安全性?
快网idc优惠网
QQ交流群
您的支持,是我们最大的动力!
热门文章
-
2025-05-25 67
-
2025-05-29 31
-
2025-06-04 93
-
2025-06-04 17
-
win10卸载xbox game bar(如何卸载xbox游戏)
2025-05-25 44
热门评论