写点什么

聊聊 Mybatis 的数据源之工厂模式

作者:周杰伦本人
  • 2022-11-23
    山东
  • 本文字数:1394 字

    阅读完需:约 5 分钟

聊聊 Mybatis 的数据源之工厂模式

工厂模式是比较简单的设计模式,Mybatis 的数据源的部分使用了工厂模式

工厂模式的工厂

DataSourceFactory 是工厂角色的接口层


public interface DataSourceFactory {  void setProperties(Properties props);  DataSource getDataSource();}
复制代码


这个两个方法一个是设置 DataSource 的相关属性,一个是获取当前的 dataSource


UnpooledDataSourceFactory 实现了这个接口,它的构造方法中指定 dataSource 是 UnpooledDataSource 对象


public UnpooledDataSourceFactory() {        this.dataSource = new UnpooledDataSource();}
复制代码


PooledDataSourceFactory 继承了 UnpooledDataSourceFactory,构造方法中返回了 PooledDataSource 对象,其他都是使用 UnpooledDataSourceFactory 的方法


public class PooledDataSourceFactory extends UnpooledDataSourceFactory {
public PooledDataSourceFactory() { this.dataSource = new PooledDataSource(); }
}
复制代码

工厂模式的产品

DataSource 的工厂模式的产品的接口,UnpooledDataSource 和 PooledDataSource 都实现了这个方法,UnpooledDataSource 是不使用数据库连接池,而 PooledDataSource 是使用数据库连接池


UnpooledDataSource 的 doGetConnection()方法:


    private Connection doGetConnection(String username, String password) throws SQLException {        Properties props = new Properties();        if (driverProperties != null) {            props.putAll(driverProperties);        }        if (username != null) {            props.setProperty("user", username);        }        if (password != null) {            props.setProperty("password", password);        }        return doGetConnection(props);    }    private Connection doGetConnection(Properties properties) throws SQLException {        initializeDriver();        Connection connection = DriverManager.getConnection(url, properties);        configureConnection(connection);        return connection;    }
复制代码


这个方法就是典型的连接数据库的操作了:


  1. 调用 initializeDriver()方法初始化数据库驱动,这个方法中进行 jdbc 驱动的初始化,注册到 DriverManager 中,同时保存到 registeredDrivers 中,registeredDrivers 是 UnpooledDataSource 是成员变量,使用 ConcurrentHashMap 来进行存储,保证线程的安全性

  2. Connection connection = DriverManager.getConnection(url, properties); 创建数据库连接

  3. 调用 configureConnection()方法配置数据库的连接


PooledDataSource 是使用数据库连接池来进行缓存数据库连接,但我们要设置合适的数据库连接池的最大连接数和最大空闲连接数


有了数据库连接池,在初始化的时候初始化数据库连接信息,缓存到连接池中,当需要连接数据库的时候从数据库连接池中获取,使用完后不需要关闭连接而是返还给连接池,方便下次使用。

总结

本文主要介绍了 Mybatis 的数据源模块,从工厂模式的角度分析了担任工厂模式的工厂角色的接口 DataSourceFactory 和它对应的实现类 UnpooledDataSourceFactory、PooledDataSourceFactory,同时介绍了工厂模式的产品角色的 DataSource 接口和它对应的实现类 UnpooledDataSource、PooledDataSource,UnpooledDataSource 不使用数据库连接池,PooledDataSource 使用了数据库连接池。

发布于: 刚刚阅读数: 3
用户头像

还未添加个人签名 2020-02-29 加入

公众号《周结论本人》,多平台优质博主

评论

发布
暂无评论
聊聊Mybatis的数据源之工厂模式_11月月更_周杰伦本人_InfoQ写作社区