【问题标题】:Specify Oracle DB/Schema name in tomcat context.xml在 tomcat context.xml 中指定 Oracle DB/Schema 名称
【发布时间】:2014-04-24 19:56:51
【问题描述】:

我正在尝试在 Tomcat 中添加 JDBC 会话持久性,如下所述:Tomcat Link 我在 my_schema 数据库/模式中的 Oracle 中创建了一个会话表,并试图将其映射到 Tomcat context.xml 中。我的映射如下:

   <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>

但上面的配置在 tomcat 启动时导致 NullPointerException。我知道 url、用户名和密码是正确的,因为如果我编写一个简单的 Java 程序并连接/查询 my_schema.tomcat_sessions 表,它就可以正常工作。但我不确定如何在上述配置中指定特定的数据库/模式名称。我得到的例外如下:

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

我想知道问题是否是因为我没有在任何地方指定数据库/模式名称? 我尝试将 driverClassName 更改为 oracle.jdbc.OracleDriver,但没有运气。 我确保 $TOMCAT_HOME/lib 有 ojdbc6.jar 文件。 还有其他想法/想法吗? 谢谢!

【问题讨论】:

  • ----&gt; HOST=my-host-blah.com 是什么,您需要更改吗?
  • 正在指定“模式”:username="test_user" 和“数据库”:SERVICE_NAME=someservice。 NPE 看起来更像是缺少 jar 文件。您使用的是哪个 JDBC driver 版本(注意:filename 中的数字不是驱动程序版本,它是驱动程序的目标 Java 版本)
  • @a_horse_with_no_name 我正在使用 ojdbc6-11.2.0.3.0.jar 这就是应用程序使用的。我将 jar 从 webapps/lib/ 移动到了 tomcat/lib/ 目录。
  • NPE 是因为您没有提供 driverName 属性,这很重要,因为 dataSourceName 的 JNDI 查找必须失败,所以它回退到尝试 driverName. 有在 Tomcat 日志中查找 JNDI 故障,它可能会告诉您一些信息。 OTOH 我遇到了完全相同的问题,我的 JNDI 失败(在 localhost..log 中是 javax.naming.NameNotFoundException: Name [comp/env] is not bound in this Context. Unable to find [comp].

标签: java xml oracle tomcat jdbc


【解决方案1】:

您可以尝试在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>

确保替换 connectionURL 属性中的值,并将 Oracle JDBC 驱动程序 (ojdbc6.jar) 添加到您的 tomcat 的 lib 目录中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-02
    • 2019-08-27
    • 1970-01-01
    • 2022-09-29
    • 2016-02-08
    • 2013-05-07
    • 2015-09-09
    • 2017-10-07
    相关资源
    最近更新 更多