全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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

问题背景

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

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


# java加载数据库驱动  # java加载驱动包  # Java动态加载类示例详解  # java 利用java反射机制动态加载类的简单实现  # java实现动态编译并动态加载  # java动态加载插件化编程详解  # Java 动态加载jar和class文件实例解析  # java 动态加载的实现代码  # Java反射之静态加载和动态加载的简单实例  # Java窗体动态加载磁盘文件的实现方法  # 详解Java类动态加载和热替换  # 加载  # 能满足  # 就不  # 就会  # 连接池  # 在此  # 还会  # 只需  # 这个问题  # 考虑到  # 暂时没有  # 为例  # 要将  # 一篇文章  # 大家多多  # 而能  # 不兼容  # 面前  # 在同一  # HashMap 


相关文章: Swift中switch语句区间和元组模式匹配  如何快速查询网站的真实建站时间?  详解jQuery停止动画——stop()方法的使用  独立制作一个网站多少钱,建立网站需要花多少钱?  网站制作网站,深圳做网站哪家比较好?  阿里云高弹*务器配置方案|支持分布式架构与多节点部署  Python如何创建带属性的XML节点  简历在线制作网站免费,免费下载个人简历的网站是哪些?  简单实现Android验证码  相亲简历制作网站推荐大全,新相亲大会主持人小萍萍资料?  制作充值网站的软件,做人力招聘为什么要自己交端口钱?  ,sp开头的版面叫什么?  盘锦网站制作公司,盘锦大洼有多少5G网站?  香港服务器网站测试全流程:性能评估、SEO加载与移动适配优化  建站VPS配置与SEO优化指南:关键词排名提升策略  C#怎么创建控制台应用 C# Console App项目创建方法  如何在景安服务器上快速搭建个人网站?  如何在云主机上快速搭建多站点网站?  如何在阿里云虚拟主机上快速搭建个人网站?  手机钓鱼网站怎么制作视频,怎样拦截钓鱼网站。怎么办?  香港服务器网站推广:SEO优化与外贸独立站搭建策略  网站制作报价单模板图片,小松挖机官方网站报价?  微网站制作教程,我微信里的网站怎么才能复制到浏览器里?  建站之星展会模板:智能建站与自助搭建高效解决方案  极客网站有哪些,DoNews、36氪、爱范儿、虎嗅、雷锋网、极客公园这些互联网媒体网站有什么差异?  小自动建站系统:AI智能生成+拖拽模板,多端适配一键搭建  国美网站制作流程,国美电器蒸汽鍋怎么用官方网站?  已有域名能否直接搭建网站?  如何通过cPanel快速搭建网站?  成都响应式网站开发,dw怎么把手机适应页面变成网页?  如何在Golang中引入测试模块_Golang测试包导入与使用实践  如何快速上传建站程序避免常见错误?  公司网站制作需要多少钱,找人做公司网站需要多少钱?  建站VPS推荐:2025年高性能服务器配置指南  如何选择适合PHP云建站的开源框架?  宝塔建站无法访问?如何排查配置与端口问题?  如何获取上海专业网站定制建站电话?  网站按钮制作软件,如何实现网页中按钮的自动点击?  测试制作网站有哪些,测试性取向的权威测试或者网站?  如何快速生成高效建站系统源代码?  黑客如何利用漏洞与弱口令入侵网站服务器?  如何快速建站并高效导出源代码?  制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?  公司门户网站制作公司有哪些,怎样使用wordpress制作一个企业网站?  新网站制作渠道有哪些,跪求一个无线渠道比较强的小说网站,我要发表小说?  如何设置并定期更换建站之星安全管理员密码?  建站之星各版本价格是多少?  东莞专业制作网站的公司,东莞大学生网的网址是什么?  网站制作哪家好,cc、.co、.cm哪个域名更适合做网站?  如何用y主机助手快速搭建网站? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。