Scott, I feel your pain -- I just finished sorting out that whole thing myself. One thing I'd definitely recommend doing is installing the admin tool for tomcat 5 and using it to change something trivial in your server.xml file. When it gets done making the change it strips out all the comments as a side effect and makes the file *much* cleaner and, in my opinion, more readable. As for your question: if the resource is to be used for multiple applications, you could put it in the server.xml... if not (and I'm going to presume that's the case for you -- let me know if not) then you're much better off using your application-specific WEB-INF\web.xml and META-INF\context.xml files like so:
<your application docbase>\META-INF\context.xml would look something like: <Context path="/Foo" docBase="C:/Foo" debug="1" reloadable="true"> <Resource auth="Container" name="jdbc/aNameForYourDBresource" type="javax.sql.DataSource" password="Foo" driverClassName="oracle.jdbc.driver.OracleDriver" maxIdle="3" maxWait="5000" username="Foo" url="jdbc:oracle:thin:@Foo:1521:Foo" maxActive="15"/> <WatchedResource>WEB-INF/web.xml</WatchedResource> <WatchedResource>META-INF/context.xml</WatchedResource> </Context> and your <your application docbase>WEB-INF\web.xml would then reference the resource defined in the context above (the res-ref-name should match the resource name).... <?xml version="1.0" encoding="ISO-8859-1"?> <!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> <display-name>Your app's name</display-name> <description> Slices, dices and makes fresh canned spam! </description> <resource-ref> <description>Description of Datasource</description> <res-ref-name>jdbc/aNameForYourDBresource</res-ref-name> <res-type>javax.sql.DataSource</res-type> <res-auth>Container</res-auth> </resource-ref> </web-app> It's helpful to think of the individual application context.xml files being 'included' as <context> entries in the server.xml file (almost like an @include, except implicit). Hope that helps! Let me know if I can clarify anything. Cheers, Patrick Thomas (PS - remember to install the jakarta commons and pooling jars mentioned in the dbcp documentation.) On Apr 8, 2005 11:13 AM, David Smith <[EMAIL PROTECTED]> wrote: > Hi. > > Take a look at this for where to put <Context> elements: > http://jakarta.apache.org/tomcat/tomcat-5.5-doc/config/context.html > > This is new with Tomcat 5.0 and is continued in Tomcat 5.5 > > --David > > Scott Purcell wrote: > > >Hello, > > > >I am following the information here to add DBCP to my application. > >http://jakarta.apache.org/tomcat/tomcat-5.5-doc/jndi-datasource-examples-howto.html > > > >I am reading to add the <Context path="/DBTest ... from the above docs." The > >instructions say to ". > > > >Configure the JNDI DataSource in Tomcat by adding a declaration for your > >resource to $CATALINA_HOME/conf/server.xml. > > > >Add this in between the </Context> tag of the examples context and the > ></Host> tag closing the localhost definition. > > > > > > > >So cool, I opened up the server.xml, but do not see any existing context or > >host tags in it. Here is my server.xml file. Does anyone know where I put > >the Context for the DBCP stuff? Thanks, > > > >'<!-- Example Server Configuration File --> > ><!-- Note that component elements are nested corresponding to their > > parent-child relationships with each other --> > > > ><!-- A "Server" is a singleton element that represents the entire JVM, > > which may contain one or more "Service" instances. The Server > > listens for a shutdown command on the indicated port. > > > > Note: A "Server" is not itself a "Container", so you may not > > define subcomponents such as "Valves" or "Loggers" at this level. > > --> > > > ><Server port="8005" shutdown="SHUTDOWN"> > > > > <!-- Comment these entries out to disable JMX MBeans support used for the > > administration web application --> > > <Listener className="org.apache.catalina.mbeans.ServerLifecycleListener" /> > > <Listener > > className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" /> > > <Listener > > className="org.apache.catalina.storeconfig.StoreConfigLifecycleListener"/> > > > > <!-- Global JNDI resources --> > > <GlobalNamingResources> > > > > <!-- Test entry for demonstration purposes --> > > <Environment name="simpleValue" type="java.lang.Integer" value="30"/> > > > > <!-- Editable user database that can also be used by > > UserDatabaseRealm to authenticate users --> > > <Resource name="UserDatabase" auth="Container" > > type="org.apache.catalina.UserDatabase" > > description="User database that can be updated and saved" > > factory="org.apache.catalina.users.MemoryUserDatabaseFactory" > > pathname="conf/tomcat-users.xml" /> > > > > </GlobalNamingResources> > > > > <!-- A "Service" is a collection of one or more "Connectors" that share > > a single "Container" (and therefore the web applications visible > > within that Container). Normally, that Container is an "Engine", > > but this is not required. > > > > Note: A "Service" is not itself a "Container", so you may not > > define subcomponents such as "Valves" or "Loggers" at this level. > > --> > > > > <!-- Define the Tomcat Stand-Alone Service --> > > <Service name="Catalina"> > > > > <!-- A "Connector" represents an endpoint by which requests are received > > and responses are returned. Each Connector passes requests on to > > the > > associated "Container" (normally an Engine) for processing. > > > > By default, a non-SSL HTTP/1.1 Connector is established on port > > 8080. > > You can also enable an SSL HTTP/1.1 Connector on port 8443 by > > following the instructions below and uncommenting the second > > Connector > > entry. SSL support requires the following steps (see the SSL Config > > HOWTO in the Tomcat 5 documentation bundle for more detailed > > instructions): > > * If your JDK version 1.3 or prior, download and install JSSE 1.0.2 > > or > > later, and put the JAR files into "$JAVA_HOME/jre/lib/ext". > > * Execute: > > %JAVA_HOME%\bin\keytool -genkey -alias tomcat -keyalg RSA > > (Windows) > > $JAVA_HOME/bin/keytool -genkey -alias tomcat -keyalg RSA (Unix) > > with a password value of "changeit" for both the certificate and > > the keystore itself. > > > > By default, DNS lookups are enabled when a web application calls > > request.getRemoteHost(). This can have an adverse impact on > > performance, so you can disable it by setting the > > "enableLookups" attribute to "false". When DNS lookups are > > disabled, > > request.getRemoteHost() will return the String version of the > > IP address of the remote client. > > --> > > > > <!-- Define a non-SSL HTTP/1.1 Connector on port 8080 --> > > <Connector > >port="80" maxThreads="150" minSpareThreads="25" > >maxSpareThreads="75" > > enableLookups="false" redirectPort="8443" acceptCount="100" > > connectionTimeout="20000" disableUploadTimeout="true" /> > > <!-- Note : To disable connection timeouts, set connectionTimeout value > > to 0 --> > > > > <!-- Note : To use gzip compression you could set the following properties : > > > > compression="on" > > compressionMinSize="2048" > > noCompressionUserAgents="gozilla, traviata" > > compressableMimeType="text/html,text/xml" > > --> > > > > <!-- Define a SSL HTTP/1.1 Connector on port 8443 --> > > <!-- > > <Connector port="8443" > > maxThreads="150" minSpareThreads="25" maxSpareThreads="75" > > enableLookups="false" disableUploadTimeout="true" > > acceptCount="100" scheme="https" secure="true" > > clientAuth="false" sslProtocol="TLS" /> > > --> > > > > <!-- Define an AJP 1.3 Connector on port 8009 --> > > <Connector port="8009" > > enableLookups="false" redirectPort="8443" protocol="AJP/1.3" > > /> > > > > <!-- Define a Proxied HTTP/1.1 Connector on port 8082 --> > > <!-- See proxy documentation for more information about using this. --> > > <!-- > > <Connector port="8082" > > maxThreads="150" minSpareThreads="25" maxSpareThreads="75" > > enableLookups="false" acceptCount="100" > > connectionTimeout="20000" > > proxyPort="80" disableUploadTimeout="true" /> > > --> > > > > <!-- An Engine represents the entry point (within Catalina) that > > processes > > every request. The Engine implementation for Tomcat stand alone > > analyzes the HTTP headers included with the request, and passes them > > on to the appropriate Host (virtual host). --> > > > > <!-- You should set jvmRoute to support load-balancing via AJP ie : > > <Engine name="Standalone" defaultHost="localhost" jvmRoute="jvm1"> > > --> > > > > <!-- Define the top level container in our container hierarchy --> > > <Engine name="Catalina" defaultHost="localhost"> > > > > <!-- The request dumper valve dumps useful debugging information about > > the request headers and cookies that were received, and the > > response > > headers and cookies that were sent, for all requests received by > > this instance of Tomcat. If you care only about requests to a > > particular virtual host, or a particular application, nest this > > element inside the corresponding <Host> or <Context> entry > > instead. > > > > For a similar mechanism that is portable to all Servlet 2.4 > > containers, check out the "RequestDumperFilter" Filter in the > > example application (the source for this filter may be found in > > "$CATALINA_HOME/webapps/examples/WEB-INF/classes/filters"). > > > > Request dumping is disabled by default. Uncomment the following > > element to enable it. --> > > <!-- > > <Valve className="org.apache.catalina.valves.RequestDumperValve"/> > > --> > > > > <!-- Because this Realm is here, an instance will be shared globally > > --> > > > > <!-- This Realm uses the UserDatabase configured in the global JNDI > > resources under the key "UserDatabase". Any edits > > that are performed against this UserDatabase are immediately > > available for use by the Realm. --> > > <Realm className="org.apache.catalina.realm.UserDatabaseRealm" > > resourceName="UserDatabase"/> > > > > <!-- Comment out the old realm but leave here for now in case we > > need to go back quickly --> > > <!-- > > <Realm className="org.apache.catalina.realm.MemoryRealm" /> > > --> > > > > <!-- Replace the above Realm with one of the following to get a Realm > > stored in a database and accessed via JDBC --> > > > > <!-- > > <Realm className="org.apache.catalina.realm.JDBCRealm" > > driverName="org.gjt.mm.mysql.Driver" > > connectionURL="jdbc:mysql://localhost/authority" > > connectionName="test" connectionPassword="test" > > userTable="users" userNameCol="user_name" > > userCredCol="user_pass" > > userRoleTable="user_roles" roleNameCol="role_name" /> > > --> > > > > <!-- > > <Realm className="org.apache.catalina.realm.JDBCRealm" > > driverName="oracle.jdbc.driver.OracleDriver" > > connectionURL="jdbc:oracle:thin:@ntserver:1521:ORCL" > > connectionName="scott" connectionPassword="tiger" > > userTable="users" userNameCol="user_name" > > userCredCol="user_pass" > > userRoleTable="user_roles" roleNameCol="role_name" /> > > --> > > > > <!-- > > <Realm className="org.apache.catalina.realm.JDBCRealm" > > driverName="sun.jdbc.odbc.JdbcOdbcDriver" > > connectionURL="jdbc:odbc:CATALINA" > > userTable="users" userNameCol="user_name" > > userCredCol="user_pass" > > userRoleTable="user_roles" roleNameCol="role_name" /> > > --> > > > > <!-- Define the default virtual host > > Note: XML Schema validation will not work with Xerces 2.2. > > --> > > <Host name="localhost" appBase="webapps" > > unpackWARs="true" autoDeploy="true" > > xmlValidation="false" xmlNamespaceAware="false"> > > > > <!-- Defines a cluster for this node, > > By defining this element, means that every manager will be > > changed. > > So when running a cluster, only make sure that you have webapps > > in there > > that need to be clustered and remove the other ones. > > A cluster has the following parameters: > > > > className = the fully qualified name of the cluster class > > > > name = a descriptive name for your cluster, can be anything > > > > mcastAddr = the multicast address, has to be the same for all > > the nodes > > > > mcastPort = the multicast port, has to be the same for all the > > nodes > > > > mcastBindAddr = bind the multicast socket to a specific address > > > > mcastTTL = the multicast TTL if you want to limit your broadcast > > > > mcastSoTimeout = the multicast readtimeout > > > > mcastFrequency = the number of milliseconds in between sending > > a "I'm alive" heartbeat > > > > mcastDropTime = the number a milliseconds before a node is > > considered "dead" if no heartbeat is received > > > > tcpThreadCount = the number of threads to handle incoming > > replication requests, optimal would be the same amount of threads as nodes > > > > tcpListenAddress = the listen address (bind address) for TCP > > cluster request on this host, > > in case of multiple ethernet cards. > > auto means that address becomes > > InetAddress.getLocalHost().getHostAddress() > > > > tcpListenPort = the tcp listen port > > > > tcpSelectorTimeout = the timeout (ms) for the Selector.select() > > method in case the OS > > has a wakup bug in java.nio. Set to 0 for > > no timeout > > > > printToScreen = true means that managers will also print to > > std.out > > > > expireSessionsOnShutdown = true means that > > > > useDirtyFlag = true means that we only replicate a session > > after setAttribute,removeAttribute has been called. > > false means to replicate the session after each > > request. > > false means that replication would work for the > > following piece of code: (only for SimpleTcpReplicationManager) > > <% > > HashMap map = > > (HashMap)session.getAttribute("map"); > > map.put("key","value"); > > %> > > replicationMode = can be either 'pooled', 'synchronous' or > > 'asynchronous'. > > * Pooled means that the replication happens > > using several sockets in a synchronous way. Ie, the data gets replicated, > > then the request return. This is the same as the 'synchronous' setting > > except it uses a pool of sockets, hence it is multithreaded. This is the > > fastest and safest configuration. To use this, also increase the nr of tcp > > threads that you have dealing with replication. > > * Synchronous means that the thread that > > executes the request, is also the > > thread the replicates the data to the other > > nodes, and will not return until all > > nodes have received the information. > > * Asynchronous means that there is a specific > > 'sender' thread for each cluster node, > > so the request thread will queue the > > replication request into a "smart" queue, > > and then return to the client. > > The "smart" queue is a queue where when a > > session is added to the queue, and the same session > > already exists in the queue from a previous > > request, that session will be replaced > > in the queue instead of replicating two > > requests. This almost never happens, unless there is a > > large network delay. > > --> > > <!-- > > When configuring for clustering, you also add in a valve to > > catch all the requests > > coming in, at the end of the request, the session may or may not > > be replicated. > > A session is replicated if and only if all the conditions are > > met: > > 1. useDirtyFlag is true or setAttribute or removeAttribute has > > been called AND > > 2. a session exists (has been created) > > 3. the request is not trapped by the "filter" attribute > > > > The filter attribute is to filter out requests that could not > > modify the session, > > hence we don't replicate the session after the end of this > > request. > > The filter is negative, ie, anything you put in the filter, you > > mean to filter out, > > ie, no replication will be done on requests that match one of > > the filters. > > The filter attribute is delimited by ;, so you can't escape out > > ; even if you wanted to. > > > > filter=".*\.gif;.*\.js;" means that we will not replicate the > > session after requests with the URI > > ending with .gif and .js are intercepted. > > > > The deployer element can be used to deploy apps cluster wide. > > Currently the deployment only deploys/undeploys to working > > members in the cluster > > so no WARs are copied upons startup of a broken node. > > The deployer watches a directory (watchDir) for WAR files when > > watchEnabled="true" > > When a new war file is added the war gets deployed to the local > > instance, > > and then deployed to the other instances in the cluster. > > When a war file is deleted from the watchDir the war is > > undeployed locally > > and cluster wide > > --> > > > > <!-- > > <Cluster className="org.apache.catalina.cluster.tcp.SimpleTcpCluster" > > > > managerClassName="org.apache.catalina.cluster.session.DeltaManager" > > expireSessionsOnShutdown="false" > > useDirtyFlag="true" > > notifyListenersOnReplication="true"> > > > > <Membership > > className="org.apache.catalina.cluster.mcast.McastService" > > mcastAddr="228.0.0.4" > > mcastPort="45564" > > mcastFrequency="500" > > mcastDropTime="3000"/> > > > > <Receiver > > > > className="org.apache.catalina.cluster.tcp.ReplicationListener" > > tcpListenAddress="auto" > > tcpListenPort="4001" > > tcpSelectorTimeout="100" > > tcpThreadCount="6"/> > > > > <Sender > > > > className="org.apache.catalina.cluster.tcp.ReplicationTransmitter" > > replicationMode="pooled" > > ackTimeout="15000"/> > > > > <Valve > > className="org.apache.catalina.cluster.tcp.ReplicationValve" > > > > filter=".*\.gif;.*\.js;.*\.jpg;.*\.htm;.*\.html;.*\.txt;"/> > > > > <Deployer > > className="org.apache.catalina.cluster.deploy.FarmWarDeployer" > > tempDir="/tmp/war-temp/" > > deployDir="/tmp/war-deploy/" > > watchDir="/tmp/war-listen/" > > watchEnabled="false"/> > > </Cluster> > > --> > > > > > > > > <!-- Normally, users must authenticate themselves to each web app > > individually. Uncomment the following entry if you would like > > a user to be authenticated the first time they encounter a > > resource protected by a security constraint, and then have that > > user identity maintained across *all* web applications contained > > in this virtual host. --> > > <!-- > > <Valve className="org.apache.catalina.authenticator.SingleSignOn" /> > > --> > > > > <!-- Access log processes all requests for this virtual host. By > > default, log files are created in the "logs" directory relative > > to > > $CATALINA_HOME. If you wish, you can specify a different > > directory with the "directory" attribute. Specify either a > > relative > > (to $CATALINA_HOME) or absolute path to the desired directory. > > --> > > <!-- > > <Valve className="org.apache.catalina.valves.AccessLogValve" > > directory="logs" prefix="localhost_access_log." > > suffix=".txt" > > pattern="common" resolveHosts="false"/> > > --> > > > > <!-- Access log processes all requests for this virtual host. By > > default, log files are created in the "logs" directory relative > > to > > $CATALINA_HOME. If you wish, you can specify a different > > directory with the "directory" attribute. Specify either a > > relative > > (to $CATALINA_HOME) or absolute path to the desired directory. > > This access log implementation is optimized for maximum > > performance, > > but is hardcoded to support only the "common" and "combined" > > patterns. > > --> > > <!-- > > <Valve > > className="org.apache.catalina.valves.FastCommonAccessLogValve" > > directory="logs" prefix="localhost_access_log." > > suffix=".txt" > > pattern="common" resolveHosts="false"/> > > --> > > > > </Host> > > > > </Engine> > > > > </Service> > > > ></Server> > > > > > > > > > > > > > >Scott K Purcell | Developer | VERTIS | > >555 Washington Ave. 4th Floor | St. Louis, MO 63101 | > >314.588.0720 Ext:1320 | [EMAIL PROTECTED] | http://www.vertisinc.com > ><http://www.vertisinc.com/> > > > >Vertis is the premier provider of targeted advertising, media, and > >marketing services that drive consumers to marketers more effectively. > > > > > > > > > > > > > > --------------------------------------------------------------------- > To unsubscribe, e-mail: [EMAIL PROTECTED] > For additional commands, e-mail: [EMAIL PROTECTED] > > --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]