1.应用的设计模式
因为在创建数据源的时候,对象是一个非常复杂的对象,所以采用了的是工厂模式
2.数据源的创建分类
在Mybatis框架中,涉及到的数据源,常用的是两个,PooledDataSource(数据源连接池),UnpooledDataSource(非连接池数据源)
来源:PooledDataSource 是通过 PooledDataSourceFactory创建的,UnPooledDataSource 是通过UnPooledDataSource Factory创建的;
3.特殊点:
3.1 UnpooledDataSource每次都会创建一个新的连接
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); } //从这个代码可以看出,unpooledDatasource获取连接的方式和手动获取连接的方式是一样的 private Connection doGetConnection(Properties properties) throws SQLException { initializeDriver(); Connection connection = DriverManager.getConnection(url, properties); //设置事务是否自动提交,事务的隔离级别 configureConnection(connection); return connection; } private synchronized void initializeDriver() throws SQLException { if (!registeredDrivers.containsKey(driver)) { Class<?> driverType; try { if (driverClassLoader != null) { driverType = Class.forName(driver, true, driverClassLoader); } else { driverType = Resources.classForName(driver); } // DriverManager requires the driver to be loaded via the system ClassLoader. // http://www.kfu.com/~nsayer/Java/dyn-jdbc.html Driver driverInstance = (Driver)driverType.newInstance(); DriverManager.registerDriver(new DriverProxy(driverInstance)); registeredDrivers.put(driver, driverInstance); } catch (Exception e) { throw new SQLException("Error setting driver on UnpooledDataSource. Cause: " + e); } } }View Code
3.2 下面我们主要的看一下PooledDataSource ,带有连接池的数据源
在过程中,我们涉及到了两个重要的参数
PooledConnection 使用动态代理封装了真正的数据库连接对象,增强的是关闭方法;
PoolState 管理的是 PooledConnection 对象组件的状态,其中有两个变量 idleConnections 和 activeConnections