Java开发网 Java开发网
注册 | 登录 | 帮助 | 搜索 | 排行榜 | 发帖统计  

您没有登录

» Java开发网 » Java EE 综合讨论区  

按打印兼容模式打印这个话题 打印话题    把这个话题寄给朋友 寄给朋友    该主题的所有更新都将Email到你的邮箱 订阅主题
flat modethreaded modego to previous topicgo to next topicgo to back
作者 发现了个支持启发式的连接池,大家看一下怎么样..
VincentXie





发贴: 5
积分: 0
于 2007-11-16 10:06 user profilesend a private message to usersearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
此连接池是基于“异步的生产者消费者模型”,客户扮演的是完完全全的消费者角色,没有把任何建立连接,销毁连接对连接管理的操作交给客户去做,而是完全的让监听线程(生产者)做。无论是生产者还是消费者,在选择池的时候都会让调度程序调度到该池中,客户每次经过一定数量的尝试取得连接后,连接池管理器会根据最近的部分客户的尝试取得连接的次数作为调整因子,对连接池里面的连接作启发式调整。

这个连接池的一些***能:
1.  对过期的连接的回收,防止连接泄露
2.  支持多池提高并发量
3.  连接权限管理,只有申请该连接的客户才可用
4.  对Connection重构,close表示返回到池中
5.  异步的生产者消费者模型,最大量地减少请求者的动作负荷,减少申请释放连接的时间,提高请求连接的并发量
6.  对连接池里面的连接数量做启发式调控

配置文件Sample:
<ConnectionPool>
<DataBase>
<ListenerAmount>1</ListenerAmount>
<ListenerInterval>500</ListenerInterval>
<Name>MySql</Name>
<MaxConnection>30</MaxConnection>
<MinConnection>5</MinConnection>
<TimeForWait>3000</TimeForWait>
<TimeForConnActivity>10000</TimeForConnActivity>
<Driver>com.XXX.XXX</Driver>
<URL>mysql:jdbc//.......</URL>
<User>root</User>
<password>123456</password>
<MutiPool>5</MutiPool>
<ReConnectTimes>10</ReConnectTimes>
<Scheduler>FIFO</Scheduler>
<EvaluateRange>0.2</EvaluteRange>
<ConnMaxUse>20</ConnMaxUse>
</DataBase>
</ConnectionPool>

属性解释:
ListenerAmount:监听者数量(就是前面问题所说的生产者,一般1个就够了)
ListenerInterval:监听者监听间隔(尽量设置在1000毫秒之内)
Name:数据库名(每一个池的编号会在此名字后面)
MaxConnection:某一个池最大连接数量(不防把这个尽量地设置大点,让池管理者对流量评估的时候作调整)
MinConnection:某一个池最小连接数量(一开始每个连接池都会达到这个连接数量,这个建议设置在你估计的平均流量附近)
TimeFoeConnActivity:连接最长活动时间,超过后会自动回收,防止连接泄露
Driver:驱动路径
URL:数据库地址
User:数据库用户
Password:数据库用户密码
MutiPool:多池数量(提高并发量,尽量地多点吧,有利于提高并发)
TimeFowWait:重连的时候的等待时间(可以尽量少点,我是设置在20毫秒的)
ReConnectionTimes:当获取连接失败时重连次数(这里建议设置 > 多池数量)
Scheduler:对用户请求连接的调度算法(负载均衡,暂时支持FIFO和RAMDOM)
EvaluateRange:评估范围(0到1之间)(启发式设置,这里不能设置太大也不能太小,太大的话调整不精确,调整频率太少。设置太小的话,调整过于频繁,增加服务器负担;测试过0.2是个不错的选择)
ConnMaxUse:一个连接最多被分配的次数,之后将会被销毁

理论上的一秒并发量:所有池空闲连接的数量

############################################################################
示例使用:
import java.sql.Connection;

import com.vincentxie.connpool.PoolConfig;
import com.vincentxie.connpool.PoolConfigFactory;
import com.vincentxie.connpool.PoolManager;
import com.vincentxie.connpool.impl.PoolConfigFactoryImpl;
import com.vincentxie.connpool.impl.PoolManagerImpl;
import com.vincentxie.util.Log.Log;

public class test {
  public static void main (String args[]) {    
    
    Log.setLevel (4);    //设置输出级别[1,4],设置在4可以看包括Debug的所有输出

    PoolConfigFactory pcf = new PoolConfigFactoryImpl ();//创建配置文件解释工厂
    PoolManager pm = null;
    try {
      PoolConfig poolconfig = pcf.createPoolConfig("test.xml"); //解释配置文件
      pm = new PoolManagerImpl (poolconfig);  //产生池管理器
      //睡眠一定的时间让池管理器把要求的连接都预先建立好
      Thread.currentThread().sleep(10000);
    } catch (Exception e) {
      e.printStackTrace();
    }
    

    long starttime = System.currentTimeMillis();
    for (int i = 1; i <= 3000; i ++) {
      try {
        Connection conn = pm.getConnection();
        if (conn == null)
          throw new Exception ("获取连接失败,很可能是现在流量突然大于最大负荷");
        System.out.println ("获取连接成***.");
        
        // you can do something here.....
        
        Thread.currentThread().sleep(50);
        conn.close();  //让连接池回收此连接
        System.out.println ("关闭连接成***.");
      } catch (Exception e) {
        e.printStackTrace();
      }
    }
    long endtime = System.currentTimeMillis();
    endtime -= starttime;
    System.out.println ("单线程完成3000次需要的时间 = " + endtime);
    pm.close();    //关闭管理器并关闭所有的池和监听者
    
  }
}

<ConnectionPool>
<DataBase>
<ListenerInterval>500</ListenerInterval>
<ListenerAmount>1</ListenerAmount>
<Name>MySql</Name>
<MaxConnection>15</MaxConnection>
<MinConnection>3</MinConnection>
<TimeForWait>10</TimeForWait>
<TimeForConnActivity>10000</TimeForConnActivity>
<Driver>com.mysql.jdbc.Driver</Driver>
<URL>jdbc:mysql://localhost:3306/test</URL>
<User>root</User>
<password>123456</password>
<MutiPool>5</MutiPool>
<ReConnectTimes>7</ReConnectTimes>
<Scheduler>FIFO</Scheduler>
<EvaluateRange>0.2</EvaluateRange>
<ConnMaxUse>20</ConnMaxUse>
</DataBase>
</ConnectionPool>

作者EMail: vincentxie16@gmail.com

ConnectionPool.jar (37.01k)



作者 Re:发现了个支持启发式的连接池,大家看一下怎么样.. [Re:VincentXie]
VincentXie





发贴: 5
积分: 0
于 2007-11-16 10:08 user profilesend a private message to usersearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
注意:是基于1.5版本的,不支持1.5之前的

指java虚拟机


VincentXie edited on 2007-11-16 10:12

作者 Re:发现了个支持启发式的连接池,大家看一下怎么样.. [Re:VincentXie]
VincentXie





发贴: 5
积分: 0
于 2007-11-17 23:34 user profilesend a private message to usersearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
更新一下,升级到1.2版本,里面还包含比较详细的"使用说明"

ConnectionPool.rar (55.13k)



作者 Re:发现了个支持启发式的连接池,大家看一下怎么样.. [Re:VincentXie]
VincentXie





发贴: 5
积分: 0
于 2007-11-18 18:55 user profilesend a private message to usersearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
这个是Source

ConnectionPoolSource.rar (677.11k)




flat modethreaded modego to previous topicgo to next topicgo to back
  已读帖子
  新的帖子
  被删除的帖子
Jump to the top of page

   Powered by Jute Powerful Forum® Version Jute 1.5.6 Ent
Copyright © 2002-2021 Cjsdn Team. All Righits Reserved. 闽ICP备05005120号-1
客服电话 18559299278    客服信箱 714923@qq.com    客服QQ 714923