简介
数据源是实际开发中常用的组件之一。现在开源的数据源都提供了比较丰富的功能,例如,连接池功能、检测连接状态等,选择性能优秀的数据源组件对于提升 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 =