`
jiangnan2112
  • 浏览: 120149 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类
最新评论

java对象池技术

阅读更多
以下是项目中的代码的简化版,看看达人们的看法,各位达人有好的代码可以上传一下。不是提问帖哟,不要移动提问中去了。不过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对象池技术的原理及其实现

    Java对象池技术的原理及其实现

    对象池&线程池&数据库连接池

    最简单高效的JAVA对象池、线程池、以及使用对象池技术实现的数据库连接池 已在生产运行5年以上的代码 若有任何问题请与我联系

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

    第2章 Java对象持久化技术概述  2.1 直接通过JDBC API来持久化实体域对象  2.2 ORM简介  2.2.1 对象-关系映射的概念  2.2.2 ORM中间件的基本使用方法  2.2.3 常用的ORM中间件  2.3 实体域对象的其他持久化模式...

    java系统软件技术架构设计方案.docx

    Java技术由于其跨平台特性,面向对象特性,安全特性等。 J2EE把数据库访问,Java组件和WE哉术等有机地集成在一起,使 之特别适合于各类医学教学机构复杂的大中型应用, 更好支持B/S结 构,保证系统具有很好的可扩展...

    Java--pool-technology.rar_theory

    Java对象池技术的原理及其实现 The theory of object pool technology and its implementation

    基于面向对象技术的通用LDAP目录访问连接池

    基于面向对象技术的通用LDAP目录访问连接池,包括连接数限制算法。

    java两种连接池的使用举例

    数据库连接池是减少频繁的创建数据库对象而进行的一项技术. 在此例子中描述了两种连接池的具体配置 以及使用

    十分钟读懂java常量池优化技术

    面试中经常问道的常量池优化技术,Java中的常量值技术是为了方便快捷的创建某些对象而出现的,当需要一个对象时,就可以从池中取一个出来(如果没有则创建一个,创建一个比引用一个要耗时),则在需要重复创建相等...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part4

    第2章 Java对象持久化技术概述  2.1 直接通过JDBC API来持久化实体域对象  2.2 ORM简介  2.2.1 对象-关系映射的概念  2.2.2 ORM中间件的基本使用方法  2.2.3 常用的ORM中间件  2.3 实体域对象的其他持久化模式...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part3

    第2章 Java对象持久化技术概述  2.1 直接通过JDBC API来持久化实体域对象  2.2 ORM简介  2.2.1 对象-关系映射的概念  2.2.2 ORM中间件的基本使用方法  2.2.3 常用的ORM中间件  2.3 实体域对象的其他持久化模式...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part1.rar

    第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在内存分配方面的知识。一般Java在内存分配时会涉及到以下区域:  ◆寄存器:我们在程序中无法控制  ◆栈:存放基本类型的...

    java web开发技术大全

    《Java Web开发技术大全:JSP+Servlet+Struts+Hibernate+Spring+Ajax+》讲解了JSP/S rvlet技术的基础知识,并提供了一个综合案例展示其具体应用,它们是Java Web服务端技术的基石,也是学习Java Web开发所要必须掌握...

    java web技术开发大全(最全最新)

    《Java Web开发技术大全:JSP+Servlet+Struts+Hibernate+Spring+Ajax+》讲解了JSP/S rvlet技术的基础知识,并提供了一个综合案例展示其具体应用,它们是Java Web服务端技术的基石,也是学习Java Web开发所要必须掌握...

    JAVA上百实例源码以及开源项目

     Java生成密钥、保存密钥的实例源码,通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥...

    JAVA上百实例源码以及开源项目源代码

     Java生成密钥、保存密钥的实例源码,通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥...

    java开源包11

    JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于...

Global site tag (gtag.js) - Google Analytics