现在的位置: 首页 > 综合 > 正文

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

2014年01月13日 ⁄ 综合 ⁄ 共 4039字 ⁄ 字号 评论关闭

由于学习原因 本文 从某些资料中转载,文中文字和图片未做任何改动。

 

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

茅维华,李文奇

(上海交通大学网络信息中心, 上海 200030)

摘要:在分布式计算环境中,基于LDAP协议的目录服务正起着越来越重要的作用。针对LDAP目录访问中的性能、可靠性、开发复杂度等

问题,该文将连接池的概念引入LDAP目录访问,实现了一个功能完整的通用LDAP连接池系统。通过降低建立/关闭LDAP连接的开销大幅度

地提高了应用程序访问LDAP的性能,同时通过LDAP连接管理的自动化,实现了一个高效、可靠的LDAP目录访问组件。

关键词:LDAP目录服务;连接池;面向对象程序设计;Java

A Connection Pool Management System for LDAP Directory

Accessing Based on Object-oriented Techniques

MAO WeihuaLI Wenqi

(Network Information Center, Shanghai Jiaotong University , Shanghai 200030)

AbstractDirectory services based on LDAP protocol are becoming more and more important in the distributed computing environment. To address

the performance, reliability and development complexity problems in directory accessing, this paper introduces the concept of connection pool into

LDAP directory accessing and implements an LDAP connection pool system. By reducing the cost of establishing and closing connections, the

connection pool greatly improves the performance of LDAP accessing. Besides, due to the automatic management of LDAP connections, efficient and

reliable LDAP accessing can be easily implemented using this connection pool component.

Key wordsLDAP directory serviceConnection poolObject-oriented programmingJava

 

 

1 问题的提出

Internet/Intranet这样分布式计算环境中,目录服务正起着越来越重要的作用。它可以作为网络登录、电子邮件发送、数据库存取以及各种网络应用的单一的身份认证系统,并且可以方便地存放和查询用户的各种信息,为网络上跨平台、多客户、分布式的应用开发提供了方便的平台。LDAP(Lightweight Directory Access Protocol, 轻量级目录访问协议)是基于X.500标准发展起来的目录服务访问协议[1,2]LDAPX.500作了改进和简化,更加易于使用,并且LDAP支持TCPIP,这对基于Internet/Intranet的应用是必须的。此外,LDAP的许多特性,包括树状的数据组织结构、高效的查询、跨平台的支持、安全性等等,使得LDAP在目录服务领域中比关系数据库具有很大的优势。越来越多的厂商开始提供基于LDAP目录服务的网络应用解决方案,LDAP正成为目录服务领域中最重要的协议[3]

LDAP目录访问是一个基于连接的协议。使用LDAP API进行目录访问时必须首先建立一个LDAP连接。下面来分析一下建立LDAP连接可能带来的问题。

 

1.1 性能问题

建立连接和取消连接都是要消耗较多资源和时间的操作。包括客户端和服务端分配/释放相应资源的开销、网络的来回时间以及“三次握手”协议的开销。建立一个连接的时间往往是进行一个查询操作的数倍甚至数十倍。以下为实验环境中的一些测试数据。

测试环境是OpenLDAP[4]服务器, 客户端是Windows2000下的JDK1.3.1,使用Netscape Directory SDKfor Java 作为LDAP API。表1中的两行,一行是每次读取操作均建立一个连接,然后读取,最后释放连接。另一行是先建立一个连接,然后在这个连接上不断读取。

 

表中可以看到,第一次建立连接并进行读取操作的开销特别大,这是由于程序第一次使用连接所需的资源、开销很大。接下去的每次建立连接的开销由于系统cache等原因,要小很多,但仍需要100ms左右。而如果在同一个连接上不断读取,一次读取的时间只有10ms左右。可见,建立/释放连接的时间开销是光进行一次读取的时间开销的10倍。

目前很多基于目录服务的分布式网络应用,都会进行大量的LDAP读取操作。特别是很多用户量很大的Web应用,每个用户的每次操作几乎都会有LDAP读取发生,而且这些Web处理进程/线程相互之间又是独立的,如果每次读取都要建立一个LDAP连接,将消耗大量的服务器资源,影响用户得到的响应时间。因此,很有必要建立某种机制来使多个处理进程/处理线程之间共享LDAP连接,来节省资源,提高效率。

 

1.2 开发难度

实际应用中,很多程序经常需要读取很多条不同的LDAP Entry,为了提高LDAP连接的利用率,开发者往往会在程序中建立一些LDAP连接,然后交由不同的处理函数使用,在某一时机,再主动释放这些连接。这种做法往往造成程序中有很多LDAP连接对象在各种函数中不断地传递着,而且为了使程序不会因疏忽或特殊情况没有释放连接而造成“资源泄露”,还要用一些程序去保证释放连接,这些都增加了程序的复杂度,降低了程序的可读性,给程序的维护带来很大不便,不符合现代大型软件的开发要求。因此需要一个统一的管理LDAP连接的机制来解决这些问题。

 

1.3 可靠性问题

如上所述,释放连接也是个重要的问题。如果在一个软件中到处建立连接、释放连接,那将会面临很大的“资源泄露”风险。现在的应用越来越复杂,软件的复杂度也相应提高。设计不好的程序往往会因出现某种异常情况,而发生有些连接没有释放的结果。这就造成了“资源泄露”,影响了软件的可靠性,特别是对那些长时间运行的服务端软件,“资源泄露”会造成很多不良后果。因此,建立一个统一管理LDAP连接、避免“资源泄露”的机制是十分必要的。

 

2 LDAP连接池的结构设计

为了解决上述的各种问题,本文将连接池的概念引入LDAP目录服务,实现了一个功能完整的连接池系统,并进行了很好的封装,成为一个高效、可靠的通用LDAP目录服务访问中间件,它可以被很方便地加入各种应用环境。目前已将其应用到多个上海交通大学校园网应用中去。

连接池的概念在远程数据库访问中早有运用,可以大大提高大型数据库应用的效率[5] 。在基于目录服务的应用中连接池同样也可以起到很好的效果。本文所实现的LDAP连接池系统达到以下的目标:

(1)    通过连接池提高目录访问性能,解决建立/释放连接开销过大的问题;

(2)    连接池起到一个统一的LDAP连接管理器的作用,将LDAP连接的管理和软件的应用逻辑分隔开来,使程序结构更为清晰,开发更容易。使用者可以用和使用普通LDAP连接非常相似的方式使用连接池中的连接,而连接的管理完全被封装,对使用者不可见;

(3)    连接池中的监视机制可以有效地避免连接的资源泄露问题,提高软件的可靠性;

(4)    对于一些小规模应用的开发,特别是一些经验较少的开发者,提供一种更高级的封装,使得使用者可以非常方便地进行各种LDAP操作,在达到相当的功能、性能和可靠性的同时,使用者甚至不必知道LDAP连接的存在

(5)    这个连接池很容易被扩展。高级的用户可以通过继承和重载某些方法,来定制满足特殊需要的连接池管理策略。

 

整个LDAP连接池系统包括5个主要部件:LDAP连接池管理器LDAPConnectionPoolManager LDAP 连接池LDAPConnectionPool LDAP 连接池中的连接LDAPPooledConnection ;定时器LDAPTimerLDAP操作封装类LDAPOperator。图1给出了LDAP连接池系统的结构。

 

 

 

连接池管理器用于管理所有的连接池,并向上层应用提供调用接口。连接池管理器可以管理多个连接池,通常每个连接池可对应一个LDAP目录服务器,这样可以使应用程序方便地访问不同的LDAP目录服务器。连接池具体地实现了对LDAP连接的管理策略。并在定时事件的触发下通过适当的管理策略使整个连接池能长时间可靠地运行。

1中的“连接”是一个可管理的LDAP连接类。它封装了底层LDAP API提供的LDAP连接类,增加了使用状态、时间戳、应用标识等管理属性,从而使连接池可以根据管理策略对其进行管理。

定时器是一个独立线程,它根据预设的频率向连接池发出定时事件,触发连接池的定时管理策略。

LDAPOperator是一个适合于快速开发小应用的封装类,通过它用户不必知道连接的存在就可以实现高效、可靠的目录访问。LDAPOperator还可以封装与应用相关的各种操作。

 

3 LDAP连接池的实现

3.1 连接池的Java实现

Java平台作为一个可移植性很高的开发环境,在网络应用开发中占有举足轻重的地位。在Java环境中,运用于数据库访问的连接池产品早已有了相当成熟的应用[6]。但对于目录服务则还没有一个完整的连接池产品,用于帮助用户快速、可靠地开发基于目录服务的应用。本文基于Java实现了一个LDAP连接池系统。作为一个通用的LDAP中间件可以被使用在各种Java

抱歉!评论已关闭.