以下是项目中的代码的简化版,看看达人们的看法,各位达人有好的代码可以上传一下。不是提问帖哟,不要移动提问中去了。不过common-pool包中的对象池技术比较全面。
package com.test;
public class Client {
private static Client client;
private Client() {
}
public static Client getClient(Client client) {
if (client == null) {
client = new Client();
}
return client;
}
}
package com.test;
/**
* @copyright
* 类说明: 工厂
* @author
* @version 创建时间:2011-4-8
*/
public class ClientFactory {
private static ClientPool clientPool;
private ClientFactory(){}
public static ClientPool getClientInstance(){
if(clientPool == null){
clientPool = new ClientPool(5,8);
}
return clientPool;
}
}
package com.test;
import java.util.ArrayList;
/**
* 类说明: 池
* @version 创建时间:2011-4-8
*/
public class ClientPool {
private Client client=null;
private int inUsed=0; //使用的连接数
private ArrayList<Client> freeConnections = new ArrayList<Client>();//容器,空闲连接
private int minConn; //最小连接数
private int maxConn; //最大连接
public ClientPool() {
}
public ClientPool(int minConn, int maxConn) {
this.minConn = minConn;
this.maxConn = maxConn;
}
/**
* 用完,释放连接
* @param con
*/
public synchronized void freeConnection(Client client)
{
add(false);
if(client!=null){
this.freeConnections.add(client);//添加到空闲连接的末尾
System.out.println("释放连接,现有" + inUsed + "个连接在使用!");
}
if(this.inUsed==0 && this.freeConnections.size()>this.minConn){
for(int i=this.freeConnections.size()-this.minConn; i>0; i--){
client = (Client) this.freeConnections.get(0);
this.freeConnections.remove(0);//如果连接分配出去了,就从空闲连接里删除
System.out.println("释放连接池到最小连接"+this.minConn+",现有" + inUsed + "个连接在使用,连接池数"+this.freeConnections.size()+" !");
}
}
}
/**
*
* 从连接池里得到连接
* @return
*/
public synchronized Client getConnection() {
Client cl = null;
//不能超过最大连接。
if(this.maxConn > this.inUsed){
if (this.freeConnections.size() > 0) {
cl = (Client) this.freeConnections.get(0);
this.freeConnections.remove(0);//如果连接分配出去了,就从空闲连接里删除
if (cl == null)
cl = getNextConnection(); //继续获得连接
} else {
cl = Client.getClient(cl); //新建连接
}
}else{
System.out.println("达到最大连接数"+maxConn+",现有" + inUsed + "个连接在使用!");
}
if (cl != null) {
add(true);
System.out.println("得到连接,现有" + inUsed + "个连接在使用!");
}
return cl;
}
private Client getNextConnection() {
if (this.freeConnections.size() > 0) {
client = (Client) this.freeConnections.get(0);
this.freeConnections.remove(0);//如果连接分配出去了,就从空闲连接里删除
if (client == null)
client = getNextConnection(); //继续获得连接
} else {
client = Client.getClient(client); //新建连接
}
return client;
}
private synchronized void add(boolean add){
if(add)
this.inUsed++;
else if(this.inUsed>0)
this.inUsed--;
}
}
package com.test;
/**
* @copyright
* 类说明:
* @author
* @version 创建时间:2011-4-8
*/
public class Test {
public static void main(String[] args) {
Client clinet1 = ClientFactory.getClientInstance().getConnection();
Client clinet2 = ClientFactory.getClientInstance().getConnection();
Client clinet3 = ClientFactory.getClientInstance().getConnection();
Client clinet4 = ClientFactory.getClientInstance().getConnection();
Client clinet5 = ClientFactory.getClientInstance().getConnection();
Client clinet6 = ClientFactory.getClientInstance().getConnection();
ClientFactory.getClientInstance().freeConnection(clinet4);
Client clinet7 = ClientFactory.getClientInstance().getConnection();
Client clinet8 = ClientFactory.getClientInstance().getConnection();
Client clinet9 = ClientFactory.getClientInstance().getConnection();
Client clinet10 = ClientFactory.getClientInstance().getConnection();
System.out.println(clinet1);
System.out.println(clinet2);
System.out.println(clinet3);
System.out.println(clinet4);
System.out.println(clinet5);
System.out.println(clinet6);
System.out.println(clinet7);
System.out.println(clinet8);
System.out.println(clinet9);
System.out.println(clinet10);
}
}
分享到:
相关推荐
是关于Java对象池技术的原理及其实现的
Java对象池技术的原理及其实现
最简单高效的JAVA对象池、线程池、以及使用对象池技术实现的数据库连接池 已在生产运行5年以上的代码 若有任何问题请与我联系
第2章 Java对象持久化技术概述 2.1 直接通过JDBC API来持久化实体域对象 2.2 ORM简介 2.2.1 对象-关系映射的概念 2.2.2 ORM中间件的基本使用方法 2.2.3 常用的ORM中间件 2.3 实体域对象的其他持久化模式...
Java技术由于其跨平台特性,面向对象特性,安全特性等。 J2EE把数据库访问,Java组件和WE哉术等有机地集成在一起,使 之特别适合于各类医学教学机构复杂的大中型应用, 更好支持B/S结 构,保证系统具有很好的可扩展...
Java对象池技术的原理及其实现 The theory of object pool technology and its implementation
基于面向对象技术的通用LDAP目录访问连接池,包括连接数限制算法。
数据库连接池是减少频繁的创建数据库对象而进行的一项技术. 在此例子中描述了两种连接池的具体配置 以及使用
面试中经常问道的常量池优化技术,Java中的常量值技术是为了方便快捷的创建某些对象而出现的,当需要一个对象时,就可以从池中取一个出来(如果没有则创建一个,创建一个比引用一个要耗时),则在需要重复创建相等...
第2章 Java对象持久化技术概述 2.1 直接通过JDBC API来持久化实体域对象 2.2 ORM简介 2.2.1 对象-关系映射的概念 2.2.2 ORM中间件的基本使用方法 2.2.3 常用的ORM中间件 2.3 实体域对象的其他持久化模式...
第2章 Java对象持久化技术概述 2.1 直接通过JDBC API来持久化实体域对象 2.2 ORM简介 2.2.1 对象-关系映射的概念 2.2.2 ORM中间件的基本使用方法 2.2.3 常用的ORM中间件 2.3 实体域对象的其他持久化模式...
第2章 Java对象持久化技术概述 2.1 直接通过JDBC API来持久化实体域对象 2.2 ORM简介 2.2.1 对象-关系映射的概念 2.2.2 ORM中间件的基本使用方法 2.2.3 常用的ORM中间件 2.3 实体域对象的其他持久化模式...
Java内存分配与管理是Java的核心技术之一,今天我们深入Java核心,详细介绍一下Java在内存分配方面的知识。一般Java在内存分配时会涉及到以下区域: ◆寄存器:我们在程序中无法控制 ◆栈:存放基本类型的...
《Java Web开发技术大全:JSP+Servlet+Struts+Hibernate+Spring+Ajax+》讲解了JSP/S rvlet技术的基础知识,并提供了一个综合案例展示其具体应用,它们是Java Web服务端技术的基石,也是学习Java Web开发所要必须掌握...
《Java Web开发技术大全:JSP+Servlet+Struts+Hibernate+Spring+Ajax+》讲解了JSP/S rvlet技术的基础知识,并提供了一个综合案例展示其具体应用,它们是Java Web服务端技术的基石,也是学习Java Web开发所要必须掌握...
Java生成密钥、保存密钥的实例源码,通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥...
Java生成密钥、保存密钥的实例源码,通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥...
JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于...