[ 
https://issues.apache.org/jira/browse/DBCP-309?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13898311#comment-13898311
 ] 

Mark Thomas commented on DBCP-309:
----------------------------------

Caveat: I am no JNDI expert. The little I do know is gleaned from reverse 
engineering Tomcat's JNDI implementation.

I think the example is wrong because it binds a reference. A reference will 
always result in a new object being created when it is looked up. If the 
example binds a BasicDataSource instance, it appears to behave as 
desired/expected.

As most users expect multiple JNDI look ups using the same name to return the 
same object, Tomcat deliberately breaks the rules. By default, when Tomcat 
finds a reference, Tomcat resolves that reference to an object and then 
replaces the reference in JNDI with the object. In later Tomcat versions, this 
is configurable with the singleton property.

It isn't clear to me how implementing Referenceable will help. If anything, 
that will make it worse as it would then be impossible to bind an instance of a 
BasicDataSource to JNDI as the Reference would be bound.

I intend to tweak the examples to bind instances rather than References. This 
appears to be consistent with Ondrej Tisler's approach above.

> First example for FSContext is invalid
> --------------------------------------
>
>                 Key: DBCP-309
>                 URL: https://issues.apache.org/jira/browse/DBCP-309
>             Project: Commons Dbcp
>          Issue Type: Bug
>    Affects Versions: 1.2.2
>            Reporter: Ondrej Tisler
>            Priority: Trivial
>             Fix For: 1.3.1, 1.4.1
>
>
> First example on page http://commons.apache.org/dbcp/guide/jndi-howto.html is 
> invalid, with this code every call of  
>   InitialContext ic2 = new InitialContext();
>   DataSource ds = (DataSource) ic2.lookup("jdbc/basic");
>   Connection conn = ds.getConnection();
>   conn.close();
> ends with new datasource with unclosed connection in it becase new 
> Reference("javax.sql.DataSource",  
> "org.apache.commons.dbcp.BasicDataSourceFactory", null); reference creates 
> new DataSource instead using created one while calling  
> ic2.lookup("jdbc/basic").
> At the end it ends with many opened connections to DB until JVM is ended.
> Second example I didn't test, i use direct aproach with manualy creating 
> SharedPoolDataSource and registring it in FSContext JNDI itself.



--
This message was sent by Atlassian JIRA
(v6.1.5#6160)

Reply via email to