我经常遇到这样的错误:org.javalite.activejdbc.DBException:无法打开新连接

我经常遇到这样的错误:org.javalite.activejdbc.DBException:无法打开新连接,java,activejdbc,javalite,Java,Activejdbc,Javalite,当我离开一个页面10分钟后再刷新时,或者当我快速多次刷新一个页面(当然是控制器启动查询的页面)时,我遇到了这个错误 塔河与此处的错误相同: 我使用ActiveJdbc的1.4.13.j7和c3p0-0.9.1.2作为连接池 这是我的代码:连接的单例 import com.mchange.v2.c3p0.DataSources; import java.sql.SQLException; import javax.sql.DataSource; import java.util.logging.L

当我离开一个页面10分钟后再刷新时,或者当我快速多次刷新一个页面(当然是控制器启动查询的页面)时,我遇到了这个错误

塔河与此处的错误相同:

我使用ActiveJdbc的1.4.13.j7和c3p0-0.9.1.2作为连接池

这是我的代码:连接的单例

import com.mchange.v2.c3p0.DataSources;
import java.sql.SQLException;
import javax.sql.DataSource;
import java.util.logging.Level;
import java.util.logging.Logger;

public class ConnectionPool {

    private DataSource dataSourceUnpooled;
    private DataSource dataSourcePooled;
    private static ConnectionPool instance;

    private ConnectionPool() {
        init();
    }

    public static synchronized ConnectionPool getInstance() {
        if (instance == null) {
            instance = new ConnectionPool();
        }
        return instance;
    }

    private void init() {
        try {
            Class.forName("org.postgresql.Driver");
            dataSourceUnpooled = DataSources.unpooledDataSource("jdbc:postgresql://127.0.0.1:5432/mydb", "postgres", "");
            dataSourcePooled = DataSources.pooledDataSource(dataSourceUnpooled);
        } catch (ClassNotFoundException | SQLException ex) {
            Logger.getLogger(ConnectionPool.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public DataSource getConnection() {
        return dataSourcePooled;
    }
}
下面是一个抛出异常的控制器示例

Base.open(ConnectionPool.getInstance().getConnection());

List<Game> games= Game.where("add_on_id = ?)", addOnId);
games.size();

Base.close();

return "addOnView";

我认为您的代码有一些问题。以下是我的建议:

  • 请将此用作自定义池配置的示例:
  • 通过将连接打开/关闭调用移动到servlet筛选器来清理代码:
  • 您可能需要检查ActiveWeb,它与ActiveJDBC集成得很好,并提供了很高的生产效率:

  • 你能包含你的异常的完整堆栈跟踪吗?如果你真的想使用你的池(而不是容器池),你可以看看这个测试:我给你的另一个建议是不要污染控制器中打开和关闭连接的代码。相反,请为此编写一个servlet过滤器,以下是示例:。这还允许您不调用显式
    games.size()
    ,因为视图可以访问当前线程上的连接。好的,谢谢您的建议!我会做你所有的建议,如果有问题我会发帖。我已经用我的堆栈跟踪更新了我的帖子。我遵循了您的建议,针对过滤器(使我的代码更干净)和池示例。经过一天的测试,它工作正常。再次感谢你。这真的很有帮助。当我发现它时,我在想:“我应该使用ActiveWeb”。但是我已经在用spring了,现在改变已经太晚了。对于我的下一个项目,我肯定会使用ActiveWeb。对于upvote,我不能这么做,我需要15点的声誉来投票:/
    exception
    
    org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.javalite.activejdbc.DBException: Cannot open a new connection because existing connection is still on current thread, name: default, connection instance: com.mchange.v2.c3p0.impl.NewProxyConnection@50ed26eb. This might indicate a logical error in your application.
        org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:982)
        org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861)
        javax.servlet.http.HttpServlet.service(HttpServlet.java:622)
        org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)
        javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
        org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
        org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393)
        com.myapp.config.ActiveJdbcFilter.doFilter(ActiveJdbcFilter.java:46)
    root cause
    
    org.javalite.activejdbc.DBException: Cannot open a new connection because existing connection is still on current thread, name: default, connection instance: com.mchange.v2.c3p0.impl.NewProxyConnection@50ed26eb. This might indicate a logical error in your application.
        org.javalite.activejdbc.DB.checkExistingConnection(DB.java:235)
        org.javalite.activejdbc.DB.open(DB.java:186)
        org.javalite.activejdbc.Base.open(Base.java:106)
        com.myapp.controllers.AddOnController.addOns(AddOnController.java:145)
        sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        java.lang.reflect.Method.invoke(Method.java:483)
        org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:221)
        org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:136)
        org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:114)
        org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:827)
        org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:738)
        org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)
        org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:963)
        org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:897)
        org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970)
        org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861)
        javax.servlet.http.HttpServlet.service(HttpServlet.java:622)
        org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)
        javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
        org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
        org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393)
        com.myapp.config.ActiveJdbcFilter.doFilter(ActiveJdbcFilter.java:46)
    note The full stack trace of the root cause is available in the Apache Tomcat/8.0.27 logs.