Need Code to create Connection Pool in java

后端 未结 10 1661
轻奢々
轻奢々 2020-11-30 20:50

Need code to create the connection pool in java? How does we make sure that connection pool doesn\'t return the same object which is already in use? How happens if client cl

10条回答
  •  -上瘾入骨i
    2020-11-30 21:17

    I have some model code in Java which has connection pool with multithreading.

    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    import java.util.Iterator;
    import java.util.concurrent.ConcurrentLinkedQueue;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    import java.util.concurrent.ScheduledExecutorService;
    import java.util.concurrent.TimeUnit;
    
    abstract class ObjectPool {
        private ConcurrentLinkedQueue pool;
        ScheduledExecutorService executorService;
    
        ObjectPool(int minObjects) {
            pool = new ConcurrentLinkedQueue();
            for (int i = 0; i < minObjects; i++) {
                pool.add(createObject());
            }
        }
    
        ObjectPool(final int minObjects, final int maxSize, final long interval){
            pool = new ConcurrentLinkedQueue();
            for (int i = 0; i < minObjects; i++) {
                pool.add(createObject());
            }
    
            executorService = Executors.newSingleThreadScheduledExecutor();
            executorService.scheduleWithFixedDelay(new Runnable(){
    
                public void run() {
                    int size = pool.size();
                    while(size > maxSize){
                        pool.remove();
                    }
                    Iterator i = pool.iterator();
                    while(i.hasNext()){
                        T t = (T) i.next();
                        if(checkExpiry(t)){
                            System.out.println("Expiry existed...");
                            i.remove();
                        }
                    }
    
                    while(pool.size() < minObjects){
                        System.out.println("Adding more objects to pool");
                        pool.add(createObject());
                    }
                }
    
            }, interval, interval, TimeUnit.MILLISECONDS);
    
        }
    
        public T borrowObject() {
            if (pool.peek() == null)
                return createObject();
            return pool.remove();
        }
    
        public void addObject(T obj) {
            if (obj == null)
                return;
            pool.add(obj);
        }
    
        public abstract T createObject();
    
        public abstract boolean checkExpiry(T t);
    }
    
    class MultithreadQuery extends Thread{
        private ObjectPool pool;
        private int threadNo;
        String query;
        MultithreadQuery(ObjectPool pool,int threadNo, String query){
            this.pool = pool;
            this.threadNo = threadNo;
            this.query = query;
    
        }
        @Override
        public void run(){
            Connection con = pool.borrowObject();
            Statement stmt;
            try {
                stmt = con.createStatement();
                System.out.println("Query started for thread->"+ threadNo);
                ResultSet rs=stmt.executeQuery(query);
                while(rs.next())  
                System.out.println(rs.getInt(1)+"  "+rs.getString(2)+"  "+rs.getString(3));
                System.out.println("closing connection....");
                con.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }  
            pool.addObject(con);        
            System.out.println("Query ended for thread->"+ threadNo);
        }
    }
    
    public class ObjectPoolPatternDemo {
        ObjectPool pool;
    
        public void setUp(){
            pool = new ObjectPool(4, 10, 1) {
    
                @Override
                public Connection createObject() {
                    Connection con;
                    try {
                        con = DriverManager.getConnection("URL","Username","Password");
                        return con;
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }
                    return null;
                }
    
                @Override
                public boolean checkExpiry(Connection conn) {
                    boolean expiryFlag = false;
                    try {
                        if(conn.isClosed())
                            expiryFlag = true;
    
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }
                    return expiryFlag;
                }
            };
        }
    
        public static void main(String[] args) throws SQLException {
            ObjectPoolPatternDemo oppd = new ObjectPoolPatternDemo();
            oppd.setUp();
    
            ExecutorService es = Executors.newFixedThreadPool(4);
            String query = "select * from TABLE";
            es.execute(new MultithreadQuery(oppd.pool,1,query));
            es.execute(new MultithreadQuery(oppd.pool,2,query));
            es.execute(new MultithreadQuery(oppd.pool,3,query));
            es.execute(new MultithreadQuery(oppd.pool,4,query));
            es.execute(new MultithreadQuery(oppd.pool,5,query));
            es.execute(new MultithreadQuery(oppd.pool,6,query));
    
            es.shutdown();
            try {
                es.awaitTermination(1, TimeUnit.DAYS);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            System.out.println("finally completed...");
        }
    }
    

提交回复
热议问题