2017-02-21 155 views
0

当我离开一个页面10分钟,然后刷新或当我多次刷新一个页面时,我得到这个错误(一个页面控制器启动一个课程查询)。我经常得到这个错误:org.javalite.activejdbc.DBException:无法打开一个新的连接

塔河同样的错误如下:https://github.com/javalite/activejdbc/issues/268

我用ActiveJdbc的1.4.13.j7和c3p0-0.9.1.2连接池。

这里是我的代码:一个Singleton的用于连接

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"; 

我见过一些人有这个问题以及在线搜索解决方案时,但我没有找到解决问题的人。我使用open和close,所以我不知道问题来自哪里。

有什么我做错了吗?

编辑:

这里是整个statcktrace

HTTP状态500 - 请求处理失败;嵌套的异常是org.javalite.activejdbc.DBException:无法打开新的连接,因为现有连接仍在当前线程上,名称:default,连接实例:[email protected]。这可能表明您的应用程序中存在逻辑错误。

类型异常报告

消息请求处理失败;嵌套的异常是org.javalite.activejdbc.DBException:无法打开新的连接,因为现有连接仍在当前线程上,名称:default,连接实例:[email protected]。这可能表明您的应用程序中存在逻辑错误。

说明服务器遇到内部错误,导致无法完成此请求。

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: [email protected] 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: [email protected] 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. 
+0

能否请您包含异常的完整堆栈跟踪? – ipolevoy

+0

如果你真的想使用你的池(而不是一个容器池),你可以看看这个测试:https://github.com/javalite/activejdbc/blob/8f09292c8cd36271e7b20f996224d0b54cd06af9/activejdbc/src/test/java/org /javalite/activejdbc/C3P0PoolTest.java – ipolevoy

+0

我给你的另一个建议是不要污染控制器内的代码来打开和关闭连接。相反,为此写一个servlet过滤器,这里是例子:https:// github。COM/javalite/activejdbc/BLOB/765f9c9583dfaae5893bbe476e240bbac56e8975/activejdbc/src目录/主/ JAVA /组织/ javalite/activejdbc /网络/ ActiveJdbcFilter.java#L45-L45。这也可以让你不要显式调用'games.size()',因为视图可以访问当前线程上的连接。 – ipolevoy

回答

0

我认为你的代码存在一些问题。这里是我的建议:

  1. 请使用此定制池配置的例子:https://github.com/javalite/activejdbc/blob/8f09292c8cd36271e7b20f996224d0b54cd06af9/activejdbc/src/test/java/org/javalite/activejdbc/C3P0PoolTest.java
  2. 清理你的代码通过移动连接打开/关闭调用Servlet过滤器:https://github.com/javalite/activejdbc/blob/765f9c9583dfaae5893bbe476e240bbac56e8975/activejdbc/src/main/java/org/javalite/activejdbc/web/ActiveJdbcFilter.java#L45-L45
  3. 你可能想检查ActiveWeb,它与ActiveJDBC很好地集成在一起,并提供高度的生产力:http://javalite.io/activeweb
+0

我在想:当我发现它时,我应该使用ActiveWeb。但我已经在使用春天了,改变已经太迟了。对于我的下一个项目,我一定会使用ActiveWeb。而对于upvote,我做不到,我需要15点声望投票:/ – Rony

相关问题