在上一篇中,我給大家介紹了一個控制類對象個數的實現方式(見連結:http://blog.csdn.net/wolfofsiberian/article/details/39856367)但是考慮到,這個程式實現的是不夠完善的。因為,我們可以想到,在實際使用過程中,Connection對象在使用者使用的過程中,當使用者先申請到了,然後再釋放串連的時候。這個釋放的過程是個隨機的,比如說:當釋放的連線物件時connArray[3]時候,這個時候,類應該對connArray[3]這個位置進行回收,如果使用者釋放connArray[4]串連時候,類也需要對其進行回收,以便後面其他使用者申請的時候給它們分配。
問題描述:
建立一個名為ConnectionManager的類,該類管理一個元素為Connection對象的固定數組。用戶端程式員不能直接建立Connection對象,而只能通過ConnectionManager中的某個static的方法來擷取它們。當ConnectionManager之中不再有對象時,它會返回null引用。在main()之中檢測這些類。(這裡ConnectionManager替換為下面的ConnectionManagerEnhence)
具體的實現思路如下:
<pre name="code" class="java">/*** Thinking in Java test 6.8(限制類對象個數)完善版* @author:WolfOfSiberian* @email:QuietWolf@yeah.net*/import java.sql.DriverManager;import java.sql.Connection;import java.sql.SQLException;public class ConnectionManagerEnhence{ //最大串連數private static final int connMax = 10;//Connection對象靜態數組private static Connection connArray[] = new Connection[connMax];//當前使用的串連數private static int countUse = 0;/*** 構造方法私人化*/private ConnectionManagerEnhence(){//}/*** 擷取可用的Connection對象數組的下標 * @return 返回可以建立Connection對象的靜態數組的下標索引,如果沒有可用下標索引,則返回-1。*/private static int getAvailable(){for(int i=0;i<connMax;i++){if(null == connArray[i]){return i;}}return -1;}/*** 擷取Connection對象* @return 返回建立的的Connection對象*/public static Connection getConnection()throws Exception{if(countUse >= connMax){System.out.println("Sorry,There is no Connection Object for you to use!");return null;}else{ Class.forName("com.mysql.jdbc.Driver").newInstance();//載入串連MySQL資料庫的驅動程式int availableIndex = getAvailable();//擷取可用的Connection對象數組下標//System.out.print(" " +availableIndex+" "); connArray[availableIndex] = DriverManager.getConnection("jdbc:mysql://localhost/test?"+"user=root&password=sine88");//擷取連線物件Connection countUse++;//使用串連數加一,可用的串連數卻少了一個System.out.println("分配1個Connection對象:index="+availableIndex+"當前線上串連數:"+countUse+",當前可用串連數:"+(connMax - countUse)); return connArray[availableIndex];}}/*** 釋放指定Connection對象* @param conn 需要被釋放的串連*/public static void freeConnection(Connection conn)throws Exception{for(int i=0;i<connMax;i++){if(conn != null){if(connArray[i] == conn){connArray[i].close();connArray[i] = null;countUse--;//釋放一個Connection對象System.out.println("釋放1個Connection對象:index="+i+"當前線上串連數:"+countUse+",當前可用串連數:"+(connMax - countUse));}}}}//main入口public static void main(String[] args)throws Exception{Connection conn[]=new Connection[11];for(int i=0;i<11;i++){conn[i] = ConnectionManagerEnhence.getConnection();//System.out.println(conn[i]+":"+connArray[i]);}for(int j=0;j<10;j=j+2){ConnectionManagerEnhence.freeConnection(conn[j]);}conn[2] = ConnectionManagerEnhence.getConnection();}}
運行結果:
F:\01 Java\01 Project\01 TinkingInJava>java ConnectionManagerEnhence
分配1個Connection對象:index=0當前線上串連數:1,當前可用串連數:9
分配1個Connection對象:index=1當前線上串連數:2,當前可用串連數:8
分配1個Connection對象:index=2當前線上串連數:3,當前可用串連數:7
分配1個Connection對象:index=3當前線上串連數:4,當前可用串連數:6
分配1個Connection對象:index=4當前線上串連數:5,當前可用串連數:5
分配1個Connection對象:index=5當前線上串連數:6,當前可用串連數:4
分配1個Connection對象:index=6當前線上串連數:7,當前可用串連數:3
分配1個Connection對象:index=7當前線上串連數:8,當前可用串連數:2
分配1個Connection對象:index=8當前線上串連數:9,當前可用串連數:1
分配1個Connection對象:index=9當前線上串連數:10,當前可用串連數:0
Sorry,There is no Connection Object for you to use!
釋放1個Connection對象:index=0當前線上串連數:9,當前可用串連數:1
釋放1個Connection對象:index=2當前線上串連數:8,當前可用串連數:2
釋放1個Connection對象:index=4當前線上串連數:7,當前可用串連數:3
釋放1個Connection對象:index=6當前線上串連數:6,當前可用串連數:4
釋放1個Connection對象:index=8當前線上串連數:5,當前可用串連數:5
分配1個Connection對象:index=0當前線上串連數:6,當前可用串連數:4