详解Java动态加载数据库驱动

2025-05-29 0 89

问题背景

在同一套系统中,要支持连接访问各种流行的数据库,以及同一数据库的不同版本,例如,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

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 建站教程 详解Java动态加载数据库驱动 https://www.kuaiidc.com/116592.html

相关文章

发表评论
暂无评论