public class DBConnectionPool
{
// 默认的最大线程数阀值
private static final int DEFAULT_MAX = 10;
// 默认的最小线程数阀值
private static final int DEFAULT_MIN = 5;
// 默认的最长等待时间
private static final long DEFAULT_MAXWAIT = 10000L;
// 最大线程数阀值
private int max;
// 最先线程数阀值
private int min;
// 最长等待时间
private long maxWait;
// 当前请求获取连接数
private int currentRequest;
// 当前激活数
private int currentActive;
// 池
private List<Connection> pool;
// 连接源
private Entry source;
public DBConnectionPool(String driverName, String url, String userName, String password)
{
this(DEFAULT_MAX, DEFAULT_MIN, DEFAULT_MAXWAIT, driverName, url, userName, password);
}
public DBConnectionPool(int max, int min, long maxWait, String driverName, String url, String userName,
String password)
{
pool = new LinkedList<Connection>();
source = new Entry(driverName, url, userName, password);
this.max = max;
this.min = min;
this.maxWait = maxWait;
this.addPool(pool);
}
// 获取连接
public synchronized Connection getConnection()
{
currentRequest++;
System.out.println("currentRequest: " + currentRequest);
Connection con = null;
beginTransaction(maxWait);
if (pool.size() == 0)
{
try
{
con = source.getConnection();
currentActive++;
}
catch (Exception e)
{
e.printStackTrace();
}
}
else if (pool.size() < min)
{
con = pool.remove(0);
System.out.println("12312312");
currentActive++;
}
else
{
con = pool.remove(0);
currentActive++;
}
System.out.println("currentActive : " + currentActive);
return con;
}
// 判断是否超过最大数,超过等待,没有超过就唤醒
private void beginTransaction(long maxWait)
{
if (currentRequest > max)
{
try
{
if (maxWait > 0)
this.wait(maxWait);
else
{
this.wait(DEFAULT_MAXWAIT);
}
if (currentRequest > max)
{
throw new RuntimeException("获取连接超时");
}
else
{
System.out.println("等待之后获取了连接");
}
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
else
{
this.notifyAll();
}
}
// 注入源
private void addPool(List<Connection> pool)
{
for (int i = pool.size(); i < min; i++)
{
try
{
pool.add(source.getConnection());
}
catch (Exception e)
{
e.printStackTrace();
continue;
}
}
}
// 关闭连接
public synchronized void close(Connection con)
{
if (con != null)
{
currentRequest--;
System.out.println("currentRequest: " + currentRequest);
beginTransaction(maxWait);
if (pool.size() < max)
{
pool.add(con);
}
else
{
try
{
con.close();
}
catch (SQLException e)
{
e.printStackTrace();
}
finally
{
con = null;
}
}
currentActive--;
System.out.println("currentActive : " + currentActive);
}
}
// 连接获取实体类
private static class Entry
{
private String driverName;
private String url;
private String userName;
private String password;
public Entry(String driverName, String url, String userName, String password)
{
super();
this.driverName = driverName;
this.url = url;
this.userName = userName;
this.password = password;
}
Connection getConnection()
throws Exception
{
Class.forName(driverName);
return DriverManager.getConnection(url, userName, password);
}
}
}
分享到:
相关推荐
为了优化性能和提高效率,开发人员常常会利用连接池技术来管理Kafka生产者的连接。本文将深入探讨"Kafka生产者连接池"的概念、实现原理以及它如何提升系统性能。 Kafka生产者连接池是一种资源复用机制,它允许多个...
在实际应用中,消费者-生产者模型被广泛应用于处理大量数据的系统,如消息队列、数据库连接池等。通过合理设计生产者和消费者的交互,可以有效提升系统的并发性能和资源利用率。同时,理解并掌握这一模型对于解决多...
4. **适用场景**:生产者-消费者模式广泛应用于多线程系统,如数据库连接池、消息队列、任务调度等。在这些场景中,生产者通常代表数据的生成或任务的提交,而消费者则负责处理这些数据或执行任务。 总结来说,...
在具体使用这些工具类时,需要先理解ActiveMQ的基本概念,例如生产者(Producer)、消费者(Consumer)、队列(Queue)、主题(Topic)等。同时,熟悉JMS(Java Message Service)规范也是必不可少的,因为ActiveMQ...
生产者-消费者模型是由两个主要角色构成:生产者和消费者。生产者负责生成数据,而消费者则负责消费这些数据。在Java中,我们通常使用`java.util.concurrent`包中的工具类来实现这种模式,如`BlockingQueue`接口及其...
生产者-消费者模式广泛应用于并发编程,例如数据库连接池、缓存管理、消息队列等场景。通过合理地运用这一模式,我们可以有效地管理和协调系统资源,提高系统的并发性能和响应速度。 在实际开发中,我们还可以使用`...
在实际开发中,生产者消费者模式有助于提高系统并发性,提升处理效率,尤其是在高并发场景下,如消息队列、数据库连接池等。通过合理设计生产者和消费者的数量,以及队列的容量,可以有效地平衡系统的负载,保证系统...
在实际应用中,生产者消费者模式常用于多线程环境下的数据缓冲区管理,如数据库连接池、消息队列等。通过合理设计生产者和消费者的数量,以及控制生产速度和消费速度,可以有效地提高系统性能并平衡负载。 总之,...
生产者与消费者问题在计算机科学中是一个经典的多线程同步问题,主要涉及到进程间的通信和资源的共享。在Java中,我们通常通过`wait()`、`notify()`和`notifyAll()`这三个方法,以及`synchronized`关键字来解决这个...
Java生产者消费者模式是一种多线程设计模式,它在并发编程中被广泛使用,用于解决资源的共享问题。在这个模式中,"生产者"负责创建数据,而"消费者"则负责处理这些数据。它们通过一个共享的数据缓冲区进行通信,避免...
在计算机科学中,"生产者消费者"模型是一种经典的多线程设计模式,它涉及到线程间的协作以实现高效的数据处理。这个模型的核心是通过共享内存(通常是一个缓冲区)来同步生产者和消费者的活动,避免资源的竞争和浪费...
生产者消费者问题是多线程编程中的经典模型,用于展示如何有效地协调生产数据和消费数据的两个并发过程。在C#中,我们可以利用.NET框架提供的线程同步机制来解决这个问题。这个模型通常涉及到一个共享资源(如缓冲区...
C++是一种面向对象的计算机程序设计语言,由美国AT&T贝尔实验室的本贾尼·斯特劳斯特卢普博士在20世纪80年代初期发明并实现(最初这种语言被称作“C with Classes”带类的C)。它是一种静态数据类型检查的、支持多重...
C++11中的智能指针shared_ptr、lambda表达式- 生产者-消费者线程模型## 项目背景为提高MySQL数据库(C/S架构设计)的访问瓶颈,除在服务器层面增加缓存服务器(如Redis)缓存常用的数据之外,还可以增加连接池,来...
在生产者消费者模型的实际应用中,比如在网络服务器、数据库连接池、消息中间件(如RabbitMQ、Kafka)等场景,这种模式都发挥着重要作用。它可以有效地控制系统的负载,防止过载,并且能够提高系统的响应速度和吞吐...
操作系统中的生产者-消费者问题是多线程编程中的一个经典模型,它主要用来演示...在实际项目中,这种并发控制机制常用于数据库连接池、网络数据传输等场景,因此,掌握生产者-消费者问题对于提升软件开发水平非常有益。
- 生产者-消费者线程模型 项目背景 为提高MySQL数据库(C/S架构设计)的访问瓶颈,除在服务器层面增加缓存服务器(如Redis)缓存常用的数据之外,还可以增加连接池,来提高MySQL Server的访问效率。 在高并发情况...
在Java编程领域,生产者消费者问题是多线程同步的一个经典示例...在实际项目中,生产者消费者模型常用于异步处理、数据库连接池、网络I/O等场景,其思想也被广泛应用于其他并发设计模式,如工作窃取、事件驱动编程等。
在Java中,`ArrayBlockingQueue`或者`LinkedBlockingQueue`是实现生产者消费者模型的常见选择,因为它们都提供了内置的线程安全机制。`put()`方法用于生产者添加产品,`take()`方法用于消费者取出产品。 在实际应用...
Java多线程生产者消费者模型是一种典型的线程协作模式,用于解决并发编程中资源的高效利用和同步问题。在这个模型中,"生产者"线程负责生成数据,而"消费者"线程则负责处理这些数据。为了实现这种模式,Java提供了...