`

连接池之四

    博客分类:
  • java
阅读更多

//简单连接池之四
public class RedisPool5 {

 public static void main(String[] args) {
  RedisPool5 pool = new RedisPool5(10,20,5);
  try {
   for(int i=0;i<280;i++) {
    Thread t1 = new TestThread2("t"+i, pool);
    t1.start();
    t1.join();
   }
  } catch (InterruptedException e) {
   e.printStackTrace();
  }
  pool.close();
 }

 
 //private Vector<JedisExt> list = new Vector<JedisExt>();
 //private List<JedisExt> list = new LinkedList<JedisExt>();
 private BlockingQueue<JedisExt> list = new LinkedBlockingQueue<JedisExt>();
 private int size; //当前正使用的连接数
 private int maxSize;
 private int minSize;
 
 public RedisPool5(int size,int maxSize,int minSize) {
  this.size = size;
  this.maxSize = maxSize;
  this.minSize = minSize;
  init();
 }
 
 private void init() {
  JedisExt je = null;
  try {
  for(int i=0;i<this.size;i++) {
   je = new JedisExt(initConnection());
     list.offer(je, 10, TimeUnit.SECONDS);
  }
  } catch (InterruptedException e) {
   e.printStackTrace();
  }
 }
 
 public JedisExt getConnection() {
  //先从闲置中获取,从list删除
  JedisExt j = null;
  try {
   for(int i=0;i<list.size();i++) {
    //j = list.get(i);
    j = list.take();
    if(!j.isused) {
     System.out.println("获取连接..");
     j.setIsused(true); //使用中
     return j;
    }
   }
  } catch (InterruptedException e) {
   e.printStackTrace();
  }
  //创建新的连接
  if(size<maxSize) {
   System.out.println("创建新连接..");
   size++;
   JedisExt je = new JedisExt(initConnection(), true);
   //list.add(je);
   return je;
  }
  //已到最大连接数返回空
  System.out.println("无连接..");
  return null;
 }
 
 //关闭所有连接
 public void close() {
  JedisExt je = null;
  try {
   for(int i=0;i<list.size();i++) {
    je = list.take();
    je.getJedis().close();
   }
  } catch (InterruptedException e) {
   e.printStackTrace();
  }
  list.clear();
  this.size = 0;
 }
 
 //释放连接
 public void release(JedisExt e) {
  e.setIsused(false);
  //list.add(e); //加入list
  try {
   list.offer(e, 10, TimeUnit.SECONDS);
  } catch (InterruptedException e1) {
   e1.printStackTrace();
  }
  //size++;
 }
 
 private class JedisExt extends Jedis{
  private boolean isused = false; //是否空闲
  private Jedis jedis;
  
  public JedisExt(Jedis j) {
   this.jedis = j;
  }
  
  public JedisExt(Jedis j, boolean isused) {
   this.jedis = j;
   this.isused = true;
  }

  public synchronized boolean isIsused() {
   return isused;
  }

  public synchronized void setIsused(boolean isused) {
   this.isused = isused;
  }
  
  public void close() {
   this.setIsused(false); //未使用
   //this.jedis.close();
  }

  public synchronized Jedis getJedis() {
   return jedis;
  }

 }
 
 //获取单个连接
 private static Jedis initConnection(){
  String host = "192.168.19.1";
     Jedis client = new Jedis(host, 6379);
     return client;
 }
 
 private static class TestThread2 extends Thread{
  private RedisPool5 pool;
  public TestThread2(String name, RedisPool5 pool) {
   super(name);
   this.pool = pool;
  }
  
  public void run() {
   try {
    Thread.sleep(new Random().nextInt(100));
   } catch (InterruptedException e1) {
    e1.printStackTrace();
   }
   JedisExt e = pool.getConnection();
   boolean b = false;
   if(e!=null) {
    b = e.isIsused();
   }
   System.out.println(e + " " + b);
   try {
    Thread.sleep(new Random().nextInt(600));
   } catch (InterruptedException e1) {
    e1.printStackTrace();
   }
   //释放连接
   if(e!=null)
   pool.release(e);
  }
 }
}

分享到:
评论

相关推荐

    常用四大连接池集合

    常用四大连接池集合c3p0,dbcp,druid,HikariCP,内有四大连接池的使用方法,配置方法,以及它们之间的比较和介绍,和spring继承等配置方法。 c3p0 太古老,代码及其复杂,不利于维护。貌似都比它强。 dbcp 是 ...

    R2数据库连接池高性能连接池v1.3

    v1.3改进了清理线程可能出现的减少连接池中链接而不计数的问题。 v1.2处理了oracle环境下由于服务器关闭休眠链接造成的连接池循环检测进程异常退出的情况,改为当循环周期大于服务器关闭休眠链接间隔时,后台打印...

    FTPClient连接池

    使用apache的commons-pool2 构建 FTPClient连接池 有FtpClientFactory、FtpClientPool、FtpConfig、FtpOperate 四个类组成 还有ftp连接池的一些配置参数信息在ftp.properties文件中 注释完整欢迎大家下载使用

    基于Java数据库连接池的研究与创新

    本文首先介绍了传统连接、tomcat下连接池和hibernate下连接池的基本原理,然后在此基础上提出了一种改进的新型连接池方法,最后基于Java语言对四种连接方法进行了仿真模拟。通过实验测试及连接时间的对比分析,看到...

    java高性能数据库连接池V2.0

    数据库连接池,是一种相当实用的应用程序。它可以保存、维护及创建用户所需的数据库连接。从而使得用户得到一个连接的时间降低90%以上。大大提升了数据库访问的反应时间。 这个是一个开源的代码。大家可以修改它、...

    R2高性能数据库连接池v1.5源码

    R2 jdbc连接池,用于java程序中jdbc连接池的配置管理,可应用于非web项目(纯java项目),全参数化配置。 应用时,先用rar打开jar包,拷贝r2.properties文件到class目录,并修改参数。 本包需要用到log4j,请在调用...

    Tomcat连接池配置四步走

    Tomcat连接池配置四步走 Tomcat6根目录下, conf文件夹下面:修改context.xml文件

    java高性能数据库连接池V5.0

    数据库连接池,是一种相当实用的应用程序。它可以保存、维护及创建用户所需的数据库连接。从而使得用户得到一个连接的时间降低90%以上。大大提升了数据库访问的反应时间。 这个是一个开源的代码。大家可以修改它、...

    实现Log4j连接池

    log4j功能强大,但是将日志写入数据库,感觉其性能相当差,究其原因是:log4j在每写一次日志的时候都建立和释放一个数据库连接,系统的性能消耗在频繁建立昂贵的连接...本例简单的实现Log4j连接池,一起学习,不吝赐教

    dao--4.连接池

    dao--4.连接池

    JDBC常用连接池 c3p0 BDCP Druid

    开发时常用的连接池jar包 C3P0是一个开放源代码的JDBC连接池,它在lib目录中与Hibernate一起发布,包括了实现jdbc3和jdbc2扩展规范说明的Connection 和Statement 池的DataSources 对象 DBCP (Database Connection ...

    Redis 、Redis 连接池、JedisPool

    1.全网最强最好用redis 封装连接池,redis 配置详解 2.jar 内置最全 最安全的两种redis 连接池 创建方式(synchronized and look), 3.通过了自己公司生产环境的检测 4.使用方法:只需要将jar 放入项目 lib 下面 ...

    Druid连接池以及C3P0

    有druid以及C3P0连接池的各种jar包,希望各位多多支持,有需要的给我多关注。谢谢各位!

    java手写数据库连接池

    java手写数据库连接池,使用maven构建,一共有四个类方法,一个是测试类,测试类使用三个线程去操数据库连接

    hibernate 连接池配置详解

    hibernate 连接池配置详解,四种连接方式:第一种方案,Hibernate默认连接池;第二种方案是:C3P0;第三种方案是:dbcp;第四种方案是:Proxool (推荐)

    OTL连接池(更新)

    MyPOOL_new.zip 优化更新后的OTL连接池 main.cpp COTLPool.cpp COTLPool.h otlv4.h Makefile

    连接池原来这么简单

    上述伪代码忽略了一些细节,在实现连接池中是需要考虑的: (1)如果连接全部被占用,是返回失败,还是让上游等待 (2)需要实施连接可用性检测 (3)为了让调用方更友好,可能还需要包装一层DAO层,让“连接”这个...

    基于JDBC的数据库连接池技术研究与应用

    1、并发问题 2、多数据库服务器和多用户 3、事务处理 4、连接池的分配与释放 5、连接池的配置与维护 连接池模型

    Redis 连接池(升级)

    内置两种模式的超强安全连接(JedisUtil_Synchronized 和 JedisUtil_ReentrantLock ),经过公司生产环境的检验,采用RedisPool.jar + redis.properties 组合,用户可快速、安全、自定义的创建连接池; 方法: 1....

    otl连接池.zip

    由于项目需要,自己写的otl连接池. 包含以下文体 otlv4.h COTLPool.cpp COTLPool.h main.cpp makefile

Global site tag (gtag.js) - Google Analytics