`

连接池之二

    博客分类:
  • 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
分享到:
评论

相关推荐

    连接池案例 连接池案例

    2. 连接池:预先初始化并维护一定数量的数据库连接,当应用程序需要时可以从池中获取,使用完毕后归还给池,而不是直接关闭。 工作原理: 1. 初始化:在应用程序启动时,连接池会根据配置参数预先创建一定数量的...

    kafka生产者连接池

    总结来说,Kafka生产者连接池是通过复用连接资源来优化Kafka生产者性能的一种高效策略,结合Apache Commons Pool 2这样的对象池库和自定义的`kafkaPool-v1.0.jar`实现,可以提供更稳定、高效的Kafka生产环境。...

    okhttp中连接池实现

    它的核心特性之一就是连接池(Connection Pool),它在提高网络性能和减少延迟方面起到了关键作用。本文将深入探讨OkHttp中的连接池实现,包括连接对象的添加、移除机制以及其工作原理。 首先,我们需要了解什么是...

    Tomcat连接池配置.doc

    二、Tomcat 连接池配置的步骤 Tomcat 连接池配置可以分为以下几个步骤: 1. 下载和安装 Tomcat 和其管理控件包 2. 安装 Tomcat 并启动服务器 3. 在浏览器中输入网址并登录 Tomcat 管理控制台 4. 配置全局数据库...

    C# 数据库连接池 C# 数据库连接池

    2. **Open() 和 Close()**:`Open()`方法从连接池获取连接,`Close()`方法不实际关闭连接,而是将其返回到连接池。 3. **ConnectionString属性**:在连接字符串中,可以设置`Pooling=true`来启用连接池,还可以通过...

    java ftp连接池

    2. 容量控制:连接池通常设置最大连接数,以防止过度消耗系统资源。当达到最大连接数时,新的请求会被阻塞,直到有连接被释放。 3. 连接超时与空闲回收:为了防止资源浪费,连接池会设定超时策略。如果一个连接长...

    tomcat连接池与阿里Druid连接池

    二、阿里 Druid 连接池配置 阿里 Druid 连接池配置需要在 Maven 项目中添加 Druid 依赖项,并在 application.properties 文件中配置数据库连接信息。下面是阿里 Druid 连接池的配置示例: ```xml &lt;!-- Druid 依赖项...

    Mongodb连接池for java

    2. 初始化连接池:在应用启动时,使用连接池的配置参数创建一个连接池实例。 3. 获取和释放连接:在需要访问数据库的地方,从连接池中获取一个连接,使用完毕后立即归还。 4. 监控和调整:监控连接池的使用情况,...

    C#高效数据库连接池源码

    数据库连接池是数据库管理中的重要概念,特别是在高并发和大数据量的应用场景下,它能显著提升性能并降低系统资源消耗。在C#编程环境中,我们可以使用自定义的数据库连接池来实现这一功能。本篇文章将深入探讨“C#...

    java socket连接池 实现

    Java Socket 连接池实现是提高网络应用性能和效率的关键技术之一。在高并发的网络环境中,频繁地创建和销毁Socket连接会导致大量的系统资源浪费,影响整体性能。为了解决这个问题,开发人员通常会使用连接池来管理和...

    socket 客户端连接池实现

    2. 连接管理:连接池需要维护一个空闲连接列表,当有新的请求时,从列表中取出一个可用连接。如果列表为空,且未达到最大连接数限制,可以创建新的连接。反之,如果达到最大连接数,请求可能会被阻塞或抛出异常。 3...

    c# mysql数据库连接池实现

    在.NET Core 2.1框架下,可以使用.NET Standard库来实现高效、优化的数据库连接管理,特别是通过连接池来提高性能。本文将深入探讨如何在C#中使用MySQL数据库连接池。 首先,我们需要了解什么是数据库连接池。...

    java 数据库 连接池驱动.rar

    2. **常见的Java数据库连接池实现** - C3P0:一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。 - DBCP (Apache BasicDataSource):Apache的一个开源项目,基于Jakarta Pool实现...

    java socket连接池

    2. 创建连接池实例:使用库提供的API创建连接池对象,并传入配置参数。 3. 获取Socket连接:通过调用连接池的borrowObject()方法获取一个可用的Socket连接。 4. 使用Socket连接:进行实际的网络通信,处理客户端请求...

    Java连接SAP系统所用的JCo连接池的配置和使用

    "Java连接SAP系统所用的JCo连接池的配置和使用" Java连接SAP系统所用的JCo连接池的配置和使用是指在Java应用程序中使用JCo连接池来连接SAP R3系统的技术。JCo(Java Connector)是SAP提供的一种Java API,用于连接...

    数据库连接池代码实现

    2. **连接获取与释放**:当应用需要进行数据库操作时,它会从连接池中获取一个可用的连接,执行完操作后,必须将其归还到连接池中,以便其他线程再次使用。 3. **连接管理**:连接池需要维护连接的状态,包括检查...

    Java jdbc数据库连接池总结

    Java JDBC 数据库连接池总结 Java 语言中,JDBC(Java DataBase Connection)是应用程序与数据库沟通的桥梁。在 Web 应用开发的早期,主要使用的技术是 CGIASPPHP 等。之后,Sun 公司推出了基于 Java 语言的 ...

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

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

Global site tag (gtag.js) - Google Analytics