详解Java动态加载数据库驱动
问题背景
在同一套系统中,要支持连接访问各种流行的数据库,以及同一数据库的不同版本,例如,oracle9i、oracle10g、oracle11g、oracle12c、sqlserver2000、sqlserver2005、sqlserver2008、sqlserver2012等,其中就会碰到一些问题,就是不同的数据库,数据库驱动肯定不同,对于这个问题到好解决,只需要将相应的驱动加入即可;然而对于同种数据库,不同版本时,而且不同版本的数据库驱动不仅不兼容,同时存在还会出现冲突,例如,能满足sqlserver2000的驱动,就不能满足sqlserver2012,而能满足sqlserver2012的驱动,就不能满足sqlserver2000。对于这种问题,面前能想到的解决方案就是动态加载数据库驱动,当用到某种数据库时,就加载其对应的数据库驱动。
代码实现
在此只例出核心代码,就是动态加载数据库驱动的类,只是此处暂时没有考虑到数据库连接池的问题,当选择动态加载数据库驱动时,数据库连接池需要自己实现,对于数据库池的实现,后续会出一篇文章专门讲解。
DynamicLoaderService
packagecom.tongtongxue.dynamic.service.impl;
importjava.net.URL;
importjava.net.URLClassLoader;
importjava.sql.Connection;
importjava.sql.Driver;
importjava.sql.DriverManager;
importjava.util.HashMap;
importjava.util.Map;
importjava.util.Properties;
importjavax.annotation.PostConstruct;
importorg.springframework.stereotype.Service;
importcom.tongtongxue.dynamic.model.DataSourceInfo;
importcom.tongtongxue.dynamic.service.IDynamicLoaderService;
/**
*动态加载JDBC数据库驱动服务类
*
*@authorlzj
*
*/
@Service
publicclassDynamicLoaderServiceimplementsIDynamicLoaderService{
//保存数据库连接信息
privateMap>String,DataSourceInfoString,StringString,DriverString,DataSourceInfo<();
//此处只已oracle9和oracle12为例,其它数据库信息同理的方式增加即可
DataSourceInfooracle9Info=newDataSourceInfo();
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);
DataSourceInfooracle12Info=newDataSourceInfo();
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=newHashMap>String,String<();
paths.put("oracle9","/driver/ojdbc14.jar");
paths.put("oracle12","/driver/ojdbc7.jar");
//初始化drivers
drivers=newHashMap>String,Driver<();
}
@Override
publicConnectiongetConnection(StringdbType)throwsException{
Connectionconn=null;
Driverdriver=drivers.get(dbType);
DataSourceInfodataSourceInfo=dataSourceInfos.get(dbType);
if(driver==null){
URLjarUrl=this.getClass().getResource(paths.get(dbType));
classLoader=newURLClassLoader(newURL[]{jarUrl});
Class>?
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。