java.lang.ClassCastException:org.apache.tomcat.dbcp.dbcp.BasicDataSource无法强制转换为org.apache.tomcat.jdbc.pool.DataSource

时间:2011-10-05 20:00:40

标签: tomcat7 sqlanywhere

我正在运行Tomcat 7.0.22,我编写了一个连接到SQL Anywhere 12.0数据库的简单servlet。当我运行servlet时,我得到了java.lang.ClassCastException:org.apache.tomcat.dbcp.dbcp.BasicDataSource无法强制转换为org.apache.tomcat.jdbc.pool.DataSource。我的./META-INF/content.xml文件如下所示:

<Context>
  <Resource name="jdbc/FUDB"
           auth="Container"
           type="javax.sql.DataSource"
           username="dba"
           password="sql"
           driverClassName="sybase.jdbc.sqlanywhere.IDriver"
           factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
     

URL = “JDBC:SQLAnywhere中:UID = DBA; PWD = SQL; ENG = BTH476331A_FedUtilization;”                  accessToUnderlyingConnectionAllowed = “真”                  maxActive = “8”                  maxIdle =“4”/&gt;
      

我的webapp web.xml如下所示:

<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
  http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
  version="3.0"
  metadata-complete="true">
    <display-name>FedUtilization</display-name>  
    <servlet>
  <servlet-name>Report1</servlet-name>
      <display-name>Report1</display-name>
      <servlet-class>com.sapgss.ps.servlet.Report1</servlet-class> 
     

          报告1           / Report1
                   SQL Anywhere 12.0.1服务器jdbc3           JDBC / FUDB           为javax.sql.DataSource           容器       

servlet代码如下:

import java.io.*;
import java.sql.*;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.naming.*;
import org.apache.catalina.core.StandardContext.*;
import org.apache.tomcat.jdbc.pool.*;
import com.sapgss.ps.dbutil.*;
import org.apache.tomcat.dbcp.dbcp.BasicDataSource;

public class Report1 extends HttpServlet {

    public void doGet(HttpServletRequest request,
     

HttpServletResponse响应)           抛出IOException,ServletException           {               尝试         {         response.setContentType( “text / html的”);             PrintWriter out = response.getWriter();             通过out.println( “”);             通过out.println( “”);             out.println(“Hello Elaine!”);             通过out.println( “”);             通过out.println( “”);             out.println(“

Hello Elaine!

”);
            //这是如何在Java Context中编写对数据库的访问   initCtx = new InitialContext();上下文envCtx =(上下文)   initCtx.lookup( “Java的:comp / env的”); DataSource ds =(DataSource)   envCtx.lookup( “JDBC / FUDB”);                         Connection conn = ds.getConnection(); 。                   。                   。
          }       }

当我尝试在此行获取DataSource时发生错误:         DataSource ds =(DataSource)envCtx.lookup(“jdbc / FUDB”);

先谢谢我把头发拉出来。

3 个答案:

答案 0 :(得分:8)

就我而言,我忘记了:

factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"

在我的/tomcat7/conf/context.xml中。刚刚添加,一切正常。

我的context.xml:

<Context> 
    <Resource name="jdbc/gestrel" auth="Container"
    type="javax.sql.DataSource"
    driverClassName="org.postgresql.Driver"
    url="jdbc:postgresql://127.0.0.1:5432/g...."
    username="postgres"
    password="....." maxActive="20" maxIdle="10"
    factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
   maxWait="-1"/>
</Context>

答案 1 :(得分:3)

今天我花了半天的时间试图处理类似的问题。我有tomcat server.xml文件,定义了这样的上下文:

<Context docBase="app" path="/my_context_path">
</Context>

然后我尝试使用org.apache.tomcat.jdbc.pool.DataSource添加jdbc池支持。

刚刚将资源定义添加到我的server.xml上下文定义中(参见上文)。因为我在web.xml中定义了resource-ref。

但是总是返回org.apache.tomcat.dbcp.dbcp.BasicDataSource。我花时间调试tomcat,最后得到以下内容:

  1. 如果我在server.xml上下文中定义资源 - tomcat不会选择它。
  2. 如果在web存档中定义META-INF / context.xml工作正常。
  3. 如果在server.xml中定义GlobalNamingResources标签 - tomcat不会选择它。
  4. 如果tomcat global context.xml文件中的define工作正常。

如果你在web.xml中为不良情况指定resource-ref 1,3 - tomcat将返回org.apache.tomcat.dbcp.dbcp.BasicDataSource,因为我可以看到它是某种默认值。但是使用这样的数据源返回会导致这样的事情:

org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot create JDBC driver of class '' for connect URL 'null' at org.apache.tomcat.dbcp.dbcp.BasicDataSource.createConnectionFactory(BasicDataSource.java:1452) at org.apache.tomcat.dbcp.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:1371) at org.apache.tomcat.dbcp.dbcp.BasicDataSource.getConnection(BasicDataSource.java:1044)

如果未在web.xml中指定resource-ref,那么您将收到一个异常,告知无法找到具有此类名称的资源。

另外我注意到,对于好的情况,在web.xml中指定resource-ref是不必要的(使用和不使用resource-ref)。

尝试我描述的一些案例。我希望有所帮助。

我会尝试在tomcat global context.xml文件中定义资源。

祝你好运!

P.S。我也运行7.0.22版本。

答案 2 :(得分:-1)

解决方案是在您的servlet中导入javax.sql.DataSource,因为您在类型=&#34; javax.sql.DataSource&#34;

的context.xml中定义了资源。