java - 如何修复c3p0连接池初始化异常?

标签 java servlets jdbc connection-pooling c3p0

这是我以前使用 c3p0 创建连接池时发生的异常。

Jun 03, 2015 11:41:29 AM com.mchange.v2.log.MLog 
INFO: MLog clients using java 1.4+ standard logging.
Jun 03, 2015 11:41:29 AM com.mchange.v2.c3p0.C3P0Registry 
INFO: Initializing c3p0-0.9.5 [built 02-January-2015 13:25:04 -0500; debug? true; trace: 10]
Jun 03, 2015 11:41:29 AM com.mchange.v2.c3p0.management.ActiveManagementCoordinator 
WARNING: A C3P0Registry mbean is already registered. This probably means that an application using c3p0 was undeployed, but not all PooledDataSources were closed prior to undeployment. This may lead to resource leaks over time. Please take care to close all PooledDataSources.
Jun 03, 2015 11:41:29 AM com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource 
INFO: Initializing c3p0 pool... com.mchange.v2.c3p0.ComboPooledDataSource [ acquireIncrement -> 5, acquireRetryAttempts -> 30, acquireRetryDelay -> 1000, autoCommitOnClose -> false, automaticTestTable -> null, breakAfterAcquireFailure -> false, checkoutTimeout -> 0, connectionCustomizerClassName -> null, connectionTesterClassName -> com.mchange.v2.c3p0.impl.DefaultConnectionTester, contextClassLoaderSource -> caller, dataSourceName -> 1hge136991f2dudczsq8hw|458d8adc, debugUnreturnedConnectionStackTraces -> false, description -> null, driverClass -> com.mysql.jdbc.Driver, extensions -> {}, factoryClassLocation -> null, forceIgnoreUnresolvedTransactions -> false, forceUseNamedDriverClass -> false, identityToken -> 1hge136991f2dudczsq8hw|458d8adc, idleConnectionTestPeriod -> 300, initialPoolSize -> 3, jdbcUrl -> jdbc:mysql://localhost:3306/ductoreh_patientdb, maxAdministrativeTaskTime -> 0, maxConnectionAge -> 0, maxIdleTime -> 0, maxIdleTimeExcessConnections -> 0, maxPoolSize -> 20, maxStatements -> 50, maxStatementsPerConnection -> 0, minPoolSize -> 2, numHelperThreads -> 3, preferredTestQuery -> SELECT 1, privilegeSpawnedThreads -> false, properties -> {user=******, password=******}, propertyCycle -> 0, statementCacheNumDeferredCloseThreads -> 0, testConnectionOnCheckin -> false, testConnectionOnCheckout -> true, unreturnedConnectionTimeout -> 0, userOverrides -> {}, usesTraditionalReflectiveProxies -> false ]
Jun 03, 2015 11:42:02 AM org.apache.catalina.loader.WebappClassLoader loadClass
INFO: Illegal access: this web application instance has been stopped already.  Could not load com.mchange.v2.resourcepool.BasicResourcePool$AsyncTestIdleResourceTask.  The eventual following stack trace is caused by an error thrown for debugging purposes as well as to attempt to terminate the thread which caused the illegal access, and has no functional impact.
java.lang.IllegalStateException
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1612)
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1571)
    at com.mchange.v2.resourcepool.BasicResourcePool.checkIdleResources(BasicResourcePool.java:1629)
    at com.mchange.v2.resourcepool.BasicResourcePool.access$2000(BasicResourcePool.java:44)
    at com.mchange.v2.resourcepool.BasicResourcePool$CheckIdleResourcesTask.run(BasicResourcePool.java:2161)
    at java.util.TimerThread.mainLoop(Timer.java:555)
    at java.util.TimerThread.run(Timer.java:505)

Exception in thread "C3P0PooledConnectionPoolManager[identityToken->1hge136991f284clsmmfih|19faec40]-AdminTaskTimer" java.lang.NoClassDefFoundError: com/mchange/v2/resourcepool/BasicResourcePool$AsyncTestIdleResourceTask
    at com.mchange.v2.resourcepool.BasicResourcePool.checkIdleResources(BasicResourcePool.java:1629)
    at com.mchange.v2.resourcepool.BasicResourcePool.access$2000(BasicResourcePool.java:44)
    at com.mchange.v2.resourcepool.BasicResourcePool$CheckIdleResourcesTask.run(BasicResourcePool.java:2161)
    at java.util.TimerThread.mainLoop(Timer.java:555)
    at java.util.TimerThread.run(Timer.java:505)
Caused by: java.lang.ClassNotFoundException: com.mchange.v2.resourcepool.BasicResourcePool$AsyncTestIdleResourceTask
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1720)
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1571)
    ... 5 more
Jun 03, 2015 11:42:18 AM org.apache.catalina.loader.WebappClassLoader loadClass
INFO: Illegal access: this web application instance has been stopped already.  Could not load com.mchange.v2.resourcepool.BasicResourcePool$AsyncTestIdleResourceTask.  The eventual following stack trace is caused by an error thrown for debugging purposes as well as to attempt to terminate the thread which caused the illegal access, and has no functional impact.
java.lang.IllegalStateException
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1612)
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1571)
    at com.mchange.v2.resourcepool.BasicResourcePool.checkIdleResources(BasicResourcePool.java:1629)
    at com.mchange.v2.resourcepool.BasicResourcePool.access$2000(BasicResourcePool.java:44)
    at com.mchange.v2.resourcepool.BasicResourcePool$CheckIdleResourcesTask.run(BasicResourcePool.java:2161)
    at java.util.TimerThread.mainLoop(Timer.java:555)
    at java.util.TimerThread.run(Timer.java:505)

Exception in thread "C3P0PooledConnectionPoolManager[identityToken->1hge136991f28gvv1q0gwo7|753c66d3]-AdminTaskTimer" java.lang.NoClassDefFoundError: com/mchange/v2/resourcepool/BasicResourcePool$AsyncTestIdleResourceTask
    at com.mchange.v2.resourcepool.BasicResourcePool.checkIdleResources(BasicResourcePool.java:1629)
    at com.mchange.v2.resourcepool.BasicResourcePool.access$2000(BasicResourcePool.java:44)
    at com.mchange.v2.resourcepool.BasicResourcePool$CheckIdleResourcesTask.run(BasicResourcePool.java:2161)
    at java.util.TimerThread.mainLoop(Timer.java:555)
    at java.util.TimerThread.run(Timer.java:505)
Caused by: java.lang.ClassNotFoundException: com.mchange.v2.resourcepool.BasicResourcePool$AsyncTestIdleResourceTask
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1720)
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1571)
    ... 5 more

这些是我用过的类。

-----连接和连接池---

public class DBConnection
{
    private static DBConnection     datasource;
    private ComboPooledDataSource cpds;

    private DBConnection() throws IOException, SQLException, PropertyVetoException {
        cpds = new ComboPooledDataSource();
        cpds.setDriverClass("com.mysql.jdbc.Driver"); //loads the jdbc driver
        cpds.setJdbcUrl("jdbc:mysql://localhost:3306/xxxxx");
        cpds.setUser("root");
        cpds.setPassword("");

        // the settings below are optional -- c3p0 can work with defaults
        cpds.setMinPoolSize(2);
        cpds.setAcquireIncrement(5);
        cpds.setMaxPoolSize(20);
        cpds.setMaxStatements(50);
        cpds.setIdleConnectionTestPeriod(300);        
        cpds.setTestConnectionOnCheckout(true);
        cpds.setPreferredTestQuery("SELECT 1");

    }

    public static DBConnection getInstance() throws IOException, SQLException, PropertyVetoException {
        if (datasource == null) {
            datasource = new DBConnection();
            return datasource;
        } else {
            return datasource;
        }
    }

    public Connection getConnection() throws SQLException {
        return this.cpds.getConnection();
    }
}

----界面--------

public interface DBInterface
{
    public List<UserBean> getUserData();
}

---- bean ------

public class UserBean
{
    private int idUser;
    private String companyName;
    private String country;
    private String adressLine1;
    private String addressLine2;
    private String zip;
    private String phone;
    private String email;
    private boolean isTrial;
    private Timestamp dateCreated;
    private Timestamp lastUpdated;

    /**
     * @return the idUser
     */
    public int getIdUser()
    {
        return idUser;
    }

    /**
     * @param idUser the idUser to set
     */
    public void setIdUser(int idUser)
    {
        this.idUser = idUser;
    }

    /**
     * @return the companyName
     */
    public String getCompanyName()
    {
        return companyName;
    }

    /**
     * @param companyName the companyName to set
     */
    public void setCompanyName(String companyName)
    {
        this.companyName = companyName;
    }

    /**
     * @return the country
     */
    public String getCountry()
    {
        return country;
    }

    /**
     * @param country the country to set
     */
    public void setCountry(String country)
    {
        this.country = country;
    }

    /**
     * @return the adressLine1
     */
    public String getAdressLine1()
    {
        return adressLine1;
    }

    /**
     * @param adressLine1 the adressLine1 to set
     */
    public void setAdressLine1(String adressLine1)
    {
        this.adressLine1 = adressLine1;
    }

    /**
     * @return the addressLine2
     */
    public String getAddressLine2()
    {
        return addressLine2;
    }

    /**
     * @param addressLine2 the addressLine2 to set
     */
    public void setAddressLine2(String addressLine2)
    {
        this.addressLine2 = addressLine2;
    }

    /**
     * @return the zip
     */
    public String getZip()
    {
        return zip;
    }

    /**
     * @param zip the zip to set
     */
    public void setZip(String zip)
    {
        this.zip = zip;
    }

    /**
     * @return the phone
     */
    public String getPhone()
    {
        return phone;
    }

    /**
     * @param phone the phone to set
     */
    public void setPhone(String phone)
    {
        this.phone = phone;
    }

    /**
     * @return the email
     */
    public String getEmail()
    {
        return email;
    }

    /**
     * @param email the email to set
     */
    public void setEmail(String email)
    {
        this.email = email;
    }

    /**
     * @return the isTrial
     */
    public boolean isIsTrial()
    {
        return isTrial;
    }

    /**
     * @param isTrial the isTrial to set
     */
    public void setIsTrial(boolean isTrial)
    {
        this.isTrial = isTrial;
    }

    /**
     * @return the dateCreated
     */
    public Timestamp getDateCreated()
    {
        return dateCreated;
    }

    /**
     * @param dateCreated the dateCreated to set
     */
    public void setDateCreated(Timestamp dateCreated)
    {
        this.dateCreated = dateCreated;
    }

    /**
     * @return the lastUpdated
     */
    public Timestamp getLastUpdated()
    {
        return lastUpdated;
    }

    /**
     * @param lastUpdated the lastUpdated to set
     */
    public void setLastUpdated(Timestamp lastUpdated)
    {
        this.lastUpdated = lastUpdated;
    }


}

---实现类----

public class DBImpl implements DBInterface
{

    public List<UserBean> getUserData()
    {
        System.out.println("01");

        Statement statement=null;
        Connection connection=null;
        ResultSet resultSet=null;
        List<UserBean> beans=new ArrayList<UserBean>();

        System.out.println("02");
        try
        {
            System.out.println("03");
            connection=DBConnection.getInstance().getConnection();
            System.out.println("04");
            String sql = "select * from user where isTrial=true";
            System.out.println("05");
            statement=connection.createStatement();
            System.out.println("06");
            resultSet=statement.executeQuery(sql.toLowerCase());
            System.out.println("07");
            if(resultSet.isBeforeFirst())
            {
                System.out.println("08");
                while(resultSet.next()){
                    System.out.println("09");
                    UserBean bean=new UserBean();
                    System.out.println("10");

                    bean.setIdUser(resultSet.getInt("idUser"));
                    System.out.println(resultSet.getInt("idUser"));

                    bean.setCompanyName(resultSet.getString("CompanyName"));
                    System.out.println(resultSet.getString("CompanyName"));

                    bean.setCountry(resultSet.getString("Country"));
                    bean.setAdressLine1(resultSet.getString("Address_Line1"));
                    bean.setAddressLine2(resultSet.getString("Address_Line2"));
                    bean.setZip(resultSet.getString("Zip"));
                    bean.setPhone(resultSet.getString("Phone"));
                    bean.setEmail(resultSet.getString("Email"));
                    bean.setIsTrial(resultSet.getBoolean("isTrial"));
                    bean.setDateCreated(resultSet.getTimestamp("DateCreated"));
                    bean.setLastUpdated(resultSet.getTimestamp("LastUpdated"));
                    beans.add(bean);
                }
            }


        } catch (Exception ex)
        {
            ex.printStackTrace();
        }finally{
            try{
                if(resultSet!=null){
                    resultSet.close();
                }
                if(statement!=null){
                    statement.close();
                }
                if(connection!=null){
                    connection.close();
                }
            }catch(Exception e){
                e.printStackTrace();
            }
        }

        return beans;

    }


}

当我运行以下 servlet 时,我得到了上述异常。

---Servlet---

public class Test01 extends HttpServlet
{

    /**
     * Processes requests for both HTTP <code>GET</code> and <code>POST</code>
     * methods.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException
    {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        try
        {
            DBInterface bImpl=new DBImpl();            
            List<UserBean> userData = bImpl.getUserData();            

            for(int i=0;i<userData.size();i++){
                out.println(userData.get(i).toString());
            }


        } finally
        {
            out.close();
        }
    }

在这里我想知道这个异常是怎么产生的,为什么?我可以完成我预期的任务,但这给我带来了上述错误。我是连接池的新手。

最佳答案

您好,我在我工作的一个应用程序中遇到了同样的异常。下面是我在遇到类似问题时引用的一些有用链接。

[1] https://forums.hibernate.org/viewtopic.php?t=924835&view=next&sid=abc532479937768dd0fd58e82a1f465f

[2] Getting Exception and application not able to connect with MySqL Database when using connection pooling (c3p0-0.9.1.2) with Hibernate 3.2?

在重新部署类被卸载的过程中,如果您未能关闭 Hibernate 的 sessionFactory,那么您将得到这些 ClassNotFound 错误。 #2 中的答案之一建议您可以添加自定义 ServletContextListener 来处理 contextDestroyed 事件。

关于java - 如何修复c3p0连接池初始化异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30612955/

相关文章:

java - 如何将从两个表中检索的数据存储到 java/servlet/jsp 中的另一个表中

java - 对于 JDBC 操作,Spring 是否过于复杂?

tomcat - org.eclipse.birt.report.data.oda.jdbc.JDBCException : Cannot load JDBC Driver class: org. postgresql.驱动程序

java - PostgreSQL 和 JDBC : Is `UPDATE table ... RETURNING ... INTO` supported?

java - springfox ApiModelProperty 位置排序不起作用

java - 从 JSP 中的属性目录获取文本文件

java - 自定义代理复制 PDF

java - 有没有办法在 public static void main(string args[]) 中不使用 static ?

java - Jira REST API Java - 缺少 Artifact

java - 为什么java中静态需要连接<T>?