欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2024-02-17 08:52:58
问题背景 在同一套系统中,要支持连接访问各种流行的数据库,以及同一数据库的不同版本,例如,oracle9i、oracle10g、oracle11g、oracle12c、s...

问题背景

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

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