在tomcat5.5下有一个报表程序,之前这些报表的后台数据库是sql server 2000,使用没有大问题,前几天,有几张新的报表后台数据库是oracle 9i的。加入到这个报表程序中之后,发现这个一个问题。当重启tomcat之后,如果先打开sql server 2000的报表,则oracle的报表就出错,如果先打开oracle的报表,则两种数据库的报表都正常运行。这是不是tomcat的bug?请高手会诊下。
我使用如下的代码检查数据库连接是否正常:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ page import="java.sql.*,javax.sql.*,javax.naming.*" %><%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>Mtest</title>
    
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">    
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->  </head>
  
  <body>
    <% 
request.setCharacterEncoding("GBK");
String jndistr = "";
String[] params;
try{
jndistr = request.getParameter("jndistr");

}catch(Exception e)
{
jndistr = "";
}
if(jndistr==null||jndistr.equals("")){
out.println("<font color='#ff0000'><b>请输入JNDI的名称!</b></font>");
}else{
String lookUpName = jndistr;//这里的oracle01根据数据源的连接的设置来写 
Connection con =null;
try 
{
Context ctx = new InitialContext();
DataSource ds = (DataSource)ctx.lookup(lookUpName);
con=  ds.getConnection();
if(con!=null){
out.println("<b>jdbc:class"+ds.getClass().getName()+"</b>");
out.println("</br>");
out.println("<b>jdbc:lookUpName:"+lookUpName+"</b>");
}
}
catch (NamingException e) 
{
     out.println(e.getMessage());
  } catch (SQLException e) {
     out.println(e.getMessage());
    ///e.printStackTrace();
  }
finally
  {
    if(con!=null) con.close();
  } }
%><form name="form1" method="post" action="">
<table>
<tr>
<td>JNDI名称:<input type="text" name="jndistr" value=""></td>
<td><input type="submit"  value="提交"></td>
</tr>
<tr>
<td>
Tomcat/Resin格式:<b>java:/comp/env/jndistr</b><br>
Weblogic/Webshpere格式:<b>jndistr</b><br>
Jboss格式:<b>java:jndistr</b><br>
</td>
</tr>
</table>
</form>
  </body>
</html>先测试sql server2000的JNDI,然后再测试oracle的JNDI出现如下错误:
HTTP Status 500 - --------------------------------------------------------------------------------type Exception reportmessage description The server encountered an internal error () that prevented it from fulfilling this request.exception org.apache.jasper.JasperException
org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:460)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:373)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:329)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)
javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
root cause java.lang.NullPointerException
org.apache.tomcat.dbcp.dbcp.DelegatingConnection.close(DelegatingConnection.java:214)
org.apache.tomcat.dbcp.dbcp.PoolableConnection.reallyClose(PoolableConnection.java:102)
org.apache.tomcat.dbcp.dbcp.PoolableConnectionFactory.destroyObject(PoolableConnectionFactory.java:305)
org.apache.tomcat.dbcp.dbcp.BasicDataSource.validateConnectionFactory(BasicDataSource.java:1253)
org.apache.tomcat.dbcp.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:1221)
org.apache.tomcat.dbcp.dbcp.BasicDataSource.getConnection(BasicDataSource.java:880)
org.apache.jsp.db_jsp._jspService(db_jsp.java:97)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:98)
javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:331)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:329)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)
javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
note The full stack trace of the root cause is available in the Apache Tomcat/5.5.27 logs.
--------------------------------------------------------------------------------Apache Tomcat/5.5.27

解决方案 »

  1.   

    通过oracle能访问sql server,但是通过sql server不能访问oracle。我想这就是问题所在吧~~~应该跟tomcat没关系
      

  2.   

    楼上误会了我的意思,我是说有些报表是从sql server取数据,有些报表从oracle取数据。
      

  3.   

    <Context path="/report" reloadable="true" docBase="report">
    <Resource name="orareport" auth="Container" type="javax.sql.DataSource"  username="report" password="report" 
    driverClassName="oracle.jdbc.driver.OracleDriver" url="jdbc:oracle:thin:@192.168.88.82:1521:PRD" /> <Resource name="sqlreport" auth="Container" type="javax.sql.DataSource"  username="report" password="reportdd" driverClassName="com.newatlanta.jturbo.driver.Driver" 
    url="jdbc:JTurbo://app/tt/charset=GBK"   
    maxActive="100" maxIdle="100"   maxWait="5000" removeAbandoned="true" removeAbandonedTimeout="300" logAbandoned="true" />
    </Context>orareport是oralce数据库
    sqlreport是sql server 2000数据库
      

  4.   

    lz的问题是在同一个应用服务中想通过两个不同的数据源连接到不同类型的数据库取数据。这个Tomcat服务器不知道是否支持。
      

  5.   

    问题的关键是:如果先打开oracle的报表,则两种数据库的报表都正常运行,反过来,只有sql server 2000的报表正常,oracle的报表出错。
      

  6.   

    问题解决了,原来是驱动的问题。
    就的驱动com.newatlanta.jturbo.driver.Driver,版本是1.2的
    换成:com.microsoft.sqlserver.jdbc.SQLServerDriver就正常了。
      

  7.   

    你把sql数据库也该用Oracle数据库