You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by lu...@apache.org on 2016/12/13 20:37:32 UTC

svn commit: r1774097 - /directory/site/trunk/content/api/user-guide/2.1-connection-disconnection.mdtext

Author: lucastheisen
Date: Tue Dec 13 20:37:32 2016
New Revision: 1774097

URL: http://svn.apache.org/viewvc?rev=1774097&view=rev
Log:
DIRAPI-287: Documentation is wrong for connection pooling

Modified:
    directory/site/trunk/content/api/user-guide/2.1-connection-disconnection.mdtext

Modified: directory/site/trunk/content/api/user-guide/2.1-connection-disconnection.mdtext
URL: http://svn.apache.org/viewvc/directory/site/trunk/content/api/user-guide/2.1-connection-disconnection.mdtext?rev=1774097&r1=1774096&r2=1774097&view=diff
==============================================================================
--- directory/site/trunk/content/api/user-guide/2.1-connection-disconnection.mdtext (original)
+++ directory/site/trunk/content/api/user-guide/2.1-connection-disconnection.mdtext Tue Dec 13 20:37:32 2016
@@ -73,19 +73,46 @@ Once you don't need to use the connectio
 
 ## Using a pool of connections
 
-Creating a connection is expensive. If you are to reuse a connection over and over, or if you are writing an application that will need many LDAP conenctions, you may want to use a pool of connections.
+Creating a connection is expensive. If that connection will be reused, or if your application needs multiple connections, you may want to consider using a _connection pool_.
 
-This is slightly more complex than simply opening a new connection, as you have a lot of parametrs that can come into play when creating a pool.
-Here is an example of creation of a pool of connections :
+This process is slightly more complex given that there are many parameters that can be used to tune the pool.  Here is an example:
 
     :::Java
     LdapConnectionConfig config = new LdapConnectionConfig();
-    config.setLdapHost( "localhost" );
-    config.setLdapPort( 389 );
-    config.setName( "uid=admin,ou=system" );
-    config.setCredentials( "secret" );
-    PoolableLdapConnectionFactory factory = new PoolableLdapConnectionFactory( config );
-    LdapConnectionPool pool = new LdapConnectionPool( factory );
-    pool.setTestOnBorrow( true );
+    config.setLdapHost( hostname );
+    config.setLdapPort( port );
+    config.setName( adminDn );
+    config.setCredentials( adminPassword );
 
-Here, we just have created a pool of connections which all are unthenticated using the administrator user. You can create anonymous connections, it's just a matter of not setting any name or credentials in the config.
+    DefaultLdapConnectionFactory factory = new DefaultLdapConnectionFactory( config );
+    factory.setTimeOut( connectionTimeout );
+
+    // optional, values below are defaults
+    GenericObjectPool.Config poolConfig = new GenericObjectPool.Config();
+    poolConfig.lifo = true;
+    poolConfig.maxActive = 8;
+    poolConfig.maxIdle = 8;
+    poolConfig.maxWait = -1L;
+    poolConfig.minEvictableIdleTimeMillis = 1000L * 60L * 30L;
+    poolConfig.minIdle = 0;
+    poolConfig.numTestsPerEvictionRun = 3;
+    poolConfig.softMinEvictableIdleTimeMillis = -1L;
+    poolConfig.testOnBorrow = false;
+    poolConfig.testOnReturn = false;
+    poolConfig.testWhileIdle = false;
+    poolConfig.timeBetweenEvictionRunsMillis = -1L;
+    poolConfig.whenExhaustedAction = GenericObjectPool.WHEN_EXHAUSTED_BLOCK;
+
+    LdapConnectionPool pool = new LdapConnectionPool(
+        new DefaultPoolableLdapConnectionFactory( factory ), poolConfig ) );
+
+This will create a pool of connections that will be pre-authenticated.  If you do not setName and setCredentials, then the pool will contain unauthenticated connections.
+
+The DefaultPoolableLdapConnectionFactory is sufficient for many cases.  However, certain operations result in modifications to the connection itself.  For example, when the pool is created, a bind operation will occur with the credentials supplied as part of the config.  If you borrow a connection and perform a bind yourself, that would result in the connection being re-bound as a different user.  The next time that connection gets borrowed, things are likely to break.  If you perform any operation that results in a modification of the connection, you should instead use ValidatingPoolableLdapConnectionFactory:
+
+    :::Java
+    ...
+    PoolableLdapConnectionFactory factory = new ValidatingPoolableLdapConnectionFactory( config );
+    ...
+
+A connection pool using this factory will unbind and rebind any connection that was modified while it was borrowed (_see the javadoc for more detail_).  This will be slower due to the additional operations, but not too significantly.