JAVA 简单连接池实现

该博客介绍了一个简单的JAVA连接池实现,通过创建一个DBPool类,使用LinkedList存储最多5个数据库连接。类中包含获取和添加连接的方法,并且线程安全地管理连接池。在ThreadConnection类中创建线程来模拟并发获取连接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.定义连接池类

package com.whx.conpool;

import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.LinkedList;

import javax.xml.ws.FaultAction;

import com.mysql.jdbc.Connection;

public class DBPool extends Thread {
    
    private static LinkedList<Connection> pool = new LinkedList<Connection>();
    
    public DBPool( ){
        try {
            Class.forName("com.mysql.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        for(int i = 0 ; i <  5; i ++){
            try {
                Connection con = (Connection) DriverManager.getConnection("jdbc:mysql://192.168.0.107:3306/test","root","123456");
                pool.add(con);
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
    
    @Override
    public void run() {
        // TODO Auto-generated method stub
        addConToPool();
    }
    
    public void addConToPool(){
        try {  
            synchronized (pool) {
                while(true){
                    if(pool.size() < 5 ){ 
                        System.out.println("当前连接池有"+pool.size()+"个连接");
                        Connection con = (Connection) DriverManager.getConnection("jdbc:mysql://192.168.0.107:3306/test","root","123456");
                        pool.addLast(con); 
                        
                        //释放锁并通知其他线程可以拿了
                        try {
                            //释放
                            pool.wait();
                        } catch (InterruptedException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }  
                    }
                    if(pool.size() >= 5){ 
                        System.out.println("连接池已经满5个了");
                        try {
                            //释放锁并等待其他线程满了可以拿了
                            pool.wait();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        } 
                    } 
                }
            }
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
     
    public Connection getConnection(){
        try {
            Thread.sleep(500);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        synchronized (pool) {
            if(!pool.isEmpty()){
                // 移除并返回第一个元素
                pool.notifyAll();
                return pool.removeFirst();
                
            }else{
                //释放锁并通知其他线程可以对pool做事情了
                pool.notifyAll();
            }
        }
        return null;
    }
}
 

2.实现类

package com.whx.conpool;

import com.mysql.jdbc.Connection;

public class ThreadConnection extends Thread{

    DBPool pool = new DBPool();
    
    @Override
    public void run() {
        while(true){
        getConnection();
        }
    }
    
    public Connection getConnection(){
        Connection conn = pool.getConnection();
        System.out.println("拿到了:"+conn);
        return conn;
    }
    
    public static void main(String[] args) {
        DBPool db =new DBPool();
        db.start();
        
        ThreadConnection t1 = new ThreadConnection();
        t1.start();
        

    }
    
}
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值