Hi, I am getting a little confused about the topic weather Tomcat 4.x ist having a Connection Pooling implementet or not. I was following the discussions the last few days and the answers have been a little contradicting. Therfore my question loud and clear ; ) Is there a Connection Pooling using JNDI with Tomcat 4.x or not? Below some postings concerning this topic from the last few days...
Thanks Rainer <past postings> Tomcat: As far as I'm concerned, JNDI support is a "now and forever more" feature of Tomcat 4 and later. It's the standard access mechanism for J2EE app servers as well. Recommendation: If you can, you should use JNDI based access to data sources. This is both portable across containers, and portable across Struts versus non-Struts applications. In addition, it can be used from directly from within a JavaBean implementing your business logic, without requiring a reference to ActionServlet or the servlet context (or the web layer at all). > > In the javabean. > > ---------------- > > import javax.naming.NamingException; > > import javax.naming.Context; > > import javax.naming.InitialContext; > > import javax.naming.NamingEnumeration; > > import javax.naming.directory.InitialDirContext; > > > > class mybean() { > > java.sql.Connection conn > > .... > > get getPooledDatabaseConnection() { > > Context ctx = new InitialContext(); > > Context envCtx = (Context) ctx.lookup("java:/comp/env/"); > > DataSource ds = (DataSource) envCtx.lookup("jdbc/dbpool"); > > conn = ds.getConnection(); > > } > > ... > > } Yep ... that is exactly the pattern you can use. Nice, isn't it? > Soefara. > Craig ################################################################################### Unfortunately by using the Tomcat (4.0.x) default JNDI datasource factory (aka Tyrex) you not only do not have a pool manager interface but you don't have a pool. The Tyrex factory only sets up one physical connection and one pool instance AFAIK. In order to create a pool you either can use the jakarta-commons DBCP factory or write your own implementation. Craig McClanahan recently posted this DBCP implementation which works with TC 4.0.x. **************** Craig's post > It should be possible to use the DBCP based pool even with Tomcat 4.0.x by > overriding the default JNDI factory for javax.sql.DataSource objects (I > haven't tested this, but in theory it should all work). > This requires the following steps: > > * Download recent nightly builds of the Collections, Pool, and DBCP > packages from Jakarta Commons > (http://jakarta.apache.org/builds/jakarta-commons/nightly/) and put > the JAR files into $CATALINA_HOME/common/lib along with your JDBC > driver. > > * Configure the "factory" parameter in the <ResourceParams> element > to set the JNDI ObjectFactory class for this resource: > > <ResourceParams name="jdbc/EmployeeDB"> > <parameter> > <name>factory</name> > <value>org.apache.commons.dbcp.BasicDataSourceFactory</value> > </parameter> > ... other configuration parameters ... > </ResourceParams> > > * Configure the other parameter values of the <ResourceParams> element > from the list of supported properties below: > - driverClassName - Fully qualified Java class name of the JDBC driver > - maxActive - Maximum number of active connections at one time > - maxIdle - Maximum number of idle connections at one time > (if more are returned to the pool, they will be > closed to release database resources) > - maxWait - Number of milliseconds the pool will wait when there > are no available connections before causing > getConnection() to throw an exception > - password - Database password > - url - Connection URL (also accepts "driverName" for > backwards compatibility) > - user - Database username > - validationQuery - Optional SQL SELECT statement used to validate a > connection before returning it to the application > (must return at least one row). This is helpful > in catching stale connections because of timeouts > or recycling of the database without stopping > Tomcat. > > Alternatively, you can use any other connection pool you like, if you > create your own javax.naming.spi.ObjectFactory implementation class (the > JNDI object factory interface) and registering its name with the "factory" > parameter. Documentation is in the JNDI Specification and the > corresponding Service Provider Interface document, at: > > http://java.sun.com/products/jndi/docs.html As I said this implementation works fine for TC 4.0.x. and as Craig mentions the DBCP BasicDataSourceFactory class is a good model for writing your own implementation. HTH Steven ############################################################################## Yes, I have been able to get pooling data sources to work with mySql using the mm drivers. Here are excerpts from my setup: Server.xml <Resource name="jdbc/ds" auth="Container" type="javax.sql.DataSource"/> <ResourceParams name="jdbc/ds"> <parameter><name>driverClassName</name><value>org.gjt.mm.mysql.Driver</value ></parameter> <parameter><name>driverName</name><value>jdbc:mysql://localhost/test</value> </parameter> <parameter><name>user</name><value>youruser</value></parameter> <parameter><name>password</name><value>yourpasswd</value></parameter> </ResourceParams> application's web.xml <resource-ref> <description> Resource reference to a factory for javax.sql.Datasource instances that may be used for talking to a particular database that is configured in the server.xml file. </description> <res-ref-name>jdbc/ds</res-ref-name> <res-type>javax.sql.DataSource</res-type> <res-auth>Container</res-auth> </resource-ref> Lastly, in my code. This will test for a pooled datasource. Context initCtx = new InitialContext(); Context envCtx = (Context) initCtx.lookup("java:comp/env"); DataSource ds = (DataSource) envCtx.lookup("jdbc/2rc"); Connection conn; if ( ds instanceof ConnectionPoolDataSource ) { ConnectionPoolDataSource poolDataSrc = (ConnectionPoolDataSource)ds; PooledConnection pc = poolDataSrc.getPooledConnection(); conn = pc.getConnection(); out.println("Pooled Connection<br>"); } else { conn = ds.getConnection(); } Thanks, Bill Stone </past postings>