【问题标题】:java.lang.ClassCastException: org.apache.tomcat.dbcp.dbcp.BasicDataSource cannot be cast to org.apache.tomcat.jdbc.pool.DataSourcejava.lang.ClassCastException: org.apache.tomcat.dbcp.dbcp.BasicDataSource 不能转换为 org.apache.tomcat.jdbc.pool.DataSource
【发布时间】:2011-12-01 19:02:29
【问题描述】:

我正在运行 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="true" 最大活动=“8” maxIdle="4" />

我的 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 /报告1
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("你好伊莱恩!"); out.println(""); out.println(""); out.println("

你好伊莱恩!

");
// 这是如何在 Java Context 中编写访问数据库的代码 initCtx = new InitialContext();上下文 envCtx = (上下文) initCtx.lookup("java:comp/env");数据源 ds = (数据源) envCtx.lookup("jdbc/FUDB"); 连接连接 = ds.getConnection(); . . .
} }

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

提前谢谢我正在拔头发。

【问题讨论】:

  • 我解决了这个问题。我需要做的是在 %CATALINA%/localhst/webappname.xml 中创建一个 context.xml 文件。

标签: tomcat7 sqlanywhere


【解决方案1】:

解决方案是在您的 servlet 中导入 javax.sql.DataSource,因为您在 type="javax.sql.DataSource" 的 context.xml 中定义资源

【讨论】:

    【解决方案2】:

    在我的情况下,我只是忘记了:

    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>
    

    【讨论】:

    • 您,先生,是我的英雄。这值得一提。
    • 这对我有用,但我在 server.xml 中更新了 factory="org.apache.tomcat.jdbc.pool.DataSourceFactory" 而不是 context.xml !
    【解决方案3】:

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

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

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

    刚刚将资源定义添加到我的 server.xml 上下文定义中(见上文)。当然,我在 web.xml 中定义了资源引用。

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

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

    如果您在 web.xml 中为不良情况 1,3 指定 resource-ref - 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,那么您将收到一个异常,告诉您找不到具有该名称的资源。

    我还注意到,对于好的情况 2,4,不需要在 web.xml 中指定资源引用(使用和不使用资源引用)。

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

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

    祝你好运!

    附:我也运行 7.0.22 版本。

    【讨论】:

      猜你喜欢
      • 2012-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-14
      • 2019-05-08
      • 2016-09-20
      • 2011-06-07
      • 2012-12-10
      相关资源
      最近更新 更多