`

自写的连接池-生产者消费者

阅读更多
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生产者连接池"的概念、实现原理以及它如何提升系统性能。 Kafka生产者连接池是一种资源复用机制,它允许多个...

    随意写的 消费者-生产者 示例

    在实际应用中,消费者-生产者模型被广泛应用于处理大量数据的系统,如消息队列、数据库连接池等。通过合理设计生产者和消费者的交互,可以有效提升系统的并发性能和资源利用率。同时,理解并掌握这一模型对于解决多...

    JAVA_生产者-消费者

    4. **适用场景**:生产者-消费者模式广泛应用于多线程系统,如数据库连接池、消息队列、任务调度等。在这些场景中,生产者通常代表数据的生成或任务的提交,而消费者则负责处理这些数据或执行任务。 总结来说,...

    自己实现的ActiveMQ连接池和新版本ActiveMQ自带的连接池,封装好的工具类,可直接使用

    在具体使用这些工具类时,需要先理解ActiveMQ的基本概念,例如生产者(Producer)、消费者(Consumer)、队列(Queue)、主题(Topic)等。同时,熟悉JMS(Java Message Service)规范也是必不可少的,因为ActiveMQ...

    【IT十八掌徐培成】Java基础第08天-04.多线程-生产者-消费者.zip

    生产者-消费者模型是由两个主要角色构成:生产者和消费者。生产者负责生成数据,而消费者则负责消费这些数据。在Java中,我们通常使用`java.util.concurrent`包中的工具类来实现这种模式,如`BlockingQueue`接口及其...

    Java多线程 生产者-消费者模式

    生产者-消费者模式广泛应用于并发编程,例如数据库连接池、缓存管理、消息队列等场景。通过合理地运用这一模式,我们可以有效地管理和协调系统资源,提高系统的并发性能和响应速度。 在实际开发中,我们还可以使用`...

    生产者消费者模式在java中的应用

    在实际开发中,生产者消费者模式有助于提高系统并发性,提升处理效率,尤其是在高并发场景下,如消息队列、数据库连接池等。通过合理设计生产者和消费者的数量,以及队列的容量,可以有效地平衡系统的负载,保证系统...

    生产者消费者java源码

    在实际应用中,生产者消费者模式常用于多线程环境下的数据缓冲区管理,如数据库连接池、消息队列等。通过合理设计生产者和消费者的数量,以及控制生产速度和消费速度,可以有效地提高系统性能并平衡负载。 总之,...

    生产者与消费者 java实现

    生产者与消费者问题在计算机科学中是一个经典的多线程同步问题,主要涉及到进程间的通信和资源的共享。在Java中,我们通常通过`wait()`、`notify()`和`notifyAll()`这三个方法,以及`synchronized`关键字来解决这个...

    java生产者消费者

    Java生产者消费者模式是一种多线程设计模式,它在并发编程中被广泛使用,用于解决资源的共享问题。在这个模式中,"生产者"负责创建数据,而"消费者"则负责处理这些数据。它们通过一个共享的数据缓冲区进行通信,避免...

    生产者消费者 多线程

    在计算机科学中,"生产者消费者"模型是一种经典的多线程设计模式,它涉及到线程间的协作以实现高效的数据处理。这个模型的核心是通过共享内存(通常是一个缓冲区)来同步生产者和消费者的活动,避免资源的竞争和浪费...

    生产者消费者 C#做的

    生产者消费者问题是多线程编程中的经典模型,用于展示如何有效地协调生产数据和消费数据的两个并发过程。在C#中,我们可以利用.NET框架提供的线程同步机制来解决这个问题。这个模型通常涉及到一个共享资源(如缓冲区...

    自写数据库连接池,基于C++11、MySQL、智能指针、多线程、生产者-消费者模式.zip

    C++是一种面向对象的计算机程序设计语言,由美国AT&T贝尔实验室的本贾尼·斯特劳斯特卢普博士在20世纪80年代初期发明并实现(最初这种语言被称作“C with Classes”带类的C)。它是一种静态数据类型检查的、支持多重...

    基于C++11和Linux环境的自写数据库连接池源码+项目说明.zip

    C++11中的智能指针shared_ptr、lambda表达式- 生产者-消费者线程模型## 项目背景为提高MySQL数据库(C/S架构设计)的访问瓶颈,除在服务器层面增加缓存服务器(如Redis)缓存常用的数据之外,还可以增加连接池,来...

    生产者消费者模型的演变

    在生产者消费者模型的实际应用中,比如在网络服务器、数据库连接池、消息中间件(如RabbitMQ、Kafka)等场景,这种模式都发挥着重要作用。它可以有效地控制系统的负载,防止过载,并且能够提高系统的响应速度和吞吐...

    操作系统生产者消费者问题vb

    操作系统中的生产者-消费者问题是多线程编程中的一个经典模型,它主要用来演示...在实际项目中,这种并发控制机制常用于数据库连接池、网络数据传输等场景,因此,掌握生产者-消费者问题对于提升软件开发水平非常有益。

    基于C++11和Linux环境的自写数据库连接池项目源码+文档说明.zip

    - 生产者-消费者线程模型 项目背景 为提高MySQL数据库(C/S架构设计)的访问瓶颈,除在服务器层面增加缓存服务器(如Redis)缓存常用的数据之外,还可以增加连接池,来提高MySQL Server的访问效率。 在高并发情况...

    Java生产者消费者问题

    在Java编程领域,生产者消费者问题是多线程同步的一个经典示例...在实际项目中,生产者消费者模型常用于异步处理、数据库连接池、网络I/O等场景,其思想也被广泛应用于其他并发设计模式,如工作窃取、事件驱动编程等。

    java版本的生产者与消费者

    在Java中,`ArrayBlockingQueue`或者`LinkedBlockingQueue`是实现生产者消费者模型的常见选择,因为它们都提供了内置的线程安全机制。`put()`方法用于生产者添加产品,`take()`方法用于消费者取出产品。 在实际应用...

    java 多线程生产者消费者模型demo

    Java多线程生产者消费者模型是一种典型的线程协作模式,用于解决并发编程中资源的高效利用和同步问题。在这个模型中,"生产者"线程负责生成数据,而"消费者"线程则负责处理这些数据。为了实现这种模式,Java提供了...

Global site tag (gtag.js) - Google Analytics