熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

Proxool 0.9.1的配置與應用

2022-06-13   來源: Java核心技術 

  Proxool老牌的數據庫連接池了褒貶不一性能上還行目前最新版本是相對之前版本的配置有些變動這裡以MySQL為例做一個簡單數據庫連接池配置

  環境

  MySQLx

  JDK

  Proxool

  一配置文件

  proxoolxml

  <?xml version= encoding=UTF?>

  <somethingelseentirely>

  <proxool>

  <alias>ds</alias>

  <!數據源的別名>

  <driverurl>jdbc:mysql://:/testdb?useUnicode=true&characterEncoding=utf&autoReconnect=true&zeroDateTimeBehavior=convertToNull</driverurl>

  <!url連接串>

  <driverclass>commysqljdbcDriver</driverclass>

  <!驅動類>

  <driverproperties>

  <property name=user value=vcom/>

  <!用戶名>

  <property name=password value=vcom/>

  <!密碼>

  </driverproperties>

  <! 是指在任一時刻可以(同時)建立的最大連接數也就是說就是已經請求的但還沒可用的新連接數量>

  <simultaneousbuildthrottle></simultaneousbuildthrottle>

  <!最大連接數(默認個)超過了這個連接數再有請求時就排在隊列中等候最大的等待請求數由maximumnewconnections決定 >

  <maximumconnectioncount></maximumconnectioncount>

  <!最小連接數(默認個)>

  <minimumconnectioncount></minimumconnectioncount>

  <!proxool自動偵察各個連接狀態的時間間隔(毫秒)偵察到空閒的連接就馬上回收超時的銷毀 默認>

  <housekeepingsleeptime></housekeepingsleeptime>

  <!最少保持的空閒連接數(默認個)>

  <prototypecount></prototypecount>

  <!在使用之前測試>

  <testbeforeuse>true</testbeforeuse>

  <!用於保持連接的測試語句 >

  <housekeepingtestsql>select </housekeepingtestsql>

  </proxool>

  </somethingelseentirely>

  粗體部分是變化部分上面有詳細說明!

  二測試類

  package lavasoft;

  import monsloggingLog;

  import monsloggingLogFactory;

  import orglogicalcobwebsproxoolProxoolException;

  import orglogicanfigurationJAXPConfigurator;

  import javaioFileNotFoundException;

  import javaioIOException;

  import javasql*;

  import javautilList;

  import javautilProperties;

  /**

  * 簡單的JDBC工具類

  *

  * @author leizhimin ::

  */

  public class MyDB {

  private static final Log log = LogFactorygetLog(MyDBclass);

  private static final boolean useDBPool = true;    //是否使用數據庫連接池

  private static String dburl = null;

  private static String user = null;

  private static String password = null;

  private static Properties props = new Properties();

  static {

  init();

  }

  public static void init() {

  if (useDBPool) {

  try {

  nfigure(proxoolxml false);

  //                                nfigure(src/proxoolxml false);

  } catch (ProxoolException e) {

  eprintStackTrace();

  }

  return;

  }

  try {

  //                        propsload(new FileInputStream(/jdbcproperties));

  propsload(MyDBclassgetResourceAsStream(/jdbcproperties));

  } catch (IOException e) {

  logerror(#ERROR# :系統加載sysconfigproperties配置文件異常請檢查! e);

  }

  dburl = propsgetProperty(jdbcurl);

  user = propsgetProperty(jdbcusername)trim();

  password = propsgetProperty(jdbcpassword)trim();

  Systemoutprintln(dburl);

  Systemoutprintln(user);

  Systemoutprintln(password);

  //注冊驅動類

  try {

  ClassforName(propsgetProperty(jdbcdriver));

  } catch (ClassNotFoundException e) {

  logerror(#ERROR# :加載數據庫驅動異常請檢查! e);

  throw new RuntimeException(e);

  }

  }

  public static void main(String[] args) throws FileNotFoundException {

  for (int i = ; i < ; i++) {

  Connection conn = getConnection();

  Systemoutprintln(conn == null ? 沒連上 : 連上了);

  //                        Systemoutprintln();

  //                closeConnection(conn);

  }

  }

  /**

  * 創建一個數據庫連接

  *

  * @return 一個數據庫連接

  */

  public static Connection getConnection() {

  Connection conn = null;

  //根據連接池配置創建數據庫連接

  if (useDBPool) {

  try {

  conn = DriverManagergetConnection(proxoolds);

  } catch (SQLException e) {

  logerror(#ERROR# :無法從數據庫連接池獲取到數據庫連接!);

  throw new RuntimeException(e);

  }

  return conn;

  }

  //根據JDBC配置創建數據庫連接

  try {

  conn = DriverManagergetConnection(dburl user password);

  } catch (SQLException e) {

  logerror(#ERROR# :創建數據庫連接發生異常請檢查! e);

  throw new RuntimeException(e);

  }

  return conn;

  }

  /**

  * 在一個數據庫連接上執行一個靜態SQL語句查詢

  *

  * @param conn            數據庫連接

  * @param staticSql 靜態SQL語句字符串

  * @return 返回查詢結果集ResultSet對象

  */

  public static ResultSet executeQuery(Connection conn String staticSql) {

  ResultSet rs = null;

  try {

  //創建執行SQL的對象

  Statement stmt = conncreateStatement();

  //執行SQL並獲取返回結果

  rs = stmtexecuteQuery(staticSql);

  } catch (SQLException e) {

  logerror(#ERROR# :執行SQL語句出錯請檢查!\n + staticSql e);

  throw new RuntimeException(e);

  }

  return rs;

  }

  /**

  * 在一個數據庫連接上執行一個靜態SQL語句

  *

  * @param conn            數據庫連接

  * @param staticSql 靜態SQL語句字符串

  */

  public static void executeSQL(Connection conn String staticSql) {

  try {

  //創建執行SQL的對象

  Statement stmt = conncreateStatement();

  //執行SQL並獲取返回結果

  stmtexecute(staticSql);

  } catch (SQLException e) {

  logerror(#ERROR# :執行SQL語句出錯請檢查!\n + staticSql e);

  throw new RuntimeException(e);

  }

  }

  /**

  * 在一個數據庫連接上執行一批靜態SQL語句

  *

  * @param conn        數據庫連接

  * @param sqlList 靜態SQL語句字符串集合

  */

  public static void executeBatchSQL(Connection conn List<String> sqlList) {

  try {

  //創建執行SQL的對象

  Statement stmt = conncreateStatement();

  for (String sql : sqlList) {

  stmtaddBatch(sql);

  }

  //執行SQL並獲取返回結果

  stmtexecuteBatch();

  } catch (SQLException e) {

  logerror(#ERROR# :執行批量SQL語句出錯請檢查! e);

  }

  }

  public static void closeConnection(Connection conn) {

  if (conn == null) return;

  try {

  if (!connisClosed()) {

  //關閉數據庫連接

  connclose();

  }

  } catch (SQLException e) {

  logerror(#ERROR# :關閉數據庫連接發生異常請檢查! e);

  throw new RuntimeException(e);

  }

  }

  }

  運行結果

  [INFO] :: [orglogicalcobwebsproxoolProxoolFacade] Proxool (Aug :)

  連上了

  連上了

  連上了

  連上了

  連上了

  [INFO] :: [orglogicalcobwebsproxoolds] Shutting down ds pool immediately [Shutdown Hook]

  [INFO] :: [orglogicalcobwebsproxoolConnectionPool] Waiting until Thu Feb :: CST for all connections to become inactive (active count is )

  [WARN] :: [orglogicalcobwebsproxoolConnectionPool] Shutdown waited for milliseconds for all the connections to become inactive but the active count is still Shutting down anyway

  [INFO] :: [orglogicalcobwebsproxoolPrototyperController] Stopping Prototyper thread

  [INFO] :: [orglogicalcobwebsproxoolHouseKeeperController] Stopping HouseKeeper thread

  Process finished with exit code

  Proxool提供的配置方式很多這裡進選擇最常用的xml方式另外的方式也很簡單可以參看官方文檔

  

  

  三Proxool很扯蛋的問題找不到配置文件

  proxool的配置文件加載做的比較差勁通過兩個類來加載配置文件

  orglogicanfigurationPropertyConfigurator

  orglogicanfigurationServletConfigurator

  orglogicanfigurationXMLConfigurator

  orglogicanfigurationJAXPConfigurator

  orglogicanfigurationAvalonConfigurator

  這幾個類加載配置文件時候常常會提示找不到配置文件其原因是proxool在讀取CLASSPATH下路徑有問題經常看到一種情況就是在開發環境IDE環境下面測試通過在打包後脫離IDE環境獨立運行時候就提示找不到配置文件這裡有一個簡單的解決方法就是不要使用文件名指定配置文件而是通過讀取CLASSPATH下的配置文件流形成字節流傳遞給配置工具類來實現比如

  public static void init() {

  //初始化數據庫連接配置參數

  InputStream in = MyDBclassgetResourceAsStream(/proxoolxml);

  Reader reader = null;

  try {

  reader = new InputStreamReader(in GBK);

  } catch (UnsupportedEncodingException e) {

  eprintStackTrace();

  }

  try {

  nfigure(reader false);

  } catch (ProxoolException e) {

  eprintStackTrace();

  }

  }

  在初始化Proxool環境的時候千萬不要把第二個驗證參數設置為true否則老提示驗證失敗但是配置文件語法什麼都沒錯這個問題我僅僅發現了但沒找到根本原因解決辦事是只需要將其設置為false就行


From:http://tw.wingwit.com/Article/program/Java/hx/201311/25682.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.