(Mostly thinking out loud)

Is there any downside in us wrapping the NetworkLdapConnection returned by
the LdapConnectionPool to call releaseConnection instead of close?

Possibly a new `PooledLdapConnection` that _basically_ delegates everything
except the `close` method?

That would allow backward compatibility with the current
`releaseConnection()` usage. Possibly not with `close()` ( though I'm not
sure that's a valid code path?)




On Wed, Feb 21, 2024 at 12:57 PM Emmanuel Lécharny <elecha...@gmail.com>
wrote:

> Hi Brian,
>
> long story short: the LdapConnection interface (and implementation)
> already has a close() method that shutdowns the IO connection, so it's
> not possible to use the try-with-resources feature, because that would
> have meant changing the LDAP API to make the close() method actually
> close the LDAP session, not the IO connection...
>
> So we added the releaseConnection() method which puts back the
> connection into the pool, but needs to be called explicitly.
>
> yes, it's a bit of a burden...
>
> Keep in mind that the LDAP API has been defined in 2006, 8 years before
> try-with-resources was included in Java 8 :/
>
>
> On 21/02/2024 17:59, Brian Demers wrote:
> > I'm hacking away on a SCIMple + ApacheDS + LDAP API example.
> > I haven't used the LDAP API project before, but the docs have been a big
> > help!
> >
> > One thing I'm struggling with is the way connection pooling _should_ be
> > used.
> >
> > For example, a non-pooled request could be created doing something like
> > this:
> >
> > ```
> > try (LdapConnection connection = new LdapNetworkConnection( "localhost",
> > 389 )) {
> >    // do something with connection
> > }
> > ```
> >
> > The connection will close and everyone is fine.
> >
> > When using a connection pool the pattern is a little different
> >
> > I was doing something like this:
> >
> > ```
> > try (LdapConnection connection = connectionPool.getConnection()) {
> >    // do something with connection
> > }
> > ```
> >
> > But after making that change, I started seeing tests hang, after a few of
> > them had run and used a connection (possibly connections were locked)
> >
> > I stumbled on one of the connection pooling tests that looked like I
> should
> > be calling `connectionPool.releaseConnection(connection)`
> > That seemed to fix my issue (this should be mentioned here,
> >
> https://directory.apache.org/api/user-guide/2.1-connection-disconnection.html
> ,
> > I submit a doc fix once this thread is resolved)
> >
> > So that ends up being something like this
> > ```
> > LdapConnection connection = connectionPool.getConnection()
> > try  {
> >    // do something with connection
> > } finally {
> >    connectionPool.releaseConnection(connection)
> > }
> > ```
> >
> > This solution is fine, but... I was expecting the pooled connection to
> > release the connection instead of closing it.
> >
> > I hacked around this by extending the LdapConnectionPool and forcing a
> > release instead of a close.
> > Quick & dirty with a reflection Proxy:
> > https://gist.github.com/bdemers/ec2da73f8496fe1cc673619b84f3f450
> >
> > After this, my pooled connections could be used the same as non-pooled
> > connections, which was my goal, but...
> >
> > Now for the naive question.
> > Is this a good idea? Are there times when I would want to close the
> > connection instead of releasing it?
> > Should we think about adding something like this to LdapConnectionPool,
> or
> > is this a doc issue?
> >
> > Thanks
> > -Brian
> >
>
> --
> *Emmanuel Lécharny* P. +33 (0)6 08 33 32 61
> elecha...@apache.org
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: api-unsubscr...@directory.apache.org
> For additional commands, e-mail: api-h...@directory.apache.org
>
>

Reply via email to