JAVA 简单连接池实现

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();
        

    }
    
}
 

猜你喜欢

转载自blog.csdn.net/dzh145/article/details/89598552