[ 
https://issues.apache.org/jira/browse/JCR-1456?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12709547#action_12709547
 ] 

Matej Knopp commented on JCR-1456:
----------------------------------

>Using ThreadLocal for the connection seems unnecessarily complex (from the 
>perspective of someone new trying to understand the code), it's better to pass 
>the connection around as a method argument or encapsulate it as a member 
>variable of an object that performs the database operations 

The problem here is that BundleDbPersistenceManager superclass is connection 
agnostic so passing the database connection as argument doesn't seem to be an 
option. Storing that as member variable is, but it requires additional locking. 
To reduce unnecessary locking I decided to use thread locals. Since it's 
perceived to be too complicated there won't be any in next patch.

> Could you implement this without introducing new configuration entries? We 
> may consider adding that later, but it would be clearer if we first 
> implemented connection pooling with the access configuration that we 
> currently have. 

As far as I can remember all introduced configuration entities were completely 
optional with sane default making the change pretty much transparent for user.

> We should leverage something like Commons DBCP instead of implementing our 
> own connection pooling logic. Commons DBCP is much better than anything that 
> we could come up with. 

What's the point of hardwiring concrete connection pool? In my previous patch I 
didn't attempt to do any connection pooling. I just had a connection source 
which could be easily implemented to get the connection from *any* connection 
pool or JNDI. If you insist though on using commons dbcp I can live with that 
though.

> Related to the above, we should use the standard DataSource interface 
> interface instead of a custom ConnectionManager class. This would nicely 
> abstract away all the pooling logic and make the code much more familiar to 
> people who already know JDBC. All top-level methods would look like something 
> like this

The connection manager in patch didn't create database connections. It 
delegated that to a connection provider. The purpose of ConnectionManager were 
some convenience methods and prepared statements caching. The connection 
provider was simple DataSource like interface. The reason why I chose not to 
use DataSource is because DataSource has no means to pass connection properties 
(url, driver, etc). That normally isn't a problem, in jackrabbit however it is, 
because the database properties are specified on components level (persistence 
manager, file system, journal, etc). 

If PersistenceManager is supposed to have connection properties (which you seem 
to insist on in order not to change configuration) then it needs a way to pass 
these information to code that manages database connections. And DataSource 
doesn't provide any means for it.

The custom sandbox could work for me. 

Thanks for your input, it's very appreciated.

> Database connection pooling
> ---------------------------
>
>                 Key: JCR-1456
>                 URL: https://issues.apache.org/jira/browse/JCR-1456
>             Project: Jackrabbit Content Repository
>          Issue Type: Improvement
>          Components: jackrabbit-core
>            Reporter: Jukka Zitting
>         Attachments: patch-1456-1.txt, patch-1456-2.txt, patch-1456-3.txt
>
>
> Jackrabbit should use database connection pools instead of a single 
> connection per persistence manager, cluster journal, or database data store.

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to