• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >Java > 详解Java动态加载数据库驱动

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

作者:芝加哥 字体:[增加 减小] 来源:互联网 时间:2017-05-28

芝加哥 通过本文主要向大家介绍了java数据库详解,java数据库技术详解,java动态代理详解,java泛型详解,java集合类详解等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

问题背景

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

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

</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

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

相关文章

  • 2017-05-28Mybatis中 SQL语句复用
  • 2017-05-28Java实现一个简单的缓存方法
  • 2017-05-28详解利用Spring的AbstractRoutingDataSource解决多数据源的问题
  • 2017-05-28Java中多线程同步类 CountDownLatch
  • 2017-05-28SWT(JFace)体验之ApplicationWindow
  • 2017-05-28Java 可视化垃圾回收_动力节点Java学院整理
  • 2017-05-28java 算法之希尔排序详解及实现代码
  • 2017-05-28spring使用RedisTemplate的操作类访问Redis
  • 2017-05-28spring boot整合RabbitMQ实例详解(Fanout模式)
  • 2017-05-28java 中Comparable与Comparator详解与比较

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • java 基础之JavaBean属性命名规范问题
    • Java创建内部类对象实例详解
    • SpringMVC中使用bean来接收form表单提交的参数时的注意点
    • Spring boot将配置属性注入到bean类中
    • Java语言实现简单FTP软件 FTP上传下载队列窗口实现(7)
    • java web SpringMVC后端传json数据到前端页面实例代码
    • springmvc实现简单的拦截器
    • 详解Springboot自定义异常处理
    • Nashorn jdk8新增的ScriptEngine官方文档翻译及代码示例
    • Java Iterator迭代器_动力节点Java学院整理

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有