由于是基于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
分享到:
相关推荐
多年前项目用一个sqlserver连接池,附带测试程序。
Delphi数据库连接池性能测试程序(完整版含源码)
weblogic与oracle数据库通过连接池连接及测试代码 另有myeclipse中weblogic服务器下使用jsf1.2的设置步骤
nodejs封装好的mysql数据库模块,使用mysql连接池以及附带百万mysql测试数据,实现mysql数据库的增删改查功能,使用方法很详细。
连接池连接池连接池连接池连接池
客户端程序需要连接时,池驱动程序会返回一个未使用的池连接并将其表记为忙。如果当前没有空闲连接,池驱动程序就新建一定数量的连接,新建连接的数量有配置参数决定。当使用的池连接调用完成后,池驱动程序将此连接...
封装抽取了一个kafka生产者的连接池,能很好的用池的方式对kafka生产者连接点进行有效的管理
连接池案例
对于多应用共享同一数据库的系统而言,可在应用层通过数据库连接的配置,实现数据库连接池技术。某一应用最大可用数据库连接数的限制,避免某一应用独占所有数据库资源。 在较为完备的数据库连接池实现中,可根据...
tomcat连接池的配置与性能测试
Oracle10g occi 连接池创建方法Oracle10g occi 连接池创建方法
RabbitMQ客户连接池的Java实现。我们刚开始也是采用这种方式来实现的,但做压力测试时,发现这种每次新建Connection和新建Channel是非常耗时的,在大并发下,一般都要8...因此我们创建了Java的RabbitMQ的连接池对象。
数据库连接池在初始化时创建一定数量的数据库连接放到连接池中,这些数据在连接的数量上是由最小数据库连接数来设定的,无论这些数据库连接是否被使用,连接池都将一直保证至少拥有这么多的连接数量,连接池的最大...
* 获取连接时不需要了解连接的名字,连接池内部维护连接的名字 * 支持多线程,保证获取到的连接一定是没有被其他线程正在使用 * 按需创建连接,可以创建多个连接,可以控制连接的数量 * 连接被复用,不是每次都...
RabbitMQ连接池+SpringBoot实现。通过连接池实现将高效的管理RabbitMQ的Connection,并与springboot进行整合,实现消息发送,获取队列列表等功能。基于此可以进行更多功能的扩充。
C# 数据库连接池 C# 数据库连接池 C# 数据库连接池 C# 数据库连接池
在WebLogic中建立数据库连接池与数据源及利用JBuilder进行测试
并设置此连接为忙的状态,否则就在创建新的连接到连接池中去(有最大的连接池数的限制,不能超过这个连接数,超过的话,就会进入等待状态,直到其它连接释放连接),在执行下载操作的前对登录ftp时间进行判断。...
R2 jdbc连接池,用于java程序中jdbc连接池的配置管理,可应用于非web项目(纯java项目),全参数化配置。 应用时,先用rar打开jar包,拷贝r2.properties文件到class目录,并修改参数。 本包需要用到log4j,请在...
基于tp5的swoole支持,对th5的connection进行改造,使用Swoole\Coroutine\MySQL重写了基于swoole的PDO接口,实现了mysql的数据库连接池,本地测试可用。使用时,替换thinkphp/library/think/db/Connection.php,并...