Proxool连接池 使用
博客专区 > 之渊 的博客 > 博客详情
Proxool连接池 使用
之渊 发表于1年前
Proxool连接池 使用
  • 发表于 1年前
  • 阅读 22
  • 收藏 1
  • 点赞 0
  • 评论 0

移动开发云端新模式探索实践 >>>   

simultaneous-build-throttle: 是指在任一时刻,可以(同时)建立的最大连接数,也就是说,就是已经请求的、但还没可用的新连接数量。因为连接可以用多线程建立,从决定要建立连接到连接可用是需要一定时间的,所以我们需要一些方式来避免大量的线程想同时建立连接。(我们本应该找一个更聪明的方式来解决这个问题,总有一天我们会找到的)默认值是 10 当我使用140个用户,进行压力测试时,发现偶尔,会有多于10个要求同时建立连接的请求,当请求数量超过限定的数值时,会出现连接失败的情况。 因此结论就是,当数据库并发连接可能会比较高的应用,这个值应该适当的设大一点。 如果并发请求很高,可能出现的bug为

Caused by: java.sql.SQLException: We are already in the process of making 11 connections and the number of simultaneous builds has been throttled to 10

maximum-active-time: 如果一个线程活动时间超过这个数值,线程会被杀死。所以要确保这个数值设置得比最慢的响应时间长。默认是5分钟。守护进程会把连接池中多余的可用线程(未用的、超过这个时间的)杀死,最终保留的连接数量就是minimum-connection-count规定的数量。守护进程会根据house- keeping-sleep-time参数设置的时间隔定时检查。

maximum-connection-lifetime: 指一个连接最大的存活时间(毫秒为单位),超过这个时间,连接会被杀死。默认值是4小时。

overload-without-refusal-lifetime: 这个参数帮助我们确定连接池的状态,如果在这个时间阀值内(单位为毫秒)拒绝了一个连接,就认为是过载了。默认值是60。

alias:数据源的别名

driver-url:url连接串,须确定用户名和密码

driver-class:驱动名

username:用户名(proxool没有使用,但是不能没有)

password:密码(proxool没有使用,但是不能没有)

maximum-new-connections:没有空闲连接可以分配而在队列中等候的最大请求数,超过这个请求数的用户连接就不会被接受 ,已经过时了, simultaneous-build-throttle 这个来代替。

test-before-use: 如果连接池在运行当中,出现网络或者数据库故障而无法连接到数据库,在恢复正常以后,由于连接是在连接池中持久保存的,会出现连接仍然不可用的情况,这时连接池里的连接实际上都是坏连接,怎么让连接池可以自动重连清除这些坏连接呢? 只要配置了test-before-use 参数,即每次取出连接都检查连接是否可用,就可以做到让连接池实现在故障恢复后自动重连接

需要注意一点,对于Mysql数据库还必须在连接参数里加上autoReconnect=true 参数,否则即使打开了test-before-use 参数,仍然不能重连接!

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: proxool自动侦察各个连接状态的时间间隔(毫秒),侦察到空闲的连接就马上回收,超时的销毁 默认30秒)

house keeper 保留线程处于睡眠状态的最长时间,house keeper 的职责就是检查各个连接的状态,并判断是否需要销毁或者创建.

house-keeping-test-sql: 如果发现了空闲的数据库连接.house keeper 将会用这个语句来测试.这个语句最好非常快的被执行.如果没有定义,测试过程将会被忽略。

一般mysql可用select SYSDATE ,Oracle可用 select sysdate from dual 或者 select 1 from dual

injectable-connection-interface: 允许proxool实现被代理的connection对象的方法.

injectable-statement-interface: 允许proxool实现被代理的Statement 对象方法. injectable-prepared-statement-interface: 允许proxool实现被代理的PreparedStatement 对象方法. injectable-callable-statement-interface: 允许proxool实现被代理的CallableStatement 对象方法. jndi-name: 数据源的名称

maximum-active-time: 如果housekeeper 检测到某个线程的活动时间大于这个数值.它将会杀掉这个线程.所以确认一下你的服务器的带宽.然后定一个合适的值.默认是5分钟. maximum-connection-count: The maximum number of connections to the database. Default is 15. 最大的数据库连接数.默认是15 minimum-connection-count: 最小的数据库连接数,默认是5

prototype-count: 连接池中可用的连接数量.如果当前的连接池中的连接少于这个数值.新的连接将被建立(假设没有超过最大可用数).例如.我们有3个活动连接2个可用连接,而我们的prototype-count是4,那么数据库连接池将试图建立另外2个连接.这和 minimum-connection-count不同. minimum-connection-count把活动的连接也计算在内.prototype-count 是spare connections 的数量.

statistics: 连接池使用状况统计。 参数“10s,1m,1d” statistics-log-level: 日志统计跟踪类型。 参数“ERROR”或 “INFO”

trace: 如果为true,那么每个被执行的SQL语句将会在执行期被log记录(DEBUG LEVEL).你也可以注册一个ConnectionListener (参看ProxoolFacade)得到这些信息. verbose: 详细信息设置。 参数 bool 值

下面是我的配置


<bean id="dataSource" class="org.logicalcobwebs.proxool.ProxoolDataSource">
		<property name="driver" value="${db.driver}" />
		<property name="driverUrl" value="${db.url}" />
		<property name="user" value="${db.username}" />
		<property name="password" value="${db.password}" />
		<property name="alias" value="${db.alias}" />
		<!--这是我们可一次建立的最大连接数。那就是新增的连接请求,但还没有可供使用的连接。由于
		连接可以使用多线程,在有限的时间之间建立联系从而带来可用连接,
		但是我们需要通过一些方式确认一些线程并不是立即响应
		连接请求的,默认是10。  -->
		<property name="simultaneousBuildThrottle" value="${db.simultaneousBuildThrottle}" />
		<!--  如果housekeeper 检测到某个线程的活动时间大于这个数值.它将会杀掉这个线程.
		 所以确认一下你的服务器的带宽.然后定一个合适的值.默认是5分钟  -->
		<property name="maximumActiveTime" value="${db.maximumActiveTime}" />
		<!-- 自动侦察各个连接状态的时间间隔(毫秒),侦察到空闲的连接就马上回收,超时的销毁 默认30秒)  -->
		<property name="houseKeepingSleepTime" value="${db.houseKeepingSleepTime}" />
		<property name="houseKeepingTestSql" value="${db.houseKeepingTestSql}" />
		<property name="maximumConnectionCount" value="${db.maximumConnectionCount}" />
		<property name="minimumConnectionCount" value="${db.minimumConnectionCount}" />
		<!--在使用之前测试,是否可用连接  --> 
		<property name="testBeforeUse"  value="true" />
		<!-- 最少保持的空闲连接数(默认2个)  -->
		<property name="prototypeCount" value="${db.prototypeCount}" />
		<property name="delegateProperties" value="characterEncoding=${db.characterEncoding}" />
	</bean>

对应配置文件

db.alias=dbpool
db.simultaneousBuildThrottle=60
db.maximumActiveTime = 600000
db.houseKeepingSleepTime = 120000
# mysql 测试语句
#db.houseKeepingTestSql=select 1
#oracle 测试语句
db.houseKeepingTestSql=select sysdate from dual 
db.characterEncoding=UTF-8
#db.maximumConnectionCount=100
#db.minimumConnectionCount=30
db.maximumConnectionCount=100
db.minimumConnectionCount=30
db.prototypeCount = 5
jdbc.dbType=mysql
  • 打赏
  • 点赞
  • 收藏
  • 分享
共有 人打赏支持
粉丝 9
博文 479
码字总数 139473
×
之渊
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: