1. 程式人生 > >手寫資料庫連線池附gp連線jar包地址

手寫資料庫連線池附gp連線jar包地址

 

手寫資料庫連線並,測試.

 

最近資料庫要連線GP資料庫(GreenplumSQL),在建立連線的時候需要做建立不同的連線數量.

其實當想到寫資料庫連線時,完全可以通過springdata jpa直接寫介面,這是一種思路.

所以在使用的使用,就寫了個demo,測試,建立連線所需要的時間,和伺服器的效能真的有很大的關係,具體關係後面分析..

 

package com.trs.idap.config;


import org.springframework.stereotype.Component;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.LinkedList;

/**
 * Created by Administrator on 2018/10/12.
 * 描述:自定義資料庫連線池
 * @author Young
 * @create 2018-10-12 17:25
     程式碼實現:
     1.  MyPool.java  連線池類,
     2.  指定全域性引數:  初始化數目、最大連線數、當前連線、   連線池集合
     3.  建構函式:迴圈建立3個連線
     4.  寫一個建立連線的方法
     5.  獲取連線
             判斷: 池中有連線, 直接拿
             池中沒有連線,
             判斷,是否達到最大連線數; 達到,丟擲異常;沒有達到最大連線數,
     建立新的連線
     6. 釋放連線
         連線放回集合中(..)
 */
@Component
public class CustomConnectionPool {
    private int intCount=50;
    private int maxCount=20;
    private int currentCount;
    //連線池
    private LinkedList<Connection> pool = new LinkedList<>();

    //構造方法,初始化連線池
    public CustomConnectionPool() {
        for (int i = 0 ;i<intCount;i++){
            currentCount++;
            pool.add(this.createConnection());
        }
    }
    //建立一個新的連線的方法
    private Connection createConnection() {
        try {
            //載入驅動程式
            Class.forName("com.pivotal.jdbc.GreenplumDriver");
            //原始的目標物件
            final Connection conn = DriverManager.getConnection("jdbc:pivotal:greenplum://192.168.1.228:5432;DatabaseName=idap3", "gpadmin", "gpadmin");

            /**對Connection物件代理**/
            //對conn建立其代理物件。返回一個指定介面的代理類例項
            Connection proxy = (Connection) Proxy.newProxyInstance(
                conn.getClass().getClassLoader(),// 定義代理類的類載入器。負責載入類的物件。
                new Class[]{Connection.class},//代理類要實現的介面列表
                new InvocationHandler(){// 當呼叫con物件方法的時候, 自動觸發事務處理器
                    @Override
                    public Object invoke(Object proxy, Method method,
                                         Object[] args) throws Throwable {
                        //方法返回
                        Object result = null;
                        // 當前執行的方法的方法名
                        String methodName = method.getName();
                        if("close".equals(methodName)){
                            //連線放入連線池
                            pool.add(conn);
                        }else{
                            result = method.invoke(conn, args);//// 呼叫目標物件方法
                        }
                        return result;
                    }

                }//指派方法呼叫的呼叫處理程式
            );
            return proxy;//返回代理物件
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
        //建立連線
    public Connection getConnection(){
        //3.1 判斷連線池中是否有連線,如果有連線,就直接從連線池取出
        if(!pool.isEmpty()){
            return pool.removeFirst();//刪除一個,並返回刪除的物件Connection
        }
        //3.2連線池中沒有連線:判斷,如果沒有達到最大連線數,建立
        if(currentCount < maxCount){
            //記錄當前使用的連線數
            currentCount++;
            //建立連線
            return this.createConnection();
        }
        //3.3如果當前已經達到最大連線數,丟擲異常
        throw new RuntimeException("當前連線已經達到最大連線數目");
    }

    /**
     * 4.釋放連線(手動釋放)
     */
    public void realeaseConnection(Connection conn){
        //4.1 判斷,池的數目如果小於初始化連線,就放入池中
        if(pool.size() < intCount){
            pool.addLast(conn);
        }else{
            //4.2關閉
            try {
                currentCount--;//當前連線數-1
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

    public static void main(String[] args) {
        long l = System.currentTimeMillis();
        CustomConnectionPool pool = new CustomConnectionPool();
        System.out.println("建立50個連線用時"+(System.currentTimeMillis()-l)/1000);
        System.out.println("連線池:" + pool.pool.size() + "當前連線:" + pool.currentCount);
        Connection connection = pool.getConnection();
        System.out.println("連線池:" + pool.pool.size() + "當前連線:" + pool.currentCount);
        Connection connection1 = pool.getConnection();
        System.out.println("連線池:" + pool.pool.size() + "當前連線:" + pool.currentCount);
    }
}

 

BTY:

另外,由於在maven倉庫中沒有找到gp的連線座標,所以需要手動壓入到本地的pom中,so....如下

 

由於Greenplum在Maven中未能找到與之匹配的jar驅動,所以需要自己構建本地倉庫
(1) cmd 開啟執行視窗
(2) 進入  本地專案名稱\lib目錄
(3) 執行mvn install:install-file -Dfile=greenplum.jar -DgroupId=lib.greenplum -DartifactId=greenplum -Dversion=5.10.2 -Dpackaging=jar
(4) 配置工程的pom.xml.新增pom路徑
       <dependency>
            <groupId>lib.greenplum</groupId>
            <artifactId>greenplum</artifactId>
            <version>5.10.2</version>
        </dependency>

 

 

附gp連線jar

https://pan.baidu.com/s/1S4UtOlEoHynDhwMbXbNKAg