我正在运行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”);
先谢谢我把头发拉出来。
答案 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,最后得到以下内容:
如果你在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中定义了资源。