手寫資料庫連線池附gp連線jar包地址
阿新 • • 發佈:2018-10-31
手寫資料庫連線並,測試.
最近資料庫要連線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