Declaring the datasource as a JNDI resource
You will first of all need to create a DAR file using the deployment descriptor editor:
File->new and select JNDI definitions archive,
Right-click the "untitled" node, and select new JDBC datasource,
in the popup enter the name for your datasource (serial://datasources/!MyDataSource),
Highlight the created datasource under "untitled", in the datasource class name field enter:
for SQLServer, com.inet.tds.P!DataSource
for Oracle, oracle.pool.OracleConnectionPoolDataSource
NB: basically, you need a ConnectionPoolDataSource, whatever the database driver you are using (I'm using inet.jar for SQLServer)
Select the driver properties tab, and add/set the following properties:
serverName,
portNumber,
databaseName,
user,
password.
Save your DAR file.
Alternatively, you can simply deploy a jndi-definitions.xml file (rather than a DAR file):
{{{<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE jndi-definitions PUBLIC "-//Borland Corporation//DTD JndiDefinitions//EN" "http://www.borland.com/devsupport/appserver/dtds/jndi-definitions.dtd">\\ <jndi-definitions>
<visitransact-datasource>
<jndi-name>serial://datasources/MyDataSource</jndi-name> <driver-datasource-jndiname>serial://datasources/MyDataSourceDriver</driver-datasource-jndiname> <property>
<prop-name>connectionType</prop-name> <prop-type>Enumerated</prop-type> <prop-value>Direct</prop-value>
</property> <property>
<prop-name>maxPoolSize</prop-name> <prop-type>Integer</prop-type> <prop-value>0</prop-value>
</property>
</visitransact-datasource> <driver-datasource>
<jndi-name>serial://datasources/MyDataSourceDriver</jndi-name> <datasource-class-name>com.inet.tds.PDataSource</datasource-class-name> <log-writer>true</log-writer> <property>
<prop-name>databaseName</prop-name> <prop-type>String</prop-type> <prop-value>MYDB</prop-value>
</property> <property>
<prop-name>serverName</prop-name> <prop-type>String</prop-type> <prop-value>MYSERVER</prop-value>
</property> <property>
<prop-name>user</prop-name> <prop-type>String</prop-type> <prop-value>MYUSER</prop-value>
</property> <property>
<prop-name>password</prop-name> <prop-type>String</prop-type> <prop-value>MYPASSWORD</prop-value>
</property> <property>
<prop-name>portNumber</prop-name> <prop-type>Integer</prop-type> <prop-value>MYPORTNUMBER</prop-value>
</property>
</driver-datasource>
</jndi-definitions>}}}
Declaring the JNDI resource within the web application
Now for your web application, you need to specify how to map the JNDI datasource in your web app:
in web.xml, you will need to define the resource reference for your datasource (at the end of the provided sample)
{{{<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"> <web-app>
<servlet>
<servlet-name>Cocoon2</servlet-name> <servlet-class>org.apache.cocoon.servlet.CocoonServlet</servlet-class> <init-param>
<param-name>configurations</param-name> <param-value>/WEB-INF/cocoon.xconf</param-value>
</init-param> <init-param>
<param-name>init-classloader</param-name> <param-value>false</param-value>
</init-param> <init-param>
<param-name>logkit-config</param-name> <param-value>/WEB-INF/logkit.xconf</param-value>
</init-param> <init-param>
<param-name>servlet-logger</param-name> <param-value>access</param-value>
</init-param> <init-param>
<param-name>cocoon-logger</param-name> <param-value>core</param-value>
</init-param> <init-param>
<param-name>log-level</param-name> <param-value>DEBUG</param-value>
</init-param> <init-param>
<param-name>allow-reload</param-name> <param-value>yes</param-value>
</init-param> <init-param>
<param-name>load-class</param-name> <param-value>
com.inet.pool.PoolDriver oracle.jdbc.driver.OracleDriver
</param-value>
</init-param> <init-param>
<param-name>request-factory</param-name> <param-value>org.apache.cocoon.components.request.MultipartRequestFactoryImpl</param-value>
</init-param> <init-param>
<param-name>manage-exceptions</param-name> <param-value>true</param-value>
</init-param> <load-on-startup>-1</load-on-startup>
</servlet> <servlet-mapping>
<servlet-name>Cocoon2</servlet-name> <url-pattern>*.html</url-pattern>
</servlet-mapping> <servlet-mapping>
<servlet-name>Cocoon2</servlet-name> <url-pattern>*.pdf</url-pattern>
</servlet-mapping> <error-page>
<exception-type>ServerException</exception-type> <location>/Error.jsp</location>
</error-page> <taglib>
<taglib-uri>/TagLibrary.tld</taglib-uri> <taglib-location>/TagLibrary.tld</taglib-location>
</taglib> <resource-ref>
<description>datasource</description> <res-ref-name>jdbc/MyDataSource</res-ref-name> <res-type>javax.sql.DataSource</res-type> <res-auth>Container</res-auth>
</resource-ref>
</web-app>}}}
In addition, you also need to include a web-borland.xml file which effectively provides the mapping between
the resource reference and the JNDI datasource:
{{{<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE web-app PUBLIC "-//Borland Software Corporation//DTD Web Application 2.3//EN"
<web-app>
<context-root>MYWEBAPP</context-root> <resource-ref>
<res-ref-name>jdbc/MyDataSource</res-ref-name> <jndi-name>serial://datasources/MyDataSource</jndi-name>
</resource-ref>
</web-app>}}}
And in cocoon.xconf, you simply declare your J2EE datasource:
{{{ ...
<datasources>
<j2ee name="MyDS">
<dbname>MyDataSource</dbname>
</j2ee>
</datasources>
- ..}}}
All you need to do is to deploy your DAR file (or jndi-definitions.xml) and web application and you should be
able to use the datasource from you cocoon servlet.