`

连接池之二

    博客分类:
  • java
阅读更多

//简单连接池之二
public class RedisPool2 {

 public static void main(String[] args) {
  RedisPool2 pool = new RedisPool2(10,20,5);
  try {
   for(int i=0;i<28;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 int size; //当前正使用的连接数
 private int maxSize;
 private int minSize;
 
 public RedisPool2(int size,int maxSize,int minSize) {
  this.size = size;
  this.maxSize = maxSize;
  this.minSize = minSize;
  init();
 }
 
 private void init() {
  JedisExt je = null;
  for(int i=0;i<this.size;i++) {
   je = new JedisExt(initConnection());
   this.list.add(je);
  }
 }
 
 public synchronized JedisExt getConnection() {
  //先从闲置中获取,从list删除
  JedisExt j = null;
  for(int i=0;i<size;i++) {
   //j = list.get(i);
   j = list.remove(i);
   if(!j.isused) {
    System.out.println("获取连接..");
    j.setIsused(true); //使用中
    return j;
   }
  }
  //创建新的连接
  if(size<maxSize) {
   System.out.println("创建新连接..");
   size++;
   JedisExt je = new JedisExt(initConnection(), true);
   //list.add(je);
   return je;
  }
  //已到最大连接数返回空
  System.out.println("无连接..");
  return null;
 }
 
 //关闭所有连接
 public synchronized void close() {
  JedisExt je = null;
  for(int i=0;i<list.size();i++) {
   je = list.get(i);
   je.getJedis().close();
  }
  list.clear();
  this.size = 0;
 }
 
 //释放连接
 public synchronized void release(JedisExt e) {
  e.setIsused(false);
  list.add(e); //加入list
  //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 RedisPool2 pool;
  public TestThread2(String name, RedisPool2 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);
  }
 }
}

0
0
分享到:
评论

相关推荐

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

    R2Pool pool2=R2PoolUtil.getPool(new File("第二个连接池的配置文件.properties")); Connnection conn2 = pool2.getConnection(); 修改源代码,请保留作者信息 张人杰 北京师范大学 计算机系 alex.zhangrj...

    hibernate连接池.doc

    二、默认情况下(即没有配置连接池的情况下),Hibernate会采用内建的连接池。但这个连接池性能不佳,且存在诸多BUG(笔者就曾在Mysql环境下被八小时连接悬空问题困扰过),因此官方也只是建议仅在开发环境下使用。 ...

    FTPClient连接池

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

    SpringBoot2.2+commons-pool2实现多Ftp连接池完整项目,开箱即用,经过长期生产使用稳定可靠

    使用JDK1.8、SpringBoot2.2.10.RELEASE、lombok1.18.8、guava23.0、hutool5.3.10、commons-pool2 2.7.0、tika1.22等实现多Ftp连接池实现,通过守护线程实现连接池内连接可用性校验,配置最大、最小连接个数防止Ftp...

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

    R2Pool pool2=R2PoolUtil.getPool(new File("第二个连接池的配置文件.properties")); Connnection conn2 = pool2.getConnection(); 修改源代码,请保留作者信息 张人杰 北京师范大学 计算机系 alex.zhangrj@hotmail...

    常用jdbc数据库连接jar包,数据库连接池jar包

    收集了常见的数据库连接jar包,包括oracle、mysql、sql server、db2、opta、dbcp连接池、c3p0连接池等等常见的数据库jar包,不断更新中。

    springboot2配置Lettuce连接池完整代码

    springboot2配置Lettuce连接池完整代码,采用common2-pool连接池,Lettuce为redis高级客户端,由于阅读官网文档太简单,无法完成配置,所有本示例是通过阅读源码后编写的

    struts2示例(包括tomcat连接池)

    struts2示例(包括tomcat连接池)struts2示例(包括tomcat连接池)struts2示例(包括tomcat连接池)

    Struts框架中使用数据库连接池

    在struts中配置连接池,已经连接池池的相关配置。

    j2ee开发连接池的配置

    j2ee开发连接池的配置 j2ee开发连接池的配置

    EsClientPoolFactory.java(es连接池工厂类)

    使用过Elasticsearch RestFul API的都知道,在Java端使用是ES服务需要创建Java Client,但是每一次连接都实例化一个client,对系统的消耗很大,而且最令人头疼的是它的连接非常慢。所以为了解决上述问题并提高client...

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

    R2Pool pool2=R2PoolUtil.getPool(new File("第二个连接池的配置文件.properties")); Connnection conn2 = pool2.getConnection(); 修改源代码,请保留作者信息 张人杰 北京师范大学 计算机系 alex.zhangrj@...

    数据源和连接池

    在实际项目的开发中,特别是web应用程序中,如Jsp,Servlet或EJB使用JDBC直接访问数据库中的...使用数据库连接池技术是解决上述问题的最常用的方法,在许多应用服务器(如 websphere, weblogic ,jBoss)中都提供了这种技术

    hibernate以及连接池

    hibernate的学习资料,以及连接池和二级缓存

    补充 数据库连接池.ppt

    补充 数据库连接池

    JDBC常用连接池 c3p0 BDCP Druid

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

    Redis 、Redis 连接池、JedisPool

    2.jar 内置最全 最安全的两种redis 连接池 创建方式(synchronized and look), 3.通过了自己公司生产环境的检测 4.使用方法:只需要将jar 放入项目 lib 下面 ,然后将redis.properties 文件放入指定文件夹下面,...

    hibernate 连接池配置详解

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

    was配置db2数据连接池

    详细的讲述了在was中如何配置db2连接池,有截图,很适合入门的初学者!

    连接池原来这么简单

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

Global site tag (gtag.js) - Google Analytics