Mybatis数据源与连接池简单理解

此文参考为读后理解,如有错误,欢迎指出

原文https://blog.csdn.net/luanlouis/article/details/37671851

1.Mybatis数据源 DataSource分为三类:

  • UNPOOLED 不使用连接池
  • POOLED      使用连接池
  • JNDI             使用JNDI实现

2.DataSource的创建过程

datasource对象的创建发生在Mybatis初始化的过程中,在XML配置文件中使用<dataSource>元素来配置:

 <dataSource type="POOLED">  
        <property name="driver"   value="${db.driver}" />  
        <property name="url"  value="${db.url}" />  
        <property name="username" value="${db.username}" />  
        <property name="password" value="${db.password}" />  
  </dataSource>

 - MyBatis在初始化时,解析此文件,根据<dataSource>的type属性来创建相应类型的的数据源DataSource

 - MyBatis是通过工厂模式来创建数据源DataSource对象的,MyBatis定义了抽象的工厂接

   口:org.apache.ibatis.datasource.DataSourceFactory,通过其getDataSource()方法返回数据源DataSource 

 - MyBatis创建了DataSource实例后,会将其放到Configuration对象内的Environment对象中, 供以后使用 

3. DataSource创建Connection对象

当我们需要创建SqlSession对象并需要执行SQL语句时,MyBatis才会去调用dataSource对象来创建java.sql.Connection对象

String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
sqlSession.selectList("SELECT * FROM users");

上述代码,执行到第五行的时候才会创建connection对象,下面是创建connection对象的方法:

protected void openConnection() throws SQLException {
    if (log.isDebugEnabled()) {
      log.debug("Opening JDBC Connection");
    }
    connection = dataSource.getConnection();
    if (level != null) {
      connection.setTransactionIsolation(level.getLevel());
    }
    setDesiredAutoCommit(autoCommmit);
  }

4.UNPOOLED DataSource

MyBatis首先会实例化一个UnpooledDataSourceFactory工厂实例,然后通过.getDataSource()方法返回一个UnpooledDataSource实例对象引用

使用UnpooledDataSource的getConnection(),每调用一次就会产生一个新的Connection实例对象 

getConnection()方法代码如下:

public Connection getConnection() throws SQLException
{
    return doGetConnection(username, password);
}


private Connection doGetConnection(String username, String password) throws SQLException
{
    //封装username和password成properties
    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
{
    //1.初始化驱动
    initializeDriver();
    //2.从DriverManager中获取连接,获取新的Connection对象
    Connection connection = DriverManager.getConnection(url, properties);
    //3.配置connection属性
    configureConnection(connection);
    return connection;
}

5.对于连接池的理解

暂时理解为 相当于JDBC中的连接池一个概念,具体的,等以后再理解,如释放资源等;

6.JNDI

暂时放着 

猜你喜欢

转载自blog.csdn.net/qq_33419463/article/details/89330045