You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@tomcat.apache.org by Jason Mowat <JM...@sbgh.mb.ca> on 2003/08/15 18:13:49 UTC
JNDI References To Tomcat 4.1
Greetings,
I am trying to create a standalone application that references a DBCP on Tomcat. I'm not sure if I can do this; I've seem some articles that seem to suggest that it can be done, but again, I'm not sure. I've read http://www.mail-archive.com/commons-dev@jakarta.apache.org/msg08353.html.
I have set up in tomcat/conf/server.xml the following context info:
<DefaultContext>
<Resource name="jdbc/test_db" auth="Container" type="javax.sql.DataSource"/>
<ResourceParams name="jdbc/test_db">
<parameter>
<name>factory</name>
<value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
</parameter>
<parameter>
<name>driverClassName</name>
<value>oracle.jdbc.driver.OracleDriver</value>
</parameter>
<parameter>
<name>url</name>
<value>jdbc:oracle:thin:@internal.sbgh.mb.ca:1521:test</value>
</parameter>
<parameter>
<name>username</name>
<value>test</value>
</parameter>
<parameter>
<name>password</name>
<value>test</value>
</parameter>
<parameter>
<name>maxActive</name>
<value>20</value>
</parameter>
<parameter>
<name>maxIdle</name>
<value>30000</value>
</parameter>
<parameter>
<name>maxWait</name>
<value>100</value>
</parameter>
</ResourceParams>
</DefaultContext>
Note that I have not created any references in a web.xml, since I will not be running an application, per se, from Tomcat. PERHAPS THIS IS WHERE MY PROBLEM IS?
The client code I am using is not a servlet or a JSP; it's a simple piece of code to see if I can communicate with the database pool on Tomcat as configured above.
Hashtable env = new Hashtable();
env.put(
Context.INITIAL_CONTEXT_FACTORY,
"org.apache.commons.dbcp.BasicDataSourceFactory"
);
// *** THIS IS ANOTHER AREA WHERE I MAY BE WRONG! ***
env.put(
Context.PROVIDER_URL,
"http://localhost:8080"
);
try {
InitialContext initCtx = new InitialContext(env);
DataSource ds = (DataSource)initCtx.lookup("java:comp/env/jdbc/test_db");
Connection conn = ds.getConnection();
Statement stmt = conn.createStatement();
ResultSet rset = stmt.executeQuery("SELECT * FROM tbl_test");
conn.close();
initCtx.close();
}
catch(NamingException e) {
fail("Naming exception thrown");
}
catch (SQLException e) {
fail("SQL Exception thrown");
}
I start Tomcat, assuming that the pool is set up. Then I use the client to try to get an initial context from it. This throws a naming exception, because it doesn't know how to get an initial context for org.apache.commons.dbcp.BasicDataSourceFactory at http://localhost:8080.
My first question: can I do this?
My second question: If I can't do it like this, do I need to set up a JNDI provider (like on JBoss) and set up the pooling there?
My final question: It "feels" as if my problem is simply setting up the PROVIDER_URL properly so that it can get the context from Tomcat. I've done LDAP PROVIDER_URLs before, but never one that gets a data source factory from a servlet container. Can I use http over port 8080 to get the data source factory? Is there a different mechanism for getting the factory from code that is not residing within the servlet container? Can this even be done on Tomcat?
I appreciate any help that anyone can provide.
Cheers,
Jason