JAVA配置多数据源并动态切换

本文介绍了在Java项目中实现多数据源配置及动态切换的需求。首先回顾了JDBC与DataSource的区别,强调了DataSource在连接管理上的优势。接着讨论了MyBatis与DataSource的结合,展示了如何将多数据源配置应用于MyBatis。文章提供了配置文件和数据源的示例,并指出通过动态数据源可以实现数据源的按需切换。最后提到了参考的相关文章链接,供读者深入学习。

参考:

需求描述

近期被分配了一个需求:

  • 在项目里同时连接多个数据源
  • 用户可以输入数据库连接信息动态建立连接

JDBC 与 DATASOURCE

在配置动态数据源前,必须先回顾一下jdbcdatasource,这对后面的功能实现有很大帮助

以下是jdbc伪代码

//注册driver
Class.forName("com.mysql.jdbc.Driver");
//建立数据库对象
Connection conn  = DriverManager.getConnection(url_encrypt,user,password);
//建立操作对象
Statement stmt= conn.createStatement();
//结果集
ResultSet rs = stmt.executeQuery("select * from information");
//依次关闭结果集,操作对象,数据库对象
if(rs!=null){
   
   
    rs.close();
}
if(stmt!=null){
   
   
    stmt.close();
}
if(conn!=null){
   
   
    conn.close();
}

可以看出,使用jdbc的步骤简单归纳如下:

  1. 加载数据库驱动driver
  2. 建立数据库连接connection
  3. 创建statement
  4. 通过statement执行sql,获得结果集ResultSet
  5. 依次关闭ResultSetstatementconnection

但是,每次通过jdbc建立连接不但繁琐,而且频繁建立和释放连接对系统资源消耗也很大,因此发展出了datasource
datasource是个接口,它只有两个方法

//无参数获取Connection
Connection getConnection() throws SQLException;
//通过username和password获取Connection
Connection getConnection(String username, String password) throws SQLException;

可以看出,这两个方法都可以获得connection,因此connection的创建与回收都由datasource管理而不用用户操心,而且通过数据库连接池也避免了connection的频繁创建与销毁,提升了系统性能

那么想要实现动态数据源,思路有两种:

  1. 同时创建多个datasource,不同的接口(或方法)采用不同的datasource
  2. 采用动态数据源,根据需要动态提供不同的connection

mybatis

现在我们已经有了初步思路,下一步就是如何把这个思路应用于mybatis上,这样就需要了解下mybatisdatasource间的关系

我们知道,使用mybatis时,我们做了以下工作:

  1. mapper接口
  2. .xml文件
  3. 通过@MapperScan指定mapper接口的扫描路径
  4. 配置mapper-locations指定.xml文件路径

这中间,mybatis做了很多工作,但这不是我们这篇文章的重点,但我们只需要了解以下内容:

  1. mybatis会根据mapper接口与.xml文件生成mapper接口的实现类
  2. 这个mapper实现类会使用SqlSessionTemplate去执行SQL命令
  3. 如果某mapper想使用某特定数据库,就让它使用某特定的SqlSessionTemplate
  4. SqlSessionTemplate可通过SqlSessionFactory去创建
  5. SqlSessionFactory通过SqlSessionFactoryBean创建
  6. SqlSessionFactoryBean可以通过setDataSource设置datasource,通过setMapperLocations设置.xml文件地址

梳理一下:

  1. 创建一个SqlSessionFactoryBean,设置datasourcexml文件路径
  2. 通过SqlSessionFactoryBean创建SqlSessionFactory
  3. 通过SqlSessionFactory创建SqlSessionTemplate
  4. 把这个SqlSessionTemplate“关联”到mapper接口

ps:以上总结是基于spring+mybatis,如果没有spring,链路如下:
datasource >> Environment >> Configuration >> SqlSessionFactoryBuilder >> SqlSessionFactory >> S

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值