mybaits源码学习------UnpooledDataSource

简介

数据源是实际开发中常用的组件之一。现在开源的数据源都提供了比较丰富的功能,例如,连接池功能、检测连接状态等,选择性能优秀的数据源组件对于提升 ORM 框架乃至整个应用的性能都是非常重要的。

MyBatis 自身提供了相应的数据源实现,当然 MyBatis 也提供了与第三方数据源集成的接口,这些功能都位于数据源模块之中。

mybatis的datasource模块将数据源分为下面三类:

  • JNDI数据源
  • 非池化数据源
  • 池化数据源

非池化数据源

这个数据源的实现只是每次被请求时打开和关闭连接。虽然有点慢,但对于在数据库连接可用性方面没有太高要求的简单应用程序来说,是一个很好的选择。 不同的数据库在性能方面的表现也是不一样的,对于某些数据库来说,使用连接池并不重要,这个配置就很适合这种情形。UNPOOLED 类型的数据源仅仅需要配置以下 5 种属性

  • driver – 这是 JDBC 驱动的 Java 类的完全限定名(并不是 JDBC 驱动中可能包含的数据源类)。
  • url – 这是数据库的 JDBC URL 地址。
  • username – 登录数据库的用户名。
  • password – 登录数据库的密码。
  • defaultTransactionIsolationLevel – 默认的连接事务隔离级别。

池化数据源

也就是常说的数据库连接池,mybatis提供了一套简单、同步和线程安全的数据库连接池,但是在实际项目开发中,我们都会使用阿里的druid或者hikari连接池,项目中不用不代表mybatis实现的连接池没有学习价值,下一篇文章将学习池化数据源的代码实现。

数据源工厂

当有多个数据源时,如何更好的管理数据源是首先要思考的问题,mybatis使用了工厂设计模式来创建新的数据源。

其类图如下:

在这里插入图片描述

下面学习其源码实现

DataSourceFactory

public interface DataSourceFactory {
   
  //设置数据源属性,参数为一个Properties对象
  void setProperties(Properties props);
  //获取数据源
  DataSource getDataSource();
}

UnpooledDataSourceFactory

public class UnpooledDataSourceFactory implements DataSourceFactory {
   
  //驱动属性的前缀
  private static final String DRIVER_PROPERTY_PREFIX = "driver.";
  private static final int DRIVER_PROPERTY_PREFIX_LENGTH = DRIVER_PROPERTY_PREFIX.length();
  //数据源
  protected DataSource dataSource;

  /**
   * 构造函数默认创建一个非池化的数据源
   */
  public UnpooledDataSourceFactory() {
   
    this.dataSource = new UnpooledDataSource();
  }

  /**
   * 设置数据源的属性
   * @param properties
   */
  @Override
  public void setProperties(Properties properties) {
   
    Properties driverProperties = new Properties();
    //使用MetaObject包装数据源对象
    MetaObject metaDataSource = SystemMetaObject.forObject(dataSource);
    //遍历properties中的所有属性,
    //1、如果是以driver.开头的key,则将其保存在driverProperties对象中
    //2、如果不以driver.开头,但却是数据源UnpooledDataSource类中定义的属性,也需要将其保存在driverProperties对象中
    for (Object key : properties.keySet()) {
   
      String propertyName = (String) key;
      if (propertyName.startsWith(DRIVER_PROPERTY_PREFIX)) {
   
        String value = properties.getProperty(propertyName);
        driverProperties.setProperty(propertyName.substring(DRIVER_PROPERTY_PREFIX_LENGTH), value);
      } else if (metaDataSource.hasSetter(propertyName)) {
   
        String value = 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值