Proxool 使用说明


Proxool 使用说明 1. 配置 有如下几种配置方式: 1.1 当建立连接的时候传递一个 java.util.Properties 对象给数据库驱动。 Properties info = new Properties(); info.setProperty("proxool.maximum-connection-count", "20"); info.setProperty("proxool.house-keeping-test-sql", "select CURRENT_DATE"); info.setProperty("user", "sa"); info.setProperty("password", ""); String alias = "test"; String driverClass = "org.hsqldb.jdbcDriver"; String driverUrl = "jdbc:hsqldb:test"; String url = "proxool." + alias + ":" + driverClass + ":" + driverUrl; connection = DriverManager.getConnection(url, info); 1.2 使用 xml 文件。例如: xml-test jdbc:hsqldb:. org.hsqldb.jdbcDriver 10 select CURRENT_DATE 然后在你的启动代码中简单的调用 xml configurator(JAXPConfigurator): JAXPConfigurator.configure("src/java-test/org/logicalcobwebs/proxool/configuration/test-no -ns.xml", false);//false 意味着没有验证 也可以使用一个 servlet 来装载配置文件: ServletConfigurator org.logicalcobwebs.proxool.configuration.ServletConfigurator xmlFile WEB-INF/proxool.xml 1 建立连接非常简单("xml-test"是上面我们用的别名) connection = DriverManager.getConnection("proxool.xml-test"); 注意:需要 include 一个 JAXP xml 解析器,比如 Crimson 或 Xerces。 1.3 使用 properties 文件。例如: jdbc-0.proxool.alias=property-test jdbc-0.proxool.driver-url=jdbc:hsqldb:. jdbc-0.proxool.driver-class=org.hsqldb.jdbcDriver jdbc-0.user=sa jdbc-0.password= jdbc-0.proxool.maximum-connection-count=10 jdbc-0.proxool.house-keeping-test-sql=select CURRENT_DATE 第一个词语必须以”jdbc”开头,后面随意。使用唯一的名称来区分每个连接池。任何没 有以”jdbc”开头的属性都将被忽略。以” proxool”为前缀的属性,被 Proxool 使用,否则被传 递给 JDBC 驱动使用。 在启动代码中做如下调用: PropertyConfigurator.configure("src/java-test/org/logicalcobwebs/proxool/configuration/test. properties"); 可以使用一个 servlet 来装载配置文件: ServletConfigurator org.logicalcobwebs.proxool.configuration.ServletConfigurator propertyFile WEB-INF/proxool.properties 1 建立连接: ("xml-test"是上面我们用的别名) connection = DriverManager.getConnection("proxool.property-test"); 1.4 编码的方式。例如: Class.forName("org.logicalcobwebs.proxool.ProxoolDriver"); Properties info = new Properties(); info.setProperty("proxool.maximum-connection-count", "10"); info.setProperty("proxool.house-keeping-test-sql", "select CURRENT_DATE"); info.setProperty("user", "sa"); info.setProperty("password", ""); String alias = "test"; String driverClass = "org.hsqldb.jdbcDriver"; String driverUrl = "jdbc:hsqldb:test"; String url = "proxool." + alias + ":" + driverClass + ":" + driverUrl; ProxoolFacade.registerConnectionPool(url, info); 建立连接:("test"是上面我们用的别名) connection = DriverManager.getConnection("proxool.test"); 1.5 servlet 初始化参数 ServletConfigurator org.logicalcobwebs.proxool.configuration.ServletConfigurator jdbc-0.proxool.alias test jdbc-0.proxool.driver-url jdbc:hsqldb:. jdbc-0.proxool.driver-class org.hsqldb.jdbcDriver 1 1.6 DataSource 2. 属性 以下列出所有的属性和解释: fatal-sql-exception: 它是一个逗号分割的信息片段。当一个 SQL 异常发生时,它的异常信息将与这个信息 片段进行比较。如果在片段中存在,那么这个异常将被认为是个致命错误(Fatal SQL Exception )。这种情况下,数据库连接将要被放弃。无论发生什么,这个异常将会被重掷以 提供给用户。用户最好自己配置一个不同的异常来抛出。 fatal-sql-exception-wrapper-class: 正如上面所说,你最好配置一个不同的异常来重掷。利用这个属性,用户可以包装 SQLException,使他变成另外一个异常。这个异常或者继承 SQLException 或者继承字 RuntimeException。proxool 自带了 2 个实现: org.logicalcobwebs.proxool.FatalSQLException 和 org.logicalcobwebs.proxool.FatalRuntimeException。后者更合适。 house-keeping-sleep-time: 管家线程休眠时间。管家线程每隔此段时间(一般大于此时间 5 到 10 秒),就会醒来一 次,检查各个连接的状态,并判断是否需要销毁或者创建。默认值为 30 秒。 house-keeping-test-sql: 如果发现了空闲的数据库连接,管家线程将会用这个语句来测试。这个语句最好非常快 的被执行,如果没有定义,测试过程将会被忽略。 injectable-connection-interface: 允许 proxool 实现被代理的 connection 对象的方法. injectable-statement-interface: 允许 proxool 实现被代理的 Statement 对象方法. injectable-prepared-statement-interface: 允许 proxool 实现被代理的 PreparedStatement 对象方法. injectable-callable-statement-interface: 允许 proxool 实现被代理的 CallableStatement 对象方法. jmx: 如果为 true,则线程池将被作为一个 MBean 注册到 JMX server,使用对象名: Proxool:type=Pool, name=。默认为 false。 jmx-agent-id: 逗号分隔的 jmx agent ids。 jndi-name: 数据源的名称。 maximum-active-time: 如果管家线程检测到某个线程的活动时间大于这个数值,它将会杀掉这个线程。默认是 5 分钟。 maximum-connection-count: 最大的数据库连接数。默认为 15。 maximum-connection-lifetime: 一个连接的最大寿命。默认为 4 小时。 minimum-connection-count: 最小的数据库连接数,不管有没有被用到。默认为 5。 overload-without-refusal-lifetime: 在这个时间范围内,如果出现拒绝连接,则表明超负荷了。默认值为 60 秒。 prototype-count: 连接池中可用的连接数量。如果当前的连接池中的连接少于这个数值,新的连接将被建 立(假设没有超过最大可用数)。例如,我们有 3 个活动连接,2 个可用连接,而我们的 prototype-count 是 4 ,那么数据库连接池将试图建立另外 2 个 连 接 。 这 和 minimum-connection-count 不同,minimum-connection-count 把活动的连接也计算在内, prototype-count 是 spare connections 的数量。默认值为 0。 recently-started-threshold: 默认值为 60 秒。 simultaneous-build-throttle: 一次可以建立起连接的最大数目。也就是连接池接受了新建连接的请求,但还不可用的 连接数目。默认为 10。 statistics: 连接池使用状况统计。可用的时间单元为 s(秒),m(分钟),h(小时),d(填)。例如: “10s,1m,1d”。默认为 null(不统计)。 statistics-log-level: 统计的日志级别。范围:DEBUG, INFO, WARN, ERROR, FATAL。默认为 null(不记 日志)。 test-before-use: 如果设置为 true,每个连接在提供服务前将被测试(使用 house-keeping-test-sql 中定 义的语句)。如果测试失败了,则此连接将被放弃,进而选择另外的一个连接。如果所有的 连接都失败了,则新建一个连接。如果新建连接也失败了,会抛出 SQLException。 test-after-use: 在连接被关闭(归还入连接池)后,执行此测试。 trace: 如果为 true,那么每个被执行的 SQL 语句将会在执行期被 log 记录(DEBUG LEVEL)。 你也可以注册一个 ConnectionListener (参看 ProxoolFacade)得到这些信息。默认为 false。 verbose: 详细信息设置。为 bool 值,默认为 false。 3. 监控 可以配置 Proxool,收集其当前运行状态等相关统计数据。有四种方式: 3.1 AdminServlet 如果使用支持 java servlet 的 web 应用程序,可以用下面这个 servlet 配置应用程序: proxool org.logicalcobwebs.proxool.admin.AdminServlet proxool /admin 在浏览器地址栏里请求这个 servlet,得到如下页面: ”Definition” - 显示连接池所有配置属性和值。 “Snapshot” - 显示内容较多。主要显示当前活跃连接数,可用连接数,最大连接数。点 击每个连接编号,显示此连接详细参数和执行过的所有 sql 语句。 “Statistics” – 统计页面,按 statistics 配置(秒,分钟,小时,天)的时间间隔分别进行 统计,一个时间段为一张表格。内容为在此时间段内使用的连接数目,拒绝连接数目,每个 连接的活跃时间,级别。 4. 日志 默认所有日志均被输出到 stdout。Proxool 使用 Jakarta's Commons' Logging。也直接支持 Log4J,LogKit,JDK 1.4 这几个日志库。 可以配置根 Logger,proxool 的日志全部输出到此目的地中: log4j.rootLogger = [ level ] , appenderName, appenderName, ... 也可以指定 org.logicalcobwebs.proxool 包下的所有日志输出到指定目的地中。 log4j.category.org.logicalcobwebs.proxool= [ level ] , appenderName, appenderName, ... 也可以分别配置不同的连接池输出到不同的目的地,例如: log4j.appender.PoolMGserverAppender=org.apache.log4j.DailyRollingFileAppender log4j.appender.PoolMGserverAppender.file=E:/log/dbtest/Pool_MGserver_DailyRolling.log log4j.appender.PoolMGserverAppender.DatePattern='.'yyyy-MM-dd log4j.appender.PoolMGserverAppender.layout=org.apache.log4j.PatternLayout log4j.appender.PoolMGserverAppender.layout.ConversionPattern=%d{yyyyMMddHHmmss} - %p - 32 - %m%n log4j.category.org.logicalcobwebs.proxool.Pool_MGserver=debug,PoolMGserverAppender 格式:log4j.category.org.logicalcobwebs.proxool.XXX。“XXX”为连接池的别名。 5. 测试 测试为 DBCP 与 Proxool 之间的对比测试。 5.1 功能测试 DBCP 属性设置 Proxool 属性设置 maxActive="10" maxWait="5000" removeAbandoned="true" removeAbandonedTimeout="10" logAbandoned="true" maximum-connection-count="10" house-keeping-sleep-time="20000" maximum-active-time="10000" maximum-connection-lifetime="3000 0" A. 操作:服务端为一 servlet,客户端请求这个 servlet 以后,servlet 会相继与数据库建立 9 条连接,并用每条连接从数据库查询一条记录,完成后不关闭连接。 结果:10 秒之后,DBCP 日志记录没有任何变化。Proxool 在 18 秒左右打印日志: #0002 removed because it has been active for too long. #0002 was active for 19047 milliseconds and has been removed automaticaly. The Thread responsible was named 'http-8080-1', and the last SQL it performed is 'select * from tbl_mg_samplelib where splb_seqnum = 100; '. 结论:连接超时后 DBCP 没有回收连接,proxool 可以回收。 B. 操作:客户端请求服务端 servlet 以后,servlet 会相继与数据库建立 9 条连接,并用每 条连接从数据库查询一条记录,接着休眠 30 秒,使用前面建立的 9 条连接再次到数据库查 询记录,完成后不关闭连接。 结果:DBCP 建立 9 条连接查询出数据,30 秒后,使用此连接仍然可以查出数据。 Proxool 查询出数据,30 秒后,报出:SQLException: Couldn’t perform the operation createStatement: You can,t perform any operations on this connection. It has been automatically closed by Proxool for some reasons(see logs). 结论:DBCP 连接超时后不会被自动释放,Proxool 可以。 C. 操作:使用 Resultset 从数据库里查询数据,共有 108 行数据,每查出一行就休眠一秒。 结果:DBCP 完整的查询出 108 条记录。 Proxool 在查出 16 笔数据后,报出:SQLException: 用尽的 Resultset. 结论:DBCP 超时不会释放连接。Proxool 连接即使在正在使用的情况下,超时了,也 会被回收。 5.2 性能测试 DBCP 属性设置 Proxool 属性设置 maxActive="200" maxIdle="20" maxWait="10000" removeAbandoned="true" removeAbandonedTimeout="300" logAbandoned="true" maximum-connection-count="200" minimum-connection-count="10" house-keeping-sleep-time="30000" maximum-active-time="300000" maximum-connection-lifetime="1440 0000" simultaneous-build-throttle="100" 操作:使用 Jmeter,起 100 个线程,模拟用户向手机卫士服务端循环发收注册报文,持 续 10 分钟时间。分别更换 DBCP,Proxool 作为连接池做 3 次测试,对比测试结果。 结果: DBCP,第一次: 第二次: 第三次: Proxool,第一次: 第二次: 第三次: 结论:在较大,较长时间的压力负载下,DBCP 和 Proxool 的性能不相上下,大致相同。
还剩13页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 15 金币 [ 分享pdf获得金币 ] 1 人已下载

下载pdf

pdf贡献者

shenhuafir

贡献于2012-02-24

下载需要 15 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!
下载pdf