在上一篇中,我给大家介绍了一个控制类对象个数的实现方式(见链接: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