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

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

 

基于面向对象技术的通用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应用中。本文使用的底层LDAP APINetscape Directory SDK for Java [7],但该连接池可以非常方便地改为使用其他LDAP API

Java是一个面向对象的开发环境,因此这个连接池管理系统是完全面向对象的系统。第2节中所述的5个主要部件分别由5Java类实现。

连接池管理器类LDAPConnectionPoolManager提供了面向调用者的接口。调用者获得LDAPConnectionPoolManager实例对象后,通过getConnection()freeConnection()获得和释放LDAP连接。连接池管理器内部通过一个Hashtable来维护一组连接池。连接池管理器根据各连接池的配置文件来初始化这些连接池,然后根据用户的需要,连接池管理器调用相应的连接池对象的getConnection()freeConnection()等方法来实现相应的功能。getConnection()调用从用户指定的连接池中获取一个可用的连接交给所需的程序,并做好相应的设置,而freeConnection()调用则将一个用完的连接交还给连接池,但此时并不中断这个连接,而是仅将其标记为空闲,以待重新激活并使用。

连接池类LDAPConnectionPool实现了所有的连接管理算法。通常一个连接池对应一个LDAP目录服务器,因此LDAPConnectionPool首先包含了一些与服务器相关的属性,此外,每个连接池有一个可以同时保持的活跃连接的最大数量maxConngetConnection()方法用于从连接池中返回一个可用的LDAP连接。该方法所采用的算法是:

算法1:生成连接算法

(1)依次检查连接池中的连接,看连接是否工作正常,将工作不正常的连接从连接池中删除。

(2)看目前活跃的连接中有没有正常的、空闲的连接可用。如有,则将其返回给调用者使用。

(3)如果没有可用的连接,则新建一个连接。

(4)对于新建的连接,如果此时连接池中的连接数尚未超过最大值 maxConn, 则将该新建连接加入连接池,即当使用者用freeConnection()将该连接还给连接池时该连接会被保留,并可以被重复使用。

(5)如果此时连接池中的连接数已经达到最大值maxConn,则将该连接请求挂起,直到有一个空闲连接。LDAPConnectionPool中有一个threadMonitor用于挂起和唤醒线程。

从算法1的第5步可以看出,该算法要求进行线程调度,从而达到最优的资源利用。但如果应用的环境较为简单,可以采用下述的算法2。算法2简单实用,在通常的运行环境中能非常有效地工作,同时又能避免因线程调度造成程序复杂性增高。

算法2:生成连接算法2

(1)-(4)同算法1

(5)如果此时连接池中的连接数已经达到最大值maxConn,则新增一个连接,并将其返回给调用者使用。但对这个连接做标记,表明这是maxConn以外的连接,对于这种连接调用freeConnection()进行释放时,系统会将其立即关闭,而不再分配给其他调用者。这样可以避免特殊情况下,连接数过分增长。

算法1和算法2都保证了一个连接池(及其对应的目录服务器)可以最大同时保持maxConn个活跃连接供应用程序重复使用。当应用负载超过预期时,应用程序仍能正常运行,但连接池也不会因这些突发的负载高峰而变得越来越大。这种策略下,maxConn这一属性的值很重要。它是依赖于具体的应用程序及应用环境的。

首先,maxConn依赖于目录服务器和连接池所在的客户端的计算性能。此外应用程序对目录的并发访问数在绝大多数情况下小于maxConn。即:

maxConn < affordableConns

AND

P(conncurrentConns < maxConn) > 95%

其中affordableConns是指目录服务器/客户端的资源所能承受的最大并发连接。P(conncurrentConns < maxConn)指应用运行中并发连接数 < maxConn的概率。

满足这两个条件的maxConn值,可以使连接池给应用程序带来很高的目录访问的速度期望值。

 

freeConnection()方法用于将连接交还给连接池。它的实现算法如下:

算法3:释放连接算法

(1)将这个连接的状态置为可用,并保持其连接活跃,以供下次使用。

(2)将在threadMonitor上挂起的等待连接的线程唤醒,使用该可用连接。这里采用了一个简单的调度算法,即如果有多个线程在等待,则将其全部唤醒,重新竞争可用的连接。这种算法实现简单,而且在一个合适的maxConn值下,不会影响性能。

 

另一个重要的方法是onTimer(),它是定时事件的响应方法。定时器发出定时事件时,onTimer()将会被调用。它的实现算法如下:

算法4:定时清理算法

(1)依次检查连接池中的连接,看连接是否工作正常,将工作不正常的连接从连接池中删除。

(2)如果一个连接在相当一段时间(maxTimeout)内未被使用,则将该连接关闭,并从连接池中移去。

(3)如果一个连接在相当一段时间(maxTimeout)一直被同一个调用者使用并且从未交还给连接池(即这个连接上的传输可能无法中止),则onTimer()方法记录一条日志,并可决定如何采取进一步措施。参见第5节。

 

算法4中的maxTimeout 的值也是依赖于具体应用的。由于目录访问操作的时间一般不会很长,因此maxTimeout 一般设为几分钟即可。超过这一时间的操作可以认为是出错了。同时 onTimer()也可以避免系统维护一些长时间未使用连接,以免浪费资源。

3.2 访问互斥问题

连接池是一个共享的部件,应用程序的所有线程均可以使用连接池,特别是对于Web应用,通常会有大量并发的访问。因此,在连接池中实现访问互斥是非常关键的问题。连接池必须通过访问互斥来保证:

(1)同一个LDAP连接不会分配给两个或两个以上的调用者。

(2)LDAP连接在被交还给连接池以后才会被分配给其他调用者。

(3)LDAP连接池中的连接数属性正确反映了实际的连接数量。

(4)在对连接池进行管理操作时,如定期的清理工作等等,不会影响调用者的使用。

本文使用Java中的临界区[8]来实现连接池的访问互斥。使用synchronized关键字将需要实现互斥访问的程序段(方法)标识出来,作为临界区,从而保证一个时间段内只会有一个线程进入此临界区。

 

4 使用LDAP连接池的优势

使用LDAP连接池解决了第1节中提出的有关LDAP操作的各种问题。首先是性能上的优势。使用了连接池以后,免去了绝大部分建立/关闭连接的消耗,特别是对于那些要处理大量并发事务的应用,可以大幅度提高性能。

可靠性上的优势。连接池中的定时器定期触发清理操作,自动将连接池中工作不正常的连接清除,并且处理超时连接以及长时间空闲的连接。从而使应用开发者不需要关心这些管理工作,可以很方便地实现一个可靠的系统。

开发过程得到了简化。对于小规模应用,由于有一个LDAPOperator封装类,使得用户甚至不需要知道LDAP连接的存在就可以开发LDAP应用。对于大型应用,开发者可以通过LDAPConnectionPoolManager来获取LDAP连接,而连接的管理对开发者也是透明的。既避免了降低了程序的复杂度,方便了程序的维护,也有效避免了“资源泄露”。

5 LDAP连接池的扩展和定制的空间

本文所述的LDAP连接池完全使用面向对象技术实现。由于充分利用了面向对象技术的特点,这个连接池不仅结构清晰、使用方便,而且可以通过继承和重载[9]对连接池的功能和管理策略进行扩展和定制。

连接池的基本功能可以通过设置最大连接数(maxConn)以及超时时间(maxTimeout)等参数来定制。而对于一些复杂的管理策略,如定时清理过程在发现有连接被长时间使用而未返回给连接池时,清理过程将做怎样的处理。在缺省情况下,清理过程仅记录日志而不做其他任何处理,但实际应用环境中使用者也许需要采取强行终止的措施。需要对这种管理策略进行定制的使用者可以继承LDAPConnectionPool类,并重载LDAPConnectionPool.onTimer()方法,在这个方法中自行定义所需的处理方法。用户可以在调用

LDAPConnectionPoolManagergetInstance() 方法时, 将LDAPConnectionPool的子类对象作为参数传入,则连接池将使用该子类,从而具有了定制的管理策略。此外,封装类LDAPOperator可以被继承和重载,从而可以在充分利用连接池的基础上将一些与特定应用相关的操作封装起来,在实际的开发过程中很大程度上提高了开发效率。

6 结束语

由于LDAP目录服务在网络应用环境中被越来越广泛地使用,如何高效、方便地开发基于LDAP目录服务的应用也变得越来越重要。本文所述的LDAP连接池作为一个通用的LDAP目录服务访问组件,不仅可以大幅提高LDAP目录访问的效率,而且使得开发更容易,程序可靠性更高,因此在目录服务应用开发中将会有广泛的应用。

参考文献

1 Lightweight Directory Access Protocol (v2).RFC1777

2 Lightweight Directory Access Protocol (v3).RFC2251

3 Severance,C.Could LDAP Be the Next Killer DAP?.Computer,1997-08:88-89

4 OpenLDAP目录服务器.http://www.openldap.org/

5 Visveswaran S.Connection Pools:Dive into Connection Pooling with

J2EE.http://www-106.ibm.com/developerworks/java/library/j-pool/

6 Carnell J.Wrox:Java 数据库应用程序编程指南.北京:电子工业出版社,2002-01

7 Netscape Directory SDK for Java.http://developer.netscape.com/docs/manuals/dirsdk/jsdk30/contents.htm

8 张卫民,黄瑞芳,卢宇彤.Java语言与应用.北京:清华大学出版社,

1996 9 Barker J.Wrox:Java 面向对象编程指南.北京:电子工业出版社,2001

 

4 用户访问控制

访问控制管理是高考远程录取的关键问题。高考远程录取系统有公开性的特点,无论是进行远程录取的院校还是一般的查询用户都可以进入系统进行相应的操作。在这样一个系统中,如何保证系统不被盗用、如何避免无关用户的恶意试探等是必须要解决的问题。我们在Web应用程序中对用户的访问进行控制,使不同的用户进入相应的网页而拒绝进入与其无关的网页。主要采取的方法有以下几点。

(1)将用户与其IP进行捆绑

当用户登录到远程系统时候,Web服务器自动获取用户的IP地址(如利用ASPRequest对象的ServerVariables属性)。并将此地址与用户登记的信息进行比对,以判别用户是否在规定的IP地址进行访问。如果不是,则认为该用户是非法用户,拒绝登录。对于确认的合法用户,系统将赋予一个表示用户身份的信息。在用户的活动期间,在每个页面都对其身份信息进行校验。

(2)访问时间超时

可以利用ASPResponse对象的Expires属性和Clear方法进行设置:Response.Expire=0可以使缓存的页面立即过期,Response.Clear方法可以清空缓存区。对用户登录后在某一页面停留时间过长而未进行操作,则认为用户已经离开了计算机,让页面过期,可以保护页面不被其他用户盗用。

(3)建立访问日志

将用户对系统的所有访问信息写入访问日志,日志系统具有数据记录功能和自动分类检索能力。日志系统可以记录用户的登录失败操作、对数据库的操作、访问时间、用户名、访问者的IP地址、操作对象、操作类型等等。经常检查访问日志表,特别是特权用户登录信息,可以找出存在的不稳定因素,及时警告,以便采取更换口令等对策。

5 应用实践

目前,我国积极探索高考招生管理手段现代化,在招生工作的远程录取方面进行了大量的工作:自1996年起就开始了远程录取的研究;1998年又实现了考生档案的“无纸化”,现在通过计算机网络已能提供考生的全部档案信息。全国各高校都可以通过Internet在本校进行远程录取。我们提出的用户管理方案在系统运行过程中,用户管理规范,身份认证和访问控制方面安全可靠。这些都充分地证明了本文所提出的用户管理方案的成功。

6 结束语

目前,高考远程录取是一个Web应用上的热点问题。它实现了招生手段的现代化。既有利于维护公平、公正、公开的录取原则,又节省了人力、财力。具有很强的社会意义。但是由于它是一个复杂的系统,具有大量的不同级别的用户,而且各自的数据都是极端保密的,因此有必要对用户的管理提出系统的解决方案。本文对此进行分析后,提出了远程录取系统的用户管理、身份认证和用户访问控制的方法和一些具体技术的改进。这将进一步促使远程录取事业的进一步发展。

 

参考文献

1 李 莉,张为群,黄智兴等.基于Domino的远程录取系统的设计与实

.计算机应用,1998,18(8):38-40

2 朱 虹,冯玉才,吴永英.基于用户-角色的安全管理.华中理工大学

学报 ,2000,28(4):23-25

3 于义科,程小毛.Web环境下用户管理系统的设计与实现.江西农业

大学学报,2001,23(5):79-83

4 付连续,罗 飞,文绍纯等基. 于网络用户安全的信息管理系统的设

.计算机应用,2001,21(12):37-41

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值