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就行 |