Mybatis源码阅读之UnpooledDataSource

package org.apache.ibatis.datasource.unpooled;

import java.io.PrintWriter;

import java.sql.Connection;

import java.sql.Driver;

import java.sql.DriverManager;

import java.sql.DriverPropertyInfo;

import java.sql.SQLException;

import java.util.Enumeration;

import java.util.Map;

import java.util.Properties;

import java.util.concurrent.ConcurrentHashMap;

扫描二维码关注公众号,回复: 554762 查看本文章

import java.util.logging.Logger;

import javax.sql.DataSource;

import org.apache.ibatis.io.Resources;

/**

 * @author Clinton Begin

 * @author Eduardo Macarron

 */

public class UnpooledDataSource implements DataSource {

  

  private ClassLoader driverClassLoader;

  private Properties driverProperties;

  private static Map<String, Driver> registeredDrivers = new ConcurrentHashMap<String, Driver>();

  private String driver;

  private String url;

  private String username;

  private String password;

  private Boolean autoCommit;

  private Integer defaultTransactionIsolationLevel;-->事物隔离级别

  static {

    Enumeration<Driver> drivers = DriverManager.getDrivers();

    while (drivers.hasMoreElements()) {

      Driver driver = drivers.nextElement();

      registeredDrivers.put(driver.getClass().getName(), driver);

    }

  }

  --构造函数

  public UnpooledDataSource() {

  }

  --构造函数

  public UnpooledDataSource(String driver, String url, String username, String password) {

    this.driver = driver;

    this.url = url;

    this.username = username;

    this.password = password;

  }

  --构造函数

  public UnpooledDataSource(String driver, String url, Properties driverProperties) {

    this.driver = driver;

    this.url = url;

    this.driverProperties = driverProperties;

  }

  --构造函数

  public UnpooledDataSource(ClassLoader driverClassLoader, String driver, String url, String username, String password) {

    this.driverClassLoader = driverClassLoader;

    this.driver = driver;

    this.url = url;

    this.username = username;

    this.password = password;

  }

  --构造函数

  public UnpooledDataSource(ClassLoader driverClassLoader, String driver, String url, Properties driverProperties) {

    this.driverClassLoader = driverClassLoader;

    this.driver = driver;

    this.url = url;

    this.driverProperties = driverProperties;

  }

  @Override

  public Connection getConnection() throws SQLException {

    return doGetConnection(username, password);

  }

  @Override

  public Connection getConnection(String username, String password) throws SQLException {

    return doGetConnection(username, password);

  }

  @Override

  public void setLoginTimeout(int loginTimeout) throws SQLException {

    DriverManager.setLoginTimeout(loginTimeout);

  }

  @Override

  public int getLoginTimeout() throws SQLException {

    return DriverManager.getLoginTimeout();

  }

  @Override

  public void setLogWriter(PrintWriter logWriter) throws SQLException {

    DriverManager.setLogWriter(logWriter);

  }

  @Override

  public PrintWriter getLogWriter() throws SQLException {

    return DriverManager.getLogWriter();

  }

  public ClassLoader getDriverClassLoader() {

    return driverClassLoader;

  }

  public void setDriverClassLoader(ClassLoader driverClassLoader) {

    this.driverClassLoader = driverClassLoader;

  }

  public Properties getDriverProperties() {

    return driverProperties;

  }

  public void setDriverProperties(Properties driverProperties) {

    this.driverProperties = driverProperties;

  }

  public String getDriver() {

    return driver;

  }

  public synchronized void setDriver(String driver) {

    this.driver = driver;

  }

  public String getUrl() {

    return url;

  }

  public void setUrl(String url) {

    this.url = url;

  }

  public String getUsername() {

    return username;

  }

  public void setUsername(String username) {

    this.username = username;

  }

  public String getPassword() {

    return password;

  }

  public void setPassword(String password) {

    this.password = password;

  }

  public Boolean isAutoCommit() {

    return autoCommit;

  }

  public void setAutoCommit(Boolean autoCommit) {

    this.autoCommit = autoCommit;

  }

  public Integer getDefaultTransactionIsolationLevel() {

    return defaultTransactionIsolationLevel;

  }

  public void setDefaultTransactionIsolationLevel(Integer defaultTransactionIsolationLevel) {

    this.defaultTransactionIsolationLevel = defaultTransactionIsolationLevel;

  }

  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;

  }

  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);

      }

    }

  }

  private void configureConnection(Connection conn) throws SQLException {

    if (autoCommit != null && autoCommit != conn.getAutoCommit()) {

      conn.setAutoCommit(autoCommit);

    }

    if (defaultTransactionIsolationLevel != null) {

      conn.setTransactionIsolation(defaultTransactionIsolationLevel);

    }

  }

  private static class DriverProxy implements Driver {

    private Driver driver;

    DriverProxy(Driver d) {

      this.driver = d;

    }

    @Override

    public boolean acceptsURL(String u) throws SQLException {

      return this.driver.acceptsURL(u);

    }

    @Override

    public Connection connect(String u, Properties p) throws SQLException {

      return this.driver.connect(u, p);

    }

    @Override

    public int getMajorVersion() {

      return this.driver.getMajorVersion();

    }

    @Override

    public int getMinorVersion() {

      return this.driver.getMinorVersion();

    }

    @Override

    public DriverPropertyInfo[] getPropertyInfo(String u, Properties p) throws SQLException {

      return this.driver.getPropertyInfo(u, p);

    }

    @Override

    public boolean jdbcCompliant() {

      return this.driver.jdbcCompliant();

    }

    // @Override only valid jdk7+

    public Logger getParentLogger() {

      return Logger.getLogger(Logger.GLOBAL_LOGGER_NAME);

    }

  }

  @Override

  public <T> T unwrap(Class<T> iface) throws SQLException {

    throw new SQLException(getClass().getName() + " is not a wrapper.");

  }

  @Override

  public boolean isWrapperFor(Class<?> iface) throws SQLException {

    return false;

  }

  // @Override only valid jdk7+

  public Logger getParentLogger() {

    // requires JDK version 1.6

    return Logger.getLogger(Logger.GLOBAL_LOGGER_NAME);

  }

}

猜你喜欢

转载自gaojingsong.iteye.com/blog/2337434