`

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

 
阅读更多
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)。它是一种静态数据类型检查的、支持多重...

    生产者消费者模型的演变

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

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

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

    Java生产者消费者问题

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

    java版本的生产者与消费者

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

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

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

    RabbitMQ客户连接池实现示例代码

    通过上述代码示例,我们可以看到,RabbitMQ的连接池实现了在生产者和消费者之间共享和重用连接,显著提高了系统效率。同时,它还提供了更好的资源管理,防止过多连接导致的资源耗尽。在实际项目中,根据应用需求调整...

    C#生产者消费者模拟

    在计算机科学领域,操作系统是管理计算机硬件和软件资源的核心程序,而生产者...在实际开发中,类似的问题可能出现在数据库连接池、队列服务等场景,理解和掌握生产者消费者模式对于提升系统效率和稳定性具有重要意义。

Global site tag (gtag.js) - Google Analytics