`
qingyuan914
  • 浏览: 21997 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

JLDAP 连接池的创建及测试程序。

阅读更多

    由于是基于web开发,所以自己想写一个像tomcat管理数据库连接池一样的东东。

大体思路是这样的,由LDAPConectionDataFactory来创建LDAPConectionData类,在把创建好的实例放到管理类LDAPConectionDataPool(池)里边;用户可以定义最多的LDAPConection链接的数量。

1、LDAPConectionData类

public class LDAPConectionData {
	
	private boolean conetIsFree=true;//判断该链接是否被占用(链接是可用的,还是已经在使用中的)
	
	private boolean isClosed=false;//判断链接是否关闭,在这里几乎我没有用到该标志。
	
	private LDAPConnection conn=null;//LDAP链接。
	
	public LDAPConectionData(String ldapURl,int port,String user,String passwd) throws LDAPException{//初始化LDAP链接
		conn=new LDAPConnection(); 
		conn.connect(ldapURl, port);
		conn.bind(LDAPConnection.LDAP_V3, user, passwd);
		System.out.println("------LDAPConnection create successfully!-----");
	}


	
	public boolean getConetIsFree() {
		return conetIsFree;
	}



	public void setConetIsFree(boolean conetIsFree) {
		this.conetIsFree = conetIsFree;
	}



	public boolean getClosed() {
		return isClosed;
	}



	public void setClosed(boolean isClosed) {
		this.isClosed = isClosed;
	}



	public LDAPConnection getConn() {
		return this.conn;
	}



	public void closeLDAPConnection(){
		if(this.conn!=null){
			try {
				conn.disconnect();
			} catch (LDAPException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}

}

 

2、LDAPConectionDataPool类,该类用来获取连接,并释放链接(管理连接资源)。

import java.util.ArrayList;
import java.util.List;
import com.novell.ldap.LDAPException;

final class LDAPConectionDataPool implements java.io.Serializable {

	private List<LDAPConectionData> pool = new ArrayList<LDAPConectionData>();//生成的LDAPConectionData实例,统统的都放到该List中,进行管理。

	private static LDAPConectionDataPool LDAPConnDataPool = null;//把该类设置成一个单点模式。

	private LDAPConectionDataPool() {

	}

	public static synchronized LDAPConectionDataPool getInstance() {
		if (LDAPConnDataPool == null) {
			return new LDAPConectionDataPool();
		} else {
			return LDAPConnDataPool;
		}
	}

	public void add(LDAPConectionData aa) {
		aa.setConetIsFree(false);
		this.pool.add(aa);
	}

	public synchronized void setConectionDataFree(LDAPConectionData da) {//用完后设置该连接为空闲状态,以便其他线程重用,并把阻塞的线程唤醒。

		if (!da.getConetIsFree()) {
			da.setConetIsFree(true);
			this.notifyAll();
		}
	}

	public synchronized LDAPConectionData getLDAPConectionData()
			throws InterruptedException {//调用该方法返回一个LDAPConectionData
		LDAPConectionData datatemp = null;
		if (this.getSize() < LDAPConectionDataFactory.MAX_NUM_CONN) {//如果产生的LDAPConectionData还没有达到最大连接数,则可以从工厂里获取。

			if (getSize() == 0 || datatemp == null) {
				try {
					datatemp = LDAPConectionDataFactory.createLDAPConection();
					System.out.println(getSize());
					this.add(datatemp);
				} catch (LDAPException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		} else {//如果已经达到最大连接数了。那么就的等待,一直到有空闲的LDAPConectionData可以使用。
			wait();
			for (LDAPConectionData data : pool) {
				if (data.getConetIsFree())
					datatemp = data;
				break;

			}

		}
		return datatemp;
	}

	public int getSize() {
		return pool.size();
	}

	public void removeAll() {
		closeAll();
		pool.clear();
	}

	public void closeAll() {
		for (LDAPConectionData data : pool) {
			data.closeLDAPConnection();
		}
	}

	public LDAPConectionData hasFree() {//这个方法几乎没有用。
		if (getSize() < 1)
			return null;
		LDAPConectionData datatemp = null;
		for (LDAPConectionData data : pool) {
			if (data.getConetIsFree())
				datatemp = data;
			break;

		}
		return datatemp;
	}
	
	public void finalize()throws Throwable{
		this.removeAll();
	}
}

 

3.LDAPConectionDataFactory工厂类。用来创建连接的类。

import javax.naming.Context;
import javax.naming.NamingEnumeration;
import javax.naming.directory.DirContext;
import javax.naming.directory.InitialDirContext;
import javax.naming.directory.SearchControls;
import javax.naming.directory.SearchResult;

import com.novell.ldap.LDAPException;

public class LDAPConectionDataFactory {

	private static final String LDAP_URL = "192.168.16.21";// 连接地址

	private static final int LDAP_PORT = 20000;// 端口。

	private static final String MANAGER_USR = "cn=admin";// 用户名

	private static final String MANAGER_PASSWD = "12345678";// 密码

	public static final int MAX_NUM_CONN = 2;// 用户可以在这儿设置最多生成几个链接。

	public static LDAPConectionData createLDAPConection() throws LDAPException {
		return new LDAPConectionData(LDAPConectionDataFactory.LDAP_URL,
				LDAPConectionDataFactory.LDAP_PORT,
				LDAPConectionDataFactory.MANAGER_USR,
				LDAPConectionDataFactory.MANAGER_PASSWD);

	}
}

 

 

以上就是介绍的全部。

还有,再贴上测试类和运行结果。

import com.novell.ldap.LDAPAttribute;
import com.novell.ldap.LDAPAttributeSet;
import com.novell.ldap.LDAPConnection;
import com.novell.ldap.LDAPEntry;
import com.novell.ldap.LDAPException;

public class ThreadTest extends Thread {

	private int uid;

	public LDAPConectionDataPool pool = null;

	public ThreadTest(int uid, LDAPConectionDataPool pl) {
		this.uid = uid;
		this.pool = pl;
	}

	public void run() {
		System.out.println("Thread:" + uid + " is run!");
		LDAPAttributeSet attributeSet = new LDAPAttributeSet();
		attributeSet.add(new LDAPAttribute("objectclass", new String(
				"inetOrgPerson")));
		attributeSet.add(new LDAPAttribute("cn", new String[] { "李",
				"Jim Smith", "Jimmy Smith" }));
		attributeSet.add(new LDAPAttribute("givenname", new String[] { "测试",
				"Jim", "Jimmy" }));
		attributeSet.add(new LDAPAttribute("sn", new String("Smith")));
		attributeSet.add(new LDAPAttribute("telephonenumber", new String(
				"1 801 555 1212")));
		attributeSet.add(new LDAPAttribute("mail",
				new String("JSmith@Acme.com")));
		attributeSet.add(new LDAPAttribute("userpassword", new String(
				"newpassword")));
		LDAPEntry entry = new LDAPEntry("uid=" + uid
				+ ",ou=Code,cn=Lizl,dc=4a,dc=4adomain", attributeSet);
		LDAPConectionData data = null;
		try {
			data = pool.getLDAPConectionData();
		} catch (InterruptedException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
		try {
			LDAPConnection lc = data.getConn();
			lc.add(entry);
			System.out.println("POOL's maxsize="+pool.getSize());
		} catch (LDAPException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			if (data != null)
				pool.setConectionDataFree(data);

		}
	}

	public static void main(String args[]) {
		LDAPConectionDataPool pool = LDAPConectionDataPool.getInstance();
		ThreadTest a = new ThreadTest(431, pool);
		ThreadTest b = new ThreadTest(421, pool);
		ThreadTest c = new ThreadTest(422, pool);
		ThreadTest d = new ThreadTest(423, pool);
		ThreadTest e = new ThreadTest(424, pool);
		ThreadTest f = new ThreadTest(425, pool);
		ThreadTest g = new ThreadTest(426, pool);
		ThreadTest h = new ThreadTest(427, pool);
		ThreadTest i = new ThreadTest(428, pool);
		ThreadTest j = new ThreadTest(429, pool);
		ThreadTest k = new ThreadTest(430, pool);
		try {
			a.join();
			b.join();
			c.join();
			d.join();
			e.join();
			f.join();
			g.join();
			h.join();
			i.join();
			k.join();
		} catch (InterruptedException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}

		
		a.start();
		b.start();
		c.start();
		d.start();
		e.start();
		f.start();
		g.start();
		h.start();
		i.start();
		j.start();
		k.start();

	}
}

 

 运行结果如下:

 

Thread:400 is run!
Thread:401 is run!
Thread:403 is run!
Thread:405 is run!
Thread:402 is run!
Thread:404 is run!
Thread:406 is run!
Thread:408 is run!
Thread:407 is run!
Thread:409 is run!
Thread:410 is run!
------LDAPConnection create successfully!-----
0
------LDAPConnection create successfully!-----
1

2
0
分享到:
评论
1 楼 caiceclb 2009-05-25  
正在痛苦的研究ldap中...路过。。多谢你的资料

另外:ldap服务器使用openldap还是使用apacheDS好些?可否对比一下?谢谢

相关推荐

    sqlserver连接池及测试程序

    "sqlserver连接池及测试程序"这一主题,主要涉及的是SQL Server如何管理和优化数据库连接,以及如何通过测试程序进行性能评估。 连接池是数据库系统中的一个重要概念,它的主要作用是提高数据库应用的性能和效率。...

    连接池实现原理及效率测试

    《连接池实现原理及效率测试》 连接池是数据库应用中的一个重要概念,它在系统设计中扮演着提高性能、优化资源利用的关键角色。本文将深入探讨连接池的实现原理,并通过实际测试分析其效率。 首先,我们需要理解...

    连接池案例 连接池案例

    2. 获取连接:当程序需要访问数据库时,不再直接创建新连接,而是从连接池中获取一个已存在的连接。 3. 使用与归还:程序使用完连接后,不关闭它,而是将其归还到连接池,供其他请求使用。 4. 监控与调整:连接池会...

    kafka生产者连接池

    3. **连接池管理**:连接池需要监控连接的状态,确保连接的有效性,当检测到连接异常时,会自动移除并重新创建新的连接。 4. **连接扩展**:当连接池中的连接被全部占用时,如果请求量持续增加,连接池可能会根据...

    nodejs封装好的mysql数据库模块,带mysql连接池以及百万测试数据

    连接池是一组预先初始化的数据库连接,当需要执行数据库操作时,可以从池中获取一个连接,用完后再归还,而不是每次操作都创建新的连接。这降低了创建和销毁连接的开销,提升了整体性能。在本模块中,使用了`mysql2`...

    MySql数据库连接池C#代码(有注释含测试代码)

    MySQL数据库连接池是提高应用程序性能的一种重要技术,它允许开发者管理多个数据库连接并高效地复用这些连接,而不是每次需要时都创建新的连接。在C#编程中,我们可以使用自定义的连接池或者第三方库如ADO.NET的...

    Tomcat连接池配置.doc

    Tomcat 连接池配置是 Web 应用程序中一个非常重要的组件,它负责管理和维护数据库连接,确保数据访问的高速和安全性。本文将详细介绍 Tomcat 连接池配置的步骤和原理,帮助读者快速掌握 Tomcat 连接池的使用。 一、...

    java ftp连接池

    这个测试可能包括创建连接池、执行FTP操作(如上传、下载、列出目录等)、验证连接池的性能和稳定性等。 总的来说,使用Java FTP连接池能够提高FTP操作的效率,减少系统负载,而且通过合理的配置,还能确保服务的...

    delphi_ADO连接池测试.rar

    这个测试项目可能包含了创建连接池的类,以及相关的多线程测试代码,帮助开发者理解和实践数据库连接池的管理。 总结来说,Delphi_ADO连接池是提高数据库应用效率的关键技术,它通过复用连接、控制并发和线程安全,...

    数据库连接池驱动程序包

    数据库连接池是现代应用程序开发中的重要组成部分,它有效地管理和优化了数据库连接的创建、分配和回收,从而提高系统的性能和稳定性。在这个“数据库连接池驱动程序包”中,包含了三种主流的连接池实现:C3P0、DBCP...

    C# 数据库连接池 C# 数据库连接池

    1. **初始化**:当应用程序首次请求数据库连接时,连接池会创建一定数量的初始连接,这些连接保持空闲状态以备后续使用。 2. **请求连接**:当应用程序需要与数据库交互时,它不会直接创建新的连接,而是向连接池...

    java socket连接池 实现

    连接池是在应用程序启动时创建一定数量的Socket连接,并将它们保存在一个集合中,当需要建立新的网络连接时,从池中获取一个已经建立好的连接,使用完毕后归还给池,而不是立即关闭。这样可以避免频繁的创建和销毁...

    Java连接SAP系统所用的JCo连接池的配置和使用

    在Java应用程序中使用JCo连接池需要首先创建JCo连接池对象,然后使用该对象来连接SAP R3系统。在连接SAP R3系统时,需要提供SAP系统的连接信息,例如主机名、用户名、密码等。在连接成功后,可以使用JCo连接池对象来...

    基于java的数据库连接池(使用了程序设计模式)

    数据库连接池是Java应用程序中管理数据库连接的一种高效方式,它避免了每次建立和关闭数据库连接时的开销。本项目基于程序设计模式,利用Java语言实现了数据库连接池,旨在提高数据库操作的性能和效率。 首先,我们...

    Mongodb连接池for java

    MongoDB连接池是解决数据库连接管理和复用的一种机制,旨在提高应用的并发能力,减少创建和销毁连接的开销,同时确保在高并发场景下的稳定性和响应速度。 标题“MongoDB连接池for Java”指的是在Java环境中,针对...

    okhttp中连接池实现

    连接池是一种资源管理技术,用于存储和管理预先建立的网络连接,避免每次请求都创建新的TCP连接。在OkHttp中,连接池通过复用已存在的TCP连接,减少了握手和TLS协商的时间,从而提高了请求的响应速度。 OkHttp的...

    Delphi数据库连接池性能测试程序(完整版含源码)

    《Delphi数据库连接池性能测试程序详解》 在IT领域,数据库连接管理是系统性能优化的关键环节之一。本文将深入探讨Delphi环境下实现的数据库连接池性能测试程序,结合提供的源码,帮助开发者理解如何有效地利用...

    tomcat连接池的配置与性能测试

    不同的连接池实现有不同的优化策略,例如C3P0提供了连接测试和自动回收,而HikariCP以其高速连接创建和低内存占用而著名。选择合适的连接池并正确配置参数,可以显著提升应用的性能和可靠性。 总的来说,理解和配置...

    自定义JDBC连接池及常用连接池介绍

    连接池的基本思想是预先创建一定数量的数据库连接,存储在一个池中,当应用程序需要时,可以从池中获取一个已存在的连接,使用完毕后归还,而不是每次操作都创建新的连接。这样可以避免频繁的创建和销毁连接带来的...

    RabbitMQ客户端连接池的原理及源码

    同时,结合功能测试和性能测试,我们可以验证连接池的效果,确保在提高性能的同时,不会引入新的问题。 总的来说,RabbitMQ客户端连接池的使用是提升系统效率的关键,理解和掌握其工作原理和源码,有助于我们更好地...

Global site tag (gtag.js) - Google Analytics