2012-04-30 55 views
4

我在Windows XP上使用Tomcat 6(我无法在月底前升级到7)。在Tomcat上安装Oracle 11g的JNDI数据源

我一直在试图实现一个JNDI数据库资源到Oracle 11g没有成功。

我的电脑上的许多其他应用程序与相同的数据库凭证连接良好。我使用直接JDBC进行测试JSP并将其放入Tomcat。它连接也很好。

我修改我的conf/server.xml中的这样一段:

<!-- Global JNDI resources 
     Documentation at /docs/jndi-resources-howto.html 
    --> 
    <GlobalNamingResources> 
    <!-- Editable user database that can also be used by 
     UserDatabaseRealm to authenticate users 
    --> 
    <Resource name="jdbc/mydb" 
       auth="Container" 
       type="javax.sql.DataSource" driverClassName="oracle.jdbc.OracleDriver" 
       factory="oracle.jdbc.pool.OracleDataSourceFactory" 
       url="jdbc:oracle:thin:@apollo.abc.acme.com:2222:mydatabase" 
       user="joe" 
       password="blow" 
       maxActive="20" 
       maxIdle="30" 
       maxWait="-1"/> 

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

我的conf/context.xml文件:

<Context> 

    <!-- Default set of monitored resources --> 
    <WatchedResource>WEB-INF/web.xml</WatchedResource> 
    <ResourceLink global="jdbc/mydb" name="jdbc/mydb" type="javax.sql.DataSource"/> 


    <!-- Uncomment this to disable session persistence across Tomcat restarts --> 
    <!-- 
    <Manager pathname="" /> 
    --> 

    <!-- Uncomment this to enable Comet connection tacking (provides events 
     on session expiration as well as webapp lifecycle) --> 
    <!-- 
    <Valve className="org.apache.catalina.valves.CometConnectionManagerValve" /> 
    --> 

</Context> 

我的conf/web.xml文件:

<resource-ref> 
    <res-ref-name>jdbc/mydb</res-ref-name> 
    <res-type>javax.sql.DataSource</res-type> 
    <res-auth>Container</res-auth> 
    </resource-ref> 

这是测试JSP的摘录,它crapping了一个空指针异常正确的地方去得到的JNDI资源:

Connection conn   = null; 
ResultSet result  = null; 
Statement stmt   = null; 
String nsdtestcount  = null; 
InitialContext ctx  = null; 
Context envContext  = null; 
javax.sql.DataSource ds = null; 

try 
{ 

    ctx  = new InitialContext(); 
    envContext = (Context)ctx.lookup("java:/comp/env"); 
    ds   = (DataSource)envContext.lookup("jdbc/mydb"); 
    conn  = ds.getConnection();  

} 
catch (Exception e) 
{ 
    System.out.println(nameJSP + "Failed to connect to the database: " + 
    "\n ctx  = " + ctx   + 
    "\n envContext = " + envContext + 
    "\n ds   = " + ds   + 
    "\n conn  = " + conn   ); 

    e.printStackTrace(); 
} 

从我的日志摘录:

INFO: Server startup in 675 ms 
testJNDI2.jsp: Failed to connect to the database: 
ctx  = [email protected] 
envContext = [email protected] 
ds   = null 
conn  = null 
java.lang.NullPointerException 
     at org.apache.jsp.testJNDI_jsp._jspService(testJNDI_jsp.java:114) 
     at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70) 
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 
     at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:388) 
     at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313) 
     at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260) 
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) 
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
     at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) 
     at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) 
     at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) 
     at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) 
     at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) 
     at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:291) 
     at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:877) 
     at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:594) 
     at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1675) 
     at java.lang.Thread.run(Thread.java:595) 

在栈跟踪线路的代码:

at org.apache.jsp.testJNDI_jsp._jspService(testJNDI_jsp.java:114) 
    ctx  = new InitialContext(); 
    envContext = (Context)ctx.lookup("java:/comp/env"); 
    ds   = (DataSource)envContext.lookup("jdbc/mydb"); 
    conn  = ds.getConnection();  

conn = ds.getConnection();是线114

从我卡塔利娜日志:

May 1, 2012 4:17:48 PM org.apache.tomcat.util.modeler.Registry registerComponent 
SEVERE: Null component Catalina:type=DataSource,class=javax.sql.DataSource,name="jdbc/mydb" 

我CATALINA_HOME/11b的内容:

C:\tomcat\lib>ls -l 

annotations-api.jar 
catalina-ant.jar 
catalina-ha.jar 
catalina-tribes.jar 
catalina.jar 
ecj-3.3.1.jar 
el-api.jar 
jasper-el.jar 
jasper.jar 
jsp-api.jar 
log4j-1.2.16.jar 
ojdbc14.jar 
servlet-api.jar 
tomcat-coyote.jar 
tomcat-dbcp.jar 
tomcat-i18n-es.jar 
tomcat-i18n-fr.jar 
tomcat-i18n-ja.jar 
tomcat-juli-adapters.jar 
tomcat-juli.jar 

C:\tomcat\lib> 

我的JAVA/JDK JRE/11b的内容/ ext:

C:\Program Files\Java\jdk1.5.0_22\jre\lib\ext>ls -l 

activation.jar 
dnsns.jar 
localedata.jar 
log4j-1.2.16.jar 
mail.jar 
nls_charset12.jar 
sunjce_provider.jar 
sunmscapi.jar 
sunpkcs11.jar 

C:\Program Files\Java\jdk1.5.0_22\jre\lib\ext> 

任何想法,我可以尝试?我想使数据库资源可用于运行在Tomcat中的所有东西(这是我的开发环境)

在此先感谢。

+0

什么是来自错误消息的堆栈跟踪?您将JAR文件放在JDBC驱动程序的哪个位置? –

+0

好的一点,我更新了我原来的帖子和所有这些信息。 – Steve

+1

您的代码正在吞服堆栈跟踪。修改它打印出来。另外,请检查Tomcat日志以查找设置数据源的错误消息。 –

回答

1

可能存在多个问题,首先是在$ CATALINA_HOME/lib和$ JAVA_HOME/jre/lib/ext中有多个Oracle JDBC驱动程序版本的多个副本。

步骤1是从$ CATALINA_HOME/LIB/ojdbc14.jar的

  • ojdbc14.jar的
  • ojdbc14_g开除去以下JAR的所有实例。罐子
  • ojdbc14dms.jar
  • ojdbc14dms_g.jar
  • classes12.jar
  • classes12.zip
  • classes12dms.jar

当你在它,删除$ JAVA_HOME/JRE/lib目录/ext/servlet-api.jar。

第2步是maxIdle> maxActive没有任何意义。你想maxActive> = maxIdle。

+0

完成。仍然没有快乐。我更新了我的帖子,更多的错误信息和新的目录列表。 – Steve

+0

没有。你仍然有多个副本ojdbc14.jar –

+0

我从我的tomcat/lib中抽取了ojdbc14.jar。错误信息没有变化。 – Steve

1

tomcat site上的示例所示,我相信“用户”在您的资源定义中应该是“用户名”。