JDBC数据库连接池

时间:2021-07-05 11:51:50

自己写的一个连接池,经过不断改进,自认为还算是运行的比较可以的。贴出来,分享一下。

 

  
 
 
  1. import java.util.ArrayList;  
  2. import java.util.List;  
  3. import java.sql.*;  
  4.  
  5. public class ConnectionPool {  
  6.     /*******Inner Class ConnectionClass*******/ 
  7.     public class ConnectionWorker extends Thread {  
  8.  
  9.         ConnectionPool pool;  
  10.           
  11.         public ConnectionWorker(ConnectionPool connPool)  
  12.         {  
  13.             super("ConnectionWorker");  
  14.             pool=connPool;  
  15.         }  
  16.           
  17.         @Override 
  18.         public void run()  
  19.         {  
  20.             pool.increase();  
  21.             pool.unLock();  
  22.             System.out.print("ConnectionWorker:Add Connection Done!" + pool.getNum()+ " Left\n");  
  23.         }  
  24.     }  
  25.       
  26.       
  27.     /********Inner Class Define Ends********/ 
  28.       
  29.     private List<Connection> pool;  
  30.  
  31.     static final int NumWhenStart = 8;  
  32.     static final int NumWhenIncrease = 8;  
  33.     static final int NumJudgeOver =50;   
  34.     static final int NumLowCase = 6;   
  35.       
  36.     static private String host = "DB Server IP";  
  37.     static private String user = "DB User";  
  38.     static private String pwd = "Password";  
  39.     static private String database = "DB name";  
  40.     static private String driverName = "com.microsoft.sqlserver.jdbc.SQLServerDriver";  
  41.     static private String dbURL = "jdbc:sqlserver://" + host  
  42.             + ":1433; DatabaseName=" + database;  
  43.  
  44.     private static ConnectionPool instance = null;  
  45.     private ConnectionWorker worker;  
  46.     private Boolean lock = false;  
  47.  
  48.     public static ConnectionPool getInstance() { // singleton ,return instance  
  49.         if (instance == null) {  
  50.             synchronized (ConnectionPool.class) {  
  51.                 if (instance == null) {  
  52.                     instance = new ConnectionPool();  
  53.                 }  
  54.             }  
  55.         }  
  56.         return instance;  
  57.     }  
  58.  
  59.     private ConnectionPool() { // constructor  
  60.         pool = new ArrayList<Connection>();  
  61.         for (int i = 0; i < NumWhenStart; i++)   
  62.             pool.add(generateConnection());  
  63.         }  
  64.  
  65.     // if the pool is full or the connection is closed  
  66.     // return false and drop the connection  
  67.     synchronized public boolean putConn(Connection conn) {  
  68.         try {  
  69.             if (conn == null || conn.isClosed()) {  
  70.                 System.out.print("DBCP Reporting:Bad Connection Droped\n");  
  71.                 return false;  
  72.             }  
  73.             if (pool.size() >= NumJudgeOver) {  
  74.                 conn.close();  
  75.                 System.out  
  76.                         .print("DBCP Reporting:Pool Full, Connection Droped\n");  
  77.                 return false;  
  78.             }  
  79.             boolean res = pool.add(conn);  
  80.             System.out.print("DBCP Reporting:Connection In! " + pool.size()  
  81.                     + " Left\n");  
  82.             return res;  
  83.         } catch (SQLException e) {  
  84.             e.printStackTrace();  
  85.             return false;  
  86.         }  
  87.     }  
  88.  
  89.     synchronized public Connection getConn() throws PoolDryException {  
  90.         Connection conn = null;  
  91.         int i = 0;  
  92.         while (true) {  
  93.             if (pool.size() < NumLowCase) {  
  94.                 if(!lock)  
  95.                 {  
  96.                     setLock();  
  97.                     System.out.print("DBCP Reporting: Low Case, Worker run\n");  
  98.                     worker = new ConnectionWorker(this);  
  99.                     worker.start();  
  100.                 }  
  101.             }  
  102.             while (pool.size() <= 0) {  
  103.                     if (i > 40) {  
  104.                         throw new PoolDryException("Wait too long,quit");  
  105.                     }  
  106.                     try {  
  107.                         this.wait(100);  
  108.                         i++;  
  109.                         System.out.print("DBCP Reporting: Pool Dry,Waiting. " 
  110.                                 + i + " \n");  
  111.                     } catch (InterruptedException e) {  
  112.                         e.printStackTrace();  
  113.                         return null;  
  114.                     }  
  115.             }  
  116.             conn = pool.remove(0);  
  117.             if (validateConn(conn)) {  
  118.                 System.out.print("DBCP Reporting:Connection Out " + getNum()  
  119.                         + " Connection Left\n");  
  120.                 return conn;  
  121.             }  
  122.             if (pool.size() <= 0) {  
  123.                 throw new PoolDryException("Pool Dry");  
  124.             }  
  125.         }  
  126.     }  
  127.  
  128.       
  129.     public int getNum() {  
  130.         return pool.size();  
  131.     }  
  132.  
  133.     private boolean validateConn(Connection conn) // return true if the  
  134.     // connection is useful  
  135.     {  
  136.         if (conn == null)  
  137.             return false;  
  138.         try {  
  139.             Statement stmt = conn.createStatement();  
  140.             if (!stmt.execute("select 1"))  
  141.                 return false;  
  142.             stmt.close();  
  143.         } catch (Exception e) {  
  144.             System.out.print("DBCP Reporting: Validate Connection Fail:" 
  145.                     + e.getMessage() + "\n");  
  146.             return false;  
  147.         }  
  148.         return true;  
  149.     }  
  150.  
  151.     protected int increase() {  
  152.         int ori = pool.size();  
  153.         Connection conn = null;  
  154.         for (int i = 0; i < NumWhenIncrease; i++) {  
  155.             conn = ConnectionPool.generateConnection();  
  156.             if (conn != null)  
  157.                 add(conn);  
  158.         }  
  159.         return pool.size() - ori;  
  160.     }  
  161.  
  162.     private void setLock() {  
  163.  
  164.             this.lock=true;  
  165.  
  166.     }  
  167.  
  168.     protected void unLock() {  
  169.             this.lock=false;  
  170.     }  
  171.  
  172.       
  173.       
  174.     private boolean add(Connection conn)  
  175.     {  
  176.         synchronized(this.pool)  
  177.         {  
  178.             return pool.add(conn);  
  179.         }  
  180.     }  
  181.       
  182.  
  183.     private static Connection generateConnection() // generate connection and  
  184.     // return,throw Exception  
  185.     {  
  186.         try {  
  187.             Class.forName(driverName);  
  188.             return DriverManager.getConnection(dbURL, user, pwd);  
  189.         } catch (Exception e) {  
  190.             e.printStackTrace();  
  191.             return null;  
  192.         }  
  193.     }  
  194. }  

附PoolDryException.java

 

  
 
 
  1. public class PoolDryException extends Exception {  
  2.  
  3.     private static final long serialVersionUID = 1L;  
  4.  
  5.     public PoolDryException(String error)  
  6.     {  
  7.         super(error);  
  8.     }  

Support  By wzzcn.net

本文出自 “我的代码库” 博客,请务必保留此出处http://wenjianwzz.blog.51cto.com/1600442/325686