当我离开一个页面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.
能否请您包含异常的完整堆栈跟踪? – ipolevoy
如果你真的想使用你的池(而不是一个容器池),你可以看看这个测试:https://github.com/javalite/activejdbc/blob/8f09292c8cd36271e7b20f996224d0b54cd06af9/activejdbc/src/test/java/org /javalite/activejdbc/C3P0PoolTest.java – ipolevoy
我给你的另一个建议是不要污染控制器内的代码来打开和关闭连接。相反,为此写一个servlet过滤器,这里是例子:https:// github。COM/javalite/activejdbc/BLOB/765f9c9583dfaae5893bbe476e240bbac56e8975/activejdbc/src目录/主/ JAVA /组织/ javalite/activejdbc /网络/ ActiveJdbcFilter.java#L45-L45。这也可以让你不要显式调用'games.size()',因为视图可以访问当前线程上的连接。 – ipolevoy