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

时间:2021-05-19

问题背景

在同一套系统中,要支持连接访问各种流行的数据库,以及同一数据库的不同版本,例如,oracle9i、oracle10g、oracle11g、oracle12c、sqlserver2000、sqlserver2005、sqlserver2008、sqlserver2012等,其中就会碰到一些问题,就是不同的数据库,数据库驱动肯定不同,对于这个问题到好解决,只需要将相应的驱动加入即可;然而对于同种数据库,不同版本时,而且不同版本的数据库驱动不仅不兼容,同时存在还会出现冲突,例如,能满足sqlserver2000的驱动,就不能满足sqlserver2012,而能满足sqlserver2012的驱动,就不能满足sqlserver2000。对于这种问题,面前能想到的解决方案就是动态加载数据库驱动,当用到某种数据库时,就加载其对应的数据库驱动。

代码实现

在此只例出核心代码,就是动态加载数据库驱动的类,只是此处暂时没有考虑到数据库连接池的问题,当选择动态加载数据库驱动时,数据库连接池需要自己实现,对于数据库池的实现,后续会出一篇文章专门讲解。

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;/** * 动态加载JDBC数据库驱动服务类 * * @author lzj * */@Servicepublic 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; }}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。

相关文章