1
votes

I'm trying to add JDBC Session Persistence in Tomcat as explained here: Tomcat Link I have created a sessions table in Oracle within my_schema database/schema and is trying to map it in the Tomcat context.xml. My mapping is as below:

   <Resource name="jdbc/sessions" auth="Container" type="javax.sql.DataSource"
    username="test_user"
    password="test_user"
    driverClassName="oracle.jdbc.driver.OracleDriver"
    url="jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=my-host-blah.com)(PORT=1234))(ADDRESS=(PROTOCOL=TCP)(HOST=my-host-blah.com)(PORT=1244)))(CONNECT_DATA=(SERVICE_NAME=someservice)))"
    maxActive="20"
    maxIdle="10"
    validationQuery="select 1" />

<Manager className="org.apache.catalina.session.PersistentManager"
    distributable="true"  processExpiresFrequency="3" maxIdleBackup="1" >
    <Store className="org.apache.catalina.session.JDBCStore"
        dataSourceName="jdbc/sessions"
        sessionAppCol="app_name" sessionDataCol="session_data" sessionIdCol="session_id"
        sessionLastAccessedCol="last_access" sessionMaxInactiveCol="max_inactive"
        sessionTable="tomcat_sessions" sessionValidCol="valid_session" />
</Manager>

But the above config is causing NullPointerException on tomcat start. I know that the url, username and password are correct because if I write a simple Java program and connect/query the my_schema.tomcat_sessions table, it works fine. But I'm not sure how to specify the specific DB/schema name in the above configuration. The exception I'm getting is below:

SEVERE: Error manager.start() java.lang.NullPointerException at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Class.java:190) at org.apache.catalina.session.JDBCStore.open(JDBCStore.java:861) at org.apache.catalina.session.JDBCStore.getConnection(JDBCStore.java:833) at org.apache.catalina.session.JDBCStore.start(JDBCStore.java:968) at org.apache.catalina.session.PersistentManagerBase.start(PersistentManagerBase.java:995) at org.apache.catalina.core.StandardContext.start(StandardContext.java:4713) at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:799) at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:779) at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:601) at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:943) at org.apache.catalina.startup.HostConfig.deployWARs(HostConfig.java:778) at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:504) at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1315) at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:324) at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:142) at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1061) at org.apache.catalina.core.StandardHost.start(StandardHost.java:840) at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1053) at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:463) at org.apache.catalina.core.StandardService.start(StandardService.java:525) at org.apache.catalina.core.StandardServer.start(StandardServer.java:754) at org.apache.catalina.startup.Catalina.start(Catalina.java:595) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:606) at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:289) at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:414)

I wonder if the problem is because I'm not specifying the DB/schema name anywhere? I tried changing driverClassName to oracle.jdbc.OracleDriver, but no luck. I made sure that $TOMCAT_HOME/lib has ojdbc6.jar file. Any other thoughts/ideas? Thanks!

1
what is that ----> HOST=my-host-blah.com is that something you need to change ? - Mohammad Adil
You are specifying the "schema": username="test_user" and the "database": SERVICE_NAME=someservice. The NPE looks more like you are missing a jar file. Which JDBC driver version are you using (note: the number in the filename is not the driver version, it's the target Java version of the driver) - a_horse_with_no_name
@a_horse_with_no_name I'm using ojdbc6-11.2.0.3.0.jar and that was what the application uses. I moved the jar from webapps/lib/ to tomcat/lib/ directory. - kriver
The NPE is because you didn't supply a driverName property, which only matters because the JNDI lookup of the dataSourceName must have failed so it fell back to trying a driverName. Have a look in the Tomcat logs for the JNDI failure, it may tell you something. OTOH I am having exactly the same problem and my JNDI failure (in localhost.<date>.log is javax.naming.NameNotFoundException: Name [comp/env] is not bound in this Context. Unable to find [comp]. - user207421

1 Answers

0
votes

You can try to use the following in your context.xml:

<Manager className="org.apache.catalina.session.PersistentManager"
         maxIdleBackup="10">
  <Store className="org.apache.catalina.session.JDBCStore"
         connectionURL="jdbc:oracle:thin:USERNAME/PASSWORD@//HOSTNAME/SID"
         driverName="oracle.jdbc.driver.OracleDriver"
         sessionAppCol="app_name"
         sessionDataCol="session_data"
         sessionIdCol="session_id"
         sessionLastAccessedCol="last_access"
         sessionMaxInactiveCol="max_inactive"
         sessionTable="tomcat_sessions"
         sessionValidCol="valid_session" />
</Manager>

Make sure to replace the values in the connectionURL attribute, and to add the Oracle JDBC driver (ojdbc6.jar) to your tomcat's lib directory.