//简单连接池之四
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);
}
}
}
相关推荐
4. 监控与调整:连接池会监控连接状态,定期检查和回收失效的连接,同时根据需求动态调整池中连接的数量。 连接池的优缺点: 优点: 1. 提高性能:通过重用已存在的连接,减少了创建和销毁连接的时间。 2. 资源优化...
4. **连接扩展**:当连接池中的连接被全部占用时,如果请求量持续增加,连接池可能会根据预设的最大连接数动态增加连接。 5. **资源回收**:当连接长时间未被使用或者达到预设的超时时间,连接池会自动回收这些连接...
它的核心特性之一就是连接池(Connection Pool),它在提高网络性能和减少延迟方面起到了关键作用。本文将深入探讨OkHttp中的连接池实现,包括连接对象的添加、移除机制以及其工作原理。 首先,我们需要了解什么是...
4. 配置全局数据库连接池 5. 配置局部 SERVLET 信息环境 6. 新建 PoolGlobal.xml 和 PoolLocal.xml 文档 7. 将 classes12.jar 包放在 TOMCAT\common\lib 路径下 8. 在 JAVA 中调用连接池 三、Tomcat 连接池配置的...
4. **调整大小**:根据系统负载和数据库操作的繁忙程度,连接池可以动态地增加或减少连接的数量,以保持最佳性能。 5. **超时与回收**:连接池会设定每个连接的最大生命周期,超过这个时间未被使用的连接会被自动...
4. 初始化连接池:使用`commons-pool`的`GenericObjectPool`或其他池实现,传入连接工厂和配置参数。 5. 获取和释放连接:在代码中,使用`borrowObject()`方法获取连接,完成后调用`returnObject()`方法归还连接。 ...
Tomcat 连接池和阿里 Druid 连接池的配置和比较 Tomcat 连接池是一种基于 Java 的数据库连接池实现,提供了高效、可靠的数据库连接管理。阿里 Druid 连接池是阿里巴巴开发的开源连接池,提供了高性能、可靠的数据库...
4. 监控和调整:监控连接池的使用情况,根据实际负载调整连接池参数,以达到最佳性能。 了解并正确使用MongoDB的Java连接池对于提高应用程序性能和稳定性至关重要,特别是在高并发的Web应用或大数据处理项目中。...
数据库连接池是数据库管理中的重要概念,特别是在高并发和大数据量的应用场景下,它能显著提升性能并降低系统资源消耗。在C#编程环境中,我们可以使用自定义的数据库连接池来实现这一功能。本篇文章将深入探讨“C#...
Java Socket 连接池实现是提高网络应用性能和效率的关键技术之一。在高并发的网络环境中,频繁地创建和销毁Socket连接会导致大量的系统资源浪费,影响整体性能。为了解决这个问题,开发人员通常会使用连接池来管理和...
在.NET Core 2.1框架下,可以使用.NET Standard库来实现高效、优化的数据库连接管理,特别是通过连接池来提高性能。本文将深入探讨如何在C#中使用MySQL数据库连接池。 首先,我们需要了解什么是数据库连接池。...
4. 连接回收:连接池需要定期检查并清理无效的连接,例如超时未使用的连接。这可以通过定时任务或在每次分配连接时进行检查。 5. 线程安全:在多线程环境中,连接池的创建、分配和回收操作必须是线程安全的,防止...
4. **连接池的优缺点** 优点: - 资源复用,提高性能。 - 控制数据库连接的最大数量,防止过多连接导致系统资源耗尽。 - 提供了连接池的监控和管理,如连接超时、空闲连接回收等。 缺点: - 需要额外的内存来...
Java Socket连接池是一种优化网络通信性能的技术,它允许应用程序复用已经建立的Socket连接,从而减少因频繁创建和销毁Socket连接而产生的开销。在高并发的服务器环境中,Socket连接池能够有效地提升系统效率和响应...
"Java连接SAP系统所用的JCo连接池的配置和使用" Java连接SAP系统所用的JCo连接池的配置和使用是指在Java应用程序中使用JCo连接池来连接SAP R3系统的技术。JCo(Java Connector)是SAP提供的一种Java API,用于连接...
4. **最大连接数和最小连接数**:配置参数用来限制连接池的最大和最小连接数,防止资源过度消耗,同时确保在高并发情况下有足够的连接可供使用。 5. **连接超时和池大小调整**:为了防止长时间占用连接,通常会设置...
在IT领域,数据库连接池是一种优化数据库访问性能和资源管理的技术。在Delphi这个强大的Windows应用程序开发环境中,实现数据库连接池能够有效地解决频繁创建和销毁数据库连接带来的性能问题。下面我们将详细探讨...
4. **连接池的作用** 连接池的主要优点包括: - **重用连接**: 避免频繁创建和关闭连接的开销,提高系统性能。 - **资源管理**: 控制最大并发连接数,防止资源耗尽。 - **连接监控**: 自动检测和回收无效的...