亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? simpledatasource.java

?? 本套系統采用了業界當前最為流行的beanAction組件
?? JAVA
?? 第 1 頁 / 共 3 頁
字號:
/*
 *  Copyright 2004 Clinton Begin
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */
package com.ibatis.common.jdbc;

import com.ibatis.common.beans.ClassInfo;

import com.ibatis.common.resources.Resources;
import com.ibatis.common.logging.LogFactory;
import com.ibatis.common.logging.Log;

import javax.sql.DataSource;
import java.io.PrintWriter;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.sql.*;
import java.util.*;

/**
 * This is a simple, synchronous, thread-safe database connection pool.
 * <p/>
 * REQUIRED PROPERTIES
 * -------------------
 * JDBC.Driver
 * JDBC.ConnectionURL
 * JDBC.Username
 * JDBC.Password
 * <p/>
 * Pool.MaximumActiveConnections
 * Pool.MaximumIdleConnections
 * Pool.MaximumCheckoutTime
 * Pool.TimeToWait
 * Pool.PingQuery
 * Pool.PingEnabled
 * Pool.PingConnectionsOlderThan
 * Pool.PingConnectionsNotUsedFor
 * Pool.QuietMode
 */
public class SimpleDataSource implements DataSource {

  private static final Log log = LogFactory.getLog(SimpleDataSource.class);

  // Required Properties
  private static final String PROP_JDBC_DRIVER = "JDBC.Driver";
  private static final String PROP_JDBC_URL = "JDBC.ConnectionURL";
  private static final String PROP_JDBC_USERNAME = "JDBC.Username";
  private static final String PROP_JDBC_PASSWORD = "JDBC.Password";
  private static final String PROP_JDBC_DEFAULT_AUTOCOMMIT = "JDBC.DefaultAutoCommit";

  // Optional Properties
  private static final String PROP_POOL_MAX_ACTIVE_CONN = "Pool.MaximumActiveConnections";
  private static final String PROP_POOL_MAX_IDLE_CONN = "Pool.MaximumIdleConnections";
  private static final String PROP_POOL_MAX_CHECKOUT_TIME = "Pool.MaximumCheckoutTime";
  private static final String PROP_POOL_TIME_TO_WAIT = "Pool.TimeToWait";
  private static final String PROP_POOL_PING_QUERY = "Pool.PingQuery";
  private static final String PROP_POOL_PING_CONN_OLDER_THAN = "Pool.PingConnectionsOlderThan";
  private static final String PROP_POOL_PING_ENABLED = "Pool.PingEnabled";
  private static final String PROP_POOL_PING_CONN_NOT_USED_FOR = "Pool.PingConnectionsNotUsedFor";
  private int expectedConnectionTypeCode;
  // Additional Driver Properties prefix
  private static final String ADD_DRIVER_PROPS_PREFIX = "Driver.";
  private static final int ADD_DRIVER_PROPS_PREFIX_LENGTH = ADD_DRIVER_PROPS_PREFIX.length();

  // ----- BEGIN: FIELDS LOCKED BY POOL_LOCK -----
  private final Object POOL_LOCK = new Object();
  private List idleConnections = new ArrayList();
  private List activeConnections = new ArrayList();
  private long requestCount = 0;
  private long accumulatedRequestTime = 0;
  private long accumulatedCheckoutTime = 0;
  private long claimedOverdueConnectionCount = 0;
  private long accumulatedCheckoutTimeOfOverdueConnections = 0;
  private long accumulatedWaitTime = 0;
  private long hadToWaitCount = 0;
  private long badConnectionCount = 0;
  // ----- END: FIELDS LOCKED BY POOL_LOCK -----

  // ----- BEGIN: PROPERTY FIELDS FOR CONFIGURATION -----
  private String jdbcDriver;
  private String jdbcUrl;
  private String jdbcUsername;
  private String jdbcPassword;
  private boolean jdbcDefaultAutoCommit;
  private Properties driverProps;
  private boolean useDriverProps;

  private int poolMaximumActiveConnections;
  private int poolMaximumIdleConnections;
  private int poolMaximumCheckoutTime;
  private int poolTimeToWait;
  private String poolPingQuery;
  private boolean poolPingEnabled;
  private int poolPingConnectionsOlderThan;
  private int poolPingConnectionsNotUsedFor;
  //----- END: PROPERTY FIELDS FOR CONFIGURATION -----

  /**
   * Constructor to allow passing in a map of properties for configuration
   *
   * @param props - the configuration parameters
   */
  public SimpleDataSource(Map props) {
    initialize(props);
  }

  private void initialize(Map props) {
    try {
      String prop_pool_ping_query = null;
    	
      if (props == null) {
        throw new RuntimeException("SimpleDataSource: The properties map passed to the initializer was null.");
      }

      if (!(props.containsKey(PROP_JDBC_DRIVER)
          && props.containsKey(PROP_JDBC_URL)
          && props.containsKey(PROP_JDBC_USERNAME)
          && props.containsKey(PROP_JDBC_PASSWORD))) {
        throw new RuntimeException("SimpleDataSource: Some properties were not set.");
      } else {

        jdbcDriver = (String) props.get(PROP_JDBC_DRIVER);
        jdbcUrl = (String) props.get(PROP_JDBC_URL);
        jdbcUsername = (String) props.get(PROP_JDBC_USERNAME);
        jdbcPassword = (String) props.get(PROP_JDBC_PASSWORD);

        poolMaximumActiveConnections =
            props.containsKey(PROP_POOL_MAX_ACTIVE_CONN)
            ? Integer.parseInt((String) props.get(PROP_POOL_MAX_ACTIVE_CONN))
            : 10;

        poolMaximumIdleConnections =
            props.containsKey(PROP_POOL_MAX_IDLE_CONN)
            ? Integer.parseInt((String) props.get(PROP_POOL_MAX_IDLE_CONN))
            : 5;

        poolMaximumCheckoutTime =
            props.containsKey(PROP_POOL_MAX_CHECKOUT_TIME)
            ? Integer.parseInt((String) props.get(PROP_POOL_MAX_CHECKOUT_TIME))
            : 20000;

        poolTimeToWait =
            props.containsKey(PROP_POOL_TIME_TO_WAIT)
            ? Integer.parseInt((String) props.get(PROP_POOL_TIME_TO_WAIT))
            : 20000;

        poolPingEnabled =
            props.containsKey(PROP_POOL_PING_ENABLED)
                && Boolean.valueOf((String) props.get(PROP_POOL_PING_ENABLED)).booleanValue();

        prop_pool_ping_query = (String) props.get(PROP_POOL_PING_QUERY); 
        poolPingQuery =
            props.containsKey(PROP_POOL_PING_QUERY)
            ? prop_pool_ping_query 
            : "NO PING QUERY SET";

        poolPingConnectionsOlderThan =
            props.containsKey(PROP_POOL_PING_CONN_OLDER_THAN)
            ? Integer.parseInt((String) props.get(PROP_POOL_PING_CONN_OLDER_THAN))
            : 0;

        poolPingConnectionsNotUsedFor =
            props.containsKey(PROP_POOL_PING_CONN_NOT_USED_FOR)
            ? Integer.parseInt((String) props.get(PROP_POOL_PING_CONN_NOT_USED_FOR))
            : 0;

        jdbcDefaultAutoCommit =
            props.containsKey(PROP_JDBC_DEFAULT_AUTOCOMMIT)
                && Boolean.valueOf((String) props.get(PROP_JDBC_DEFAULT_AUTOCOMMIT)).booleanValue();

        useDriverProps = false;
        Iterator propIter = props.keySet().iterator();
        driverProps = new Properties();
        driverProps.put("user", jdbcUsername);
        driverProps.put("password", jdbcPassword);
        while (propIter.hasNext()) {
          String name = (String) propIter.next();
          String value = (String) props.get(name);
          if (name.startsWith(ADD_DRIVER_PROPS_PREFIX)) {
            driverProps.put(name.substring(ADD_DRIVER_PROPS_PREFIX_LENGTH), value);
            useDriverProps = true;
          }
        }

        expectedConnectionTypeCode = assembleConnectionTypeCode(jdbcUrl, jdbcUsername, jdbcPassword);

        Resources.instantiate(jdbcDriver);
        
        if ( poolPingEnabled && (!props.containsKey(PROP_POOL_PING_QUERY) ||
        		prop_pool_ping_query.trim().length() == 0) ) {
          throw new RuntimeException("SimpleDataSource: property '" + PROP_POOL_PING_ENABLED + "' is true, but property '" +
                                           PROP_POOL_PING_QUERY + "' is not set correctly.");
        }        
      }

    } catch (Exception e) {
      log.error("SimpleDataSource: Error while loading properties. Cause: " + e.toString(), e);
      throw new RuntimeException("SimpleDataSource: Error while loading properties. Cause: " + e, e);
    }
  }

  private int assembleConnectionTypeCode(String url, String username, String password) {
    return ("" + url + username + password).hashCode();
  }

  /**
   * @see javax.sql.DataSource#getConnection()
   */
  public Connection getConnection() throws SQLException {
    return popConnection(jdbcUsername, jdbcPassword).getProxyConnection();
  }

  /**
   * @see javax.sql.DataSource#getConnection(java.lang.String, java.lang.String)
   */
  public Connection getConnection(String username, String password) throws SQLException {
    return popConnection(username, password).getProxyConnection();
  }

  /**
   * @see javax.sql.DataSource#setLoginTimeout(int)
   */
  public void setLoginTimeout(int loginTimeout) throws SQLException {
    DriverManager.setLoginTimeout(loginTimeout);
  }

  /**
   * @see javax.sql.DataSource#getLoginTimeout()
   */
  public int getLoginTimeout() throws SQLException {
    return DriverManager.getLoginTimeout();
  }

  /**
   * @see javax.sql.DataSource#setLogWriter(java.io.PrintWriter)
   */
  public void setLogWriter(PrintWriter logWriter) throws SQLException {
    DriverManager.setLogWriter(logWriter);
  }

  /**
   * @see javax.sql.DataSource#getLogWriter()
   */
  public PrintWriter getLogWriter() throws SQLException {
    return DriverManager.getLogWriter();
  }

  /**
   * If a connection has not been used in this many milliseconds, ping the
   * database to make sure the connection is still good.
   *
   * @return the number of milliseconds of inactivity that will trigger a ping
   */
  public int getPoolPingConnectionsNotUsedFor() {
    return poolPingConnectionsNotUsedFor;
  }

  /**
   * Getter for the name of the JDBC driver class used
   * @return The name of the class
   */
  public String getJdbcDriver() {
    return jdbcDriver;
  }

  /**
   * Getter of the JDBC URL used
   * @return The JDBC URL
   */
  public String getJdbcUrl() {
    return jdbcUrl;
  }

  /**
   * Getter for the JDBC user name used
   * @return The user name
   */
  public String getJdbcUsername() {
    return jdbcUsername;
  }

  /**
   * Getter for the JDBC password used
   * @return The password
   */
  public String getJdbcPassword() {
    return jdbcPassword;
  }

  /**
   * Getter for the maximum number of active connections
   * @return The maximum number of active connections
   */
  public int getPoolMaximumActiveConnections() {
    return poolMaximumActiveConnections;
  }

  /**
   * Getter for the maximum number of idle connections
   * @return The maximum number of idle connections
   */
  public int getPoolMaximumIdleConnections() {
    return poolMaximumIdleConnections;
  }

  /**
   * Getter for the maximum time a connection can be used before it *may* be
   * given away again.
   * @return The maximum time
   */
  public int getPoolMaximumCheckoutTime() {
    return poolMaximumCheckoutTime;
  }

  /**
   * Getter for the time to wait before retrying to get a connection
   * @return The time to wait
   */
  public int getPoolTimeToWait() {
    return poolTimeToWait;
  }

  /**
   * Getter for the query to be used to check a connection
   * @return The query
   */
  public String getPoolPingQuery() {
    return poolPingQuery;
  }

  /**
   * Getter to tell if we should use the ping query
   * @return True if we need to check a connection before using it
   */
  public boolean isPoolPingEnabled() {
    return poolPingEnabled;
  }

  /**
   * Getter for the age of connections that should be pinged before using
   * @return The age
   */
  public int getPoolPingConnectionsOlderThan() {
    return poolPingConnectionsOlderThan;
  }

  private int getExpectedConnectionTypeCode() {
    return expectedConnectionTypeCode;
  }

  /**
   * Getter for the number of connection requests made
   * @return The number of connection requests made
   */
  public long getRequestCount() {
    synchronized (POOL_LOCK) {
      return requestCount;
    }
  }

  /**
   * Getter for the average time required to get a connection to the database
   * @return The average time

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美精品在线一区二区三区| 成人午夜大片免费观看| 久久成人免费网| 99精品欧美一区二区三区小说 | 一区二区在线免费| 麻豆精品在线看| 欧美三级视频在线播放| 日本一区二区三区在线观看| 免费在线观看精品| 欧美亚洲愉拍一区二区| 亚洲人快播电影网| 成人教育av在线| 久久毛片高清国产| 秋霞午夜鲁丝一区二区老狼| 欧美在线啊v一区| 自拍偷拍欧美精品| 成人av先锋影音| 国产日本欧洲亚洲| 国产suv精品一区二区883| 精品久久久久久综合日本欧美| 性感美女久久精品| 欧美日韩一区二区在线观看 | 中文一区二区在线观看| 麻豆精品一区二区三区| 日韩一级大片在线观看| 奇米影视在线99精品| 91麻豆精品国产91| 性感美女久久精品| 91精品国产一区二区人妖| 亚洲成人免费观看| 欧美夫妻性生活| 午夜伊人狠狠久久| 制服.丝袜.亚洲.中文.综合| 日精品一区二区| 日韩一级免费一区| 国产乱色国产精品免费视频| 久久久久久麻豆| 波多野结衣在线aⅴ中文字幕不卡| 国产日本亚洲高清| 色呦呦国产精品| 亚洲在线中文字幕| 欧美一区二区在线免费观看| 日本aⅴ免费视频一区二区三区| 欧美一区二区播放| 国产精品一级片| 成人免费在线观看入口| 欧美亚一区二区| 奇米777欧美一区二区| 久久久九九九九| 99久久免费国产| 亚洲v中文字幕| 久久中文字幕电影| 99久久99久久精品国产片果冻| 亚洲一级二级三级在线免费观看| 欧美日本视频在线| 国产成人av资源| 亚洲小说春色综合另类电影| 日韩欧美在线网站| 91在线国产观看| 免费成人在线视频观看| 国产片一区二区| 欧美在线看片a免费观看| 免费视频最近日韩| 亚洲视频免费在线观看| 宅男在线国产精品| 9人人澡人人爽人人精品| 日韩极品在线观看| 中文字幕制服丝袜一区二区三区 | 99riav久久精品riav| 午夜精品成人在线| 国产女人水真多18毛片18精品视频| 91日韩一区二区三区| 九一久久久久久| 伊人婷婷欧美激情| 久久久欧美精品sm网站| 欧美视频三区在线播放| 国产丶欧美丶日本不卡视频| 亚洲不卡一区二区三区| 日本一区二区高清| 精品久久五月天| 欧美裸体bbwbbwbbw| 成人性生交大片免费看在线播放| 蜜臀va亚洲va欧美va天堂| 一区二区三区四区国产精品| 国产午夜精品美女毛片视频| 欧美日韩国产乱码电影| 99精品国产视频| 高清不卡一区二区| 精品一区二区在线视频| 视频一区二区国产| 亚洲乱码中文字幕综合| 中文av一区二区| 久久久精品免费免费| 欧美一区二区黄色| 欧美精品免费视频| 在线精品视频一区二区三四| 99久久精品免费精品国产| 国内精品伊人久久久久av一坑| 日韩精品三区四区| 性欧美疯狂xxxxbbbb| 亚洲成人激情自拍| 性久久久久久久| 亚洲国产日韩av| 一区二区在线观看av| 亚洲免费观看高清完整版在线观看 | 奇米影视一区二区三区小说| 一区二区日韩av| 亚洲免费高清视频在线| 亚洲欧美国产毛片在线| 国产精品对白交换视频| 1024国产精品| 亚洲精品国产第一综合99久久 | 久久99精品国产91久久来源| 日韩高清中文字幕一区| 爽好久久久欧美精品| 丝袜亚洲另类欧美| 蜜桃一区二区三区在线| 久久福利视频一区二区| 国产乱码精品一区二区三区av | 亚洲一区二区精品视频| 亚洲国产乱码最新视频| 五月天亚洲精品| 蜜桃久久久久久久| 色综合天天综合色综合av | 国产美女久久久久| 久久99精品网久久| 国产传媒欧美日韩成人| 成人免费高清视频在线观看| 91视频在线观看免费| 欧美日韩在线播放三区四区| 欧美一二三四区在线| 久久久国产精品麻豆| 亚洲免费电影在线| 日韩一区精品字幕| 国产露脸91国语对白| av成人免费在线观看| 欧美日韩视频一区二区| 精品精品国产高清a毛片牛牛| 久久久国产精品不卡| 亚洲少妇屁股交4| 日韩黄色小视频| 国产成人在线视频网址| 在线这里只有精品| 精品国产一区二区三区久久久蜜月 | 午夜久久电影网| 狠狠v欧美v日韩v亚洲ⅴ| 91在线云播放| 欧美哺乳videos| 一区二区欧美视频| 韩国午夜理伦三级不卡影院| 色香蕉成人二区免费| 日韩一级大片在线| 亚洲乱码中文字幕综合| 久久国产精品色| 日本韩国一区二区三区| 精品国产凹凸成av人导航| 亚洲丝袜自拍清纯另类| 久久黄色级2电影| 在线观看亚洲精品| 国产视频一区在线观看| 亚洲成人免费在线观看| 成人黄色在线看| 欧美一卡二卡三卡四卡| 亚洲欧美一区二区三区孕妇| 国模一区二区三区白浆| 欧美日韩免费一区二区三区 | 久久久久青草大香线综合精品| 亚洲一区免费视频| 风间由美性色一区二区三区| 欧美疯狂做受xxxx富婆| 亚洲免费观看视频| 成人亚洲一区二区一| 欧美变态凌虐bdsm| 99在线精品免费| 久久久久青草大香线综合精品| 首页国产丝袜综合| 欧美在线一二三| 日韩伦理av电影| 国产白丝精品91爽爽久久| 精品日韩在线观看| 久久精品国产久精国产爱| 欧美巨大另类极品videosbest| 亚洲精品国产a久久久久久| 99久久综合精品| 国产欧美日韩精品一区| 黑人巨大精品欧美一区| 欧美不卡一区二区三区四区| 日韩中文字幕av电影| 欧美日韩在线三级| 亚洲资源中文字幕| 欧美视频你懂的| 亚洲第一综合色| 欧美日产在线观看| 亚洲超丰满肉感bbw| 欧美人牲a欧美精品| 五月婷婷另类国产| 欧美一区二区成人| 国内精品伊人久久久久av影院| 久久综合99re88久久爱| 成人天堂资源www在线|