`

连接池之一

    博客分类:
  • java
阅读更多

 

import java.util.Vector;
import redis.clients.jedis.Jedis;

//简单连接池
public class RedisPool {

 public static void main(String[] args) {
  /*
  RedisPool pool = new RedisPool(1,1,1);
  for(int i=0;i<2;i++) {
   Jedis j = pool.getConnection();
   System.out.println(j);
  }
  pool.close();
  
  RedisPool pool = new RedisPool(1,2,1);
  for(int i=0;i<2;i++) {
   JedisExt j = pool.getConnection();
   System.out.println(j);
   if(i==1) {
    j.release();
   }
  }
  pool.close();
  */
  RedisPool pool = new RedisPool(1,2,1);
  new TestThread("t1", pool).start();
  new TestThread("t2", pool).start();
  new TestThread("t3", pool).start();
  
 }

 
 private Vector<JedisExt> list = new Vector<JedisExt>();
 private int size; //当前正使用的连接数
 private int maxSize;
 private int minSize;
 
 public RedisPool(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 JedisExt getConnection() {
  //先从闲置中获取
  JedisExt j = null;
  for(int i=0;i<size;i++) {
   j = list.get(i);
   if(!j.isused) {
    j.setIsused(true); //使用中
    return j;
   }
  }
  //创建新的连接
  if(size<maxSize) {
   size++;
   JedisExt je = new JedisExt(initConnection(), true);
   list.add(je);
   return je;
  }
  //已到最大连接数返回空
  return null;
 }
 
 public void close() {
  JedisExt je = null;
  for(int i=0;i<list.size();i++) {
   je = list.get(i);
   je.getJedis().close();
  }
  list.clear();
 }
 
 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 release() {
   this.setIsused(false); //未使用
  }

  public synchronized Jedis getJedis() {
   return jedis;
  }

 }
 
 //获取单个连接
 private static Jedis initConnection(){
  String host = "192.168.191.128";
     Jedis client = new Jedis(host, 6379);
     return client;
 }
 
 private static class TestThread extends Thread{
  private RedisPool pool;
  
  public TestThread(String name, RedisPool pool) {
   super(name);
   this.pool = pool;
  }
  
  public void run() {
   JedisExt e = pool.getConnection();
   boolean b = false;
   if(e!=null) {
    b = e.isIsused();
   }
   System.out.println(e + " " + b);
  }
 }
}

0
0
分享到:
评论

相关推荐

    数据库连接池使用范例

    以HikariCP为例,它是目前性能较好的连接池之一,以其高效和低延迟著称。配置HikariCP通常涉及以下步骤: 1. 添加依赖:在Maven或Gradle的构建文件中引入HikariCP的依赖库。 2. 配置连接池:在`conf/server.xml`...

    ssh数据库连接池proxool

    Proxool是SSH框架中常用的数据库连接池之一,以其轻量级、灵活配置和优秀的性能表现而受到青睐。 数据库连接池的基本原理是预先在内存中创建一定数量的数据库连接,应用程序在需要时可以从池中获取连接,使用完毕后...

    详解SpringBoot配置连接池

    如果HikariCP可用,SpringBoot也会优先选用,因为它被认为是目前最快的Java连接池之一。Commons DBCP则作为备选方案,但并不推荐用于生产环境。最后,如果只有Commons DBCP2可用,SpringBoot也会使用。这些连接池的...

    hibernate 连接池配置详解

    Proxool是一个轻量级的、高性能的JDBC连接池组件,也是Hibernate官方推荐的连接池之一。下面是使用Proxool配置Hibernate连接池的方法: 1. **添加依赖**:确保项目中有Proxool相关的JAR包。 2. **配置连接池参数**...

    数据库连接池的三种实现方法

    阿里巴巴开源的 Druid 数据库连接池是目前使用最广泛且性能最优的连接池之一。Druid 提供了丰富的监控统计功能,可以方便地集成到Spring等框架中。它的特性包括: - 高效的连接池实现,支持连接预热、健康检查和...

    hibernate配置数据库连接池的三种方法

    除了C3P0和DBCP,还有其他流行的数据库连接池实现,比如HikariCP,它以其高性能和低延迟著称,通常被认为是当前最佳的Java连接池之一。配置HikariCP也需要在`hibernate.cfg.xml`中添加相应的属性。 在实际应用中,...

    okhttp中连接池实现

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

    hibernate连接池配置

    - 在Hibernate 2中,DBCP是官方推荐的连接池之一,但在Hibernate 3及更高版本中,由于存在缺陷,不再推荐使用。如果在Hibernate 3环境中必须使用DBCP,官方建议通过JNDI(Java Naming and Directory Interface)...

    tomcat连接池mysql多种配置

    HikariCP是目前性能最优的连接池之一,以其高速度和低资源消耗而闻名。配置步骤如下: 1. 添加依赖:在项目中引入HikariCP的Maven依赖。 2. 配置数据源:在Spring Boot项目中,可以通过application.yml或...

    数据库连接池范例程序

    以HikariCP为例,它是目前性能最佳的连接池之一,其配置通常涉及以下几个关键属性: 1. `driverClassName`:指定ORACLE数据库的JDBC驱动类名,通常是`oracle.jdbc.driver.OracleDriver`。 2. `jdbcUrl`:数据库连接...

    java socket连接池 实现

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

    c# mysql数据库连接池实现

    在C#编程环境中,开发人员经常需要与各种数据库进行交互,MySQL是其中之一。在.NET Core 2.1框架下,可以使用.NET Standard库来实现高效、优化的数据库连接管理,特别是通过连接池来提高性能。本文将深入探讨如何在...

    Hibernate3.2连接池

    - **C3P0**:官方推荐的连接池之一,因其稳定性和简单的配置而受到欢迎。要使用C3P0,需将`c3p0-0.8.4.5.jar`添加到类路径,并在Hibernate配置文件中设置以下属性: ```xml ...

    Tomcat连接池的配置

    在Tomcat中,常用的连接池实现有Apache的Commons DBCP、C3P0和HikariCP等,这里我们以HikariCP为例,因为它是目前性能最优的连接池之一。 1. **安装HikariCP** - 下载HikariCP的JAR包并将其放入Tomcat的`lib`目录...

    Java中常用的数据库连接池[定义].pdf

    尽管已被Hibernate官方弃用,但在过去是常用的连接池之一。 3. 主要配置说明 - 基本配置:包括数据库驱动类名、数据库URL、用户名和密码,这些是连接数据库的基础信息。 - 关键配置:如最小连接数、最大连接数,...

    数据库连接池java代码实现

    数据库连接池在Java中的实现是提高应用程序性能的关键技术之一,它通过复用已存在的数据库连接,避免了频繁创建和销毁连接导致的系统资源浪费。本文将深入探讨如何使用Java代码来实现一个简单的数据库连接池,并解释...

    一个好用的连接池类,用于数据库连接等方面

    在IT行业中,数据库连接管理是系统性能优化的关键因素之一,特别是在高并发的场景下。连接池(Connection Pool)就是一种有效的解决方案,它有效地解决了数据库连接的创建与销毁带来的开销问题。本文将深入探讨“一...

Global site tag (gtag.js) - Google Analytics