java.lang.ClassCastException:org.apache.commons.dbcp.BasicDataSource无法强制转换为org.apache.commons.dbcp.BasicDataSource

时间:2015-06-27 16:12:32

标签: java tomcat connection-pooling apache-commons-dbcp jdbc-pool

尝试检索在Tomcat Global资源下配置的DataSource时,我得到了这个奇怪的异常。

java.lang.ClassCastException: org.apache.commons.dbcp.BasicDataSource cannot be cast to org.apache.commons.dbcp.BasicDataSource
    org.apache.jsp.Monitor_jsp._jspService(Monitor_jsp.java:53)
    org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:133)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:856)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:311)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:301)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:248)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:856)

这就是我的Monitor.jsp的样子

<%@ page import="org.apache.commons.dbcp.BasicDataSource" %>
<%@ page import="com.dixons.myapp.db.DataSourceHelper" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Monitor page</title>
</head>
<body>
<%
    BasicDataSource ds = (BasicDataSource) DataSourceHelper.getDbDataSource();
    out.println(ds.getNumActive() + " " + ds.getNumIdle());
%>
</body>
</html>

我知道 ClassCastException 是什么。但我无法理解为什么Java认为这两个类是不同的,即使它们具有相同的名称并且在同一个包中?

我的应用程序可以正常使用对象 javax.sql.DataSource 。但是我希望将它转换为此监视器页面的 org.apache.commons.dbcp.BasicDataSource ,以便我可以密切关注我的数据库资源。

1 个答案:

答案 0 :(得分:2)

这是因为同一个类由两个不同的类加载器加载。

一个可能是WebappClassLoader加载程序,另一个可能是sun.misc.Launcher$AppClassLoader。 可以找到更多详细信息here