Jooq、Spring 和 BoneCP 连接关闭两次错误

2024-03-15

我正在将 Spring 4.0.0 以及 jOOQ 3.2.0 和 BoneCP 0.8.0 用于 Web 应用程序。

我的 PersistenceContext 配置与本指南相同(请浏览一下,代码有点太多,无法粘贴到此处)

http://www.petrikainulainen.net/programming/jooq/using-jooq-with-spring-configuration/ http://www.petrikainulainen.net/programming/jooq/using-jooq-with-spring-configuration/

但最大连接数较少,并且 closeConnectionWatch = true 用于错误检查。

据我所知,本指南是 jOOQ 网站自己的指南的非 XML 版本,请参见此处

http://www.jooq.org/doc/3.2/manual/getting-started/tutorials/jooq-with-spring/ http://www.jooq.org/doc/3.2/manual/getting-started/tutorials/jooq-with-spring/

我的问题来自于可能不知道如何使用 jOOQ 生成的 DAO 或 @Transactional 注释。我遇到了大量的“连接关闭两次”异常,这使我的应用程序从根本上崩溃了。下面的堆栈跟踪实际上并没有说它被关闭了两次,但是 closeConnectionWatch 的输出说了类似的内容

bonecp connection closed twice detected: first location connection was closed in thread[blah]
closed again in thread[blah2]

连接监视执行操作后 SQL 异常的堆栈跟踪:

Jan 28, 2014 10:51:51 AM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [appServlet] in context with path [/application] threw     exception [Request processing failed; nested exception is org.springframework.jdbc.UncategorizedSQLException: jOOQ; uncategorized SQLException for SQL 
<snip> error code [0]; Connection is closed!; nested exception is java.sql.SQLException: Connection is closed!] with root cause java.sql.SQLException: Connection is closed!
at com.jolbox.bonecp.ConnectionHandle.checkClosed(ConnectionHandle.java:459)
at com.jolbox.bonecp.ConnectionHandle.prepareStatement(ConnectionHandle.java:1011)
at sun.reflect.GeneratedMethodAccessor40.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.springframework.jdbc.datasource.LazyConnectionDataSourceProxy$LazyConnectionInvocationHandler.invoke(LazyConnectionDataSourceProxy.java:376)
at com.sun.proxy.$Proxy73.prepareStatement(Unknown Source)
at sun.reflect.GeneratedMethodAccessor40.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy$TransactionAwareInvocationHandler.invoke(TransactionAwareDataSourceProxy.java:240)
at com.sun.proxy.$Proxy73.prepareStatement(Unknown Source)
at org.jooq.impl.ProviderEnabledConnection.prepareStatement(ProviderEnabledConnection.java:112)
at org.jooq.impl.SettingsEnabledConnection.prepareStatement(SettingsEnabledConnection.java:76)
at org.jooq.impl.AbstractResultQuery.prepare(AbstractResultQuery.java:224)
at org.jooq.impl.AbstractQuery.execute(AbstractQuery.java:295)
at org.jooq.impl.AbstractResultQuery.fetch(AbstractResultQuery.java:324)
at org.jooq.impl.SelectImpl.fetch(SelectImpl.java:1034)
at org.jooq.impl.DAOImpl.fetch(DAOImpl.java:249)
----> at com.myapplication.spring.services.UserService.authenticate(UserService.java:32)
at com.myapplication.spring.controllers.LoginController.doLogin(LoginController.java:35)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:214)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:748)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:689)
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:83)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:945)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:876)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:931)
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:833)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:807)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at com.github.dandelion.datatables.core.web.filter.DatatablesFilter.doFilter(DatatablesFilter.java:73)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:931)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1004)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)

我所指向的行是服务中调用数据库的行。我的服务中有 @Autowired DAO 对象,如下所示

@Service("UserService")
public class UserService implements UserServiceInterface{

@Autowired UsersDao userDao;
@Autowired PasswordServiceInterface passwordService;

@Override

public Users authenticate(String user,String password) {
    boolean allowedIn = false;

    List<Users> users = userDao.fetch(USERS.USERNAME, user);
            //do something here

我在类似服务中使用的其他函数包含使用 DSLContext 对象的调用,例如

DSL.select(SOMETHING).from(SOMETABLE).fetch()

DAO 和 DSLContext 作为 bean 存储在 PersistenceContext 中,如下所示。 我自动装配为 DSLContext,而不是 *Default*DSLContext,因为 jOOQ 指南底部有一个测试方法,仅显示 DSLContext。

@Bean
public DefaultDSLContext dsl() {
    return new DefaultDSLContext(configuration());
}

@Bean 
public UsersDao userDao() { //bad because UsersDao isn't an interface???
    return new UsersDao(configuration());
}   

这是控制器

@Controller
public class LoginController {

@Autowired UserServiceInterface userService;

@RequestMapping(value = "/login", method = RequestMethod.GET)
public String login() {
    return "login";
}

@RequestMapping(value = "/login/doLogin", method = RequestMethod.POST)
public String doLogin(@RequestParam("username")String username, @RequestParam("password") String password, HttpSession session) {

    Users u = userService.authenticate(username, password);
    if(u == null) 
        return "redirect:/error";
    else {
        session.setAttribute("user", u.getUserid());
        session.setAttribute("role", u.getRoleid());
        session.setAttribute("retailgroup", u.getGroupid());
        return "redirect:/dashboard";
    }
}

UserService 并不是我遇到错误的唯一服务——我的所有服务都相似,因为它们都包含一个/两个 DAO 和 DSLContext Autowired 对象,具有与 usersDao() 相同的 DAO 配置构造函数,例如 productsDao()。 Products 服务有这个 DAO 和一个 DSLContext 对象,与它调用数据库的 UsersService 非常相似。

有时我会在登录时遇到此连接问题,其他时候会很好,我可以浏览网站并查看产品一段时间,但随后我会随机收到“连接已关闭!”来自另一个服务的错误(大约有 5 个以相同的方式编写)。

所以我的问题是

  1. 我在哪里使用 @Transactional 注释,它的实际作用是什么。我省略了 @Transactional 注释是否意味着我给自己带来了问题?我之前已将其添加到使用数据库的所有位置,但我无法确定它是否真的有帮助,因为我仍然遇到相同的错误。

  2. 我的范围有问题吗?我知道bean默认为单例 - 我以这样的方式编写了控制器,它们使用会话存储的属性传递给服务(它们都保留为默认单例),以便它们只能选择特定用户的数据被允许看到。

  3. 由于连接池两次关闭连接,这是否意味着问题是线程 A 和线程 B 同时获取连接,对其执行某些操作,然后都关闭?为什么使用上述指南中的配置会发生这种情况?我如何确保线程安全或者这不是问题?

  4. DAO bean 是否应该是接口,从我使用 Spring 的简短历史来看,我相信很多(很多/全部?)@Autowired beans 应该是接口?我是否应该使用 org.jooq.DAOImpl 接口,这是所有 jOOQ 生成的 DAO 似乎都实现的接口?

    @Bean
    public org.jooq.impl.DAOImpl usersDao() {
        return new usersDao(configuration());
    }
    

对于这个长问题表示歉意,任何帮助将不胜感激。谢谢。

编辑:这是我在 PersistenceContext 类中的配置

@Configuration
@PropertySource("classpath:config.properties")
public class PersistenceContext {

@Autowired
private Environment env;


@Bean(destroyMethod = "close")
public DataSource dataSource() {
    BoneCPDataSource dataSource = new BoneCPDataSource();
    dataSource.setDriverClass(env.getRequiredProperty("db.driver"));
    dataSource.setJdbcUrl(env.getRequiredProperty("db.url"));
    dataSource.setUsername(env.getRequiredProperty("db.username"));
    dataSource.setPassword(env.getRequiredProperty("db.password"));
    dataSource.setMaxConnectionsPerPartition(20);
    dataSource.setPartitionCount(2);
    dataSource.setCloseConnectionWatch(true);
    return dataSource;
}

@Bean
public LazyConnectionDataSourceProxy lazyConnectionDataSource() {
    return new LazyConnectionDataSourceProxy(dataSource());
}

@Bean
public TransactionAwareDataSourceProxy transactionAwareDataSource() {
    return new TransactionAwareDataSourceProxy(lazyConnectionDataSource());
}

@Bean
public DataSourceTransactionManager transactionManager() {
    return new DataSourceTransactionManager(lazyConnectionDataSource());
}

@Bean
public DataSourceConnectionProvider connectionProvider() {
    return new DataSourceConnectionProvider(transactionAwareDataSource());
}

@Bean
public JOOQToSpringExceptionTransformer jooqToSpringExceptionTransformer() {
    return new JOOQToSpringExceptionTransformer();
}

@Bean
public DefaultConfiguration configuration() {
    DefaultConfiguration jooqConfiguration = new DefaultConfiguration();
    jooqConfiguration.set(connectionProvider());
    jooqConfiguration.set(new DefaultExecuteListenerProvider(
        jooqToSpringExceptionTransformer()
    ));

    String sqlDialectName = env.getRequiredProperty("jooq.sql.dialect");
    SQLDialect dialect = SQLDialect.valueOf(sqlDialectName);
    jooqConfiguration.set(dialect);

    return jooqConfiguration;
}

@Bean
public DefaultDSLContext dsl() {
    return new DefaultDSLContext(configuration());
}

@Bean
public UsersDao userDao() {
    return new UsersDao(configuration());
}

}

重新阅读您的问题和聊天后,我可以看出这很可能是由于您使用的版本所致3.2.0,这里有一个相当严重的错误:

  • https://github.com/jOOQ/jOOQ/issues/2863 https://github.com/jOOQ/jOOQ/issues/2863

该错误已修复3.2.2,您应该升级到哪个(或更高版本)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Jooq、Spring 和 BoneCP 连接关闭两次错误 的相关文章

随机推荐

  • Javascript 警报在页面显示之前加载

    在我的手机上 在 Safari 中如果我转到默认页面alert Hello 在正文 onload 事件中 警报显示 我的默认页面在后台完全可见 如果我随后转到另一个网站 例如 bbc co uk 然后在地址栏中输入默认页面的网址 则警报会在
  • 为什么 Docker Django 管理员崩溃并显示代码 245

    我正在 OSX 10 15 3 上使用 runserver 运行 Django 版本 3 0 3 使用我的应用程序没有问题 但是当我尝试访问时http localhost 8000 admin http localhost 8000 adm
  • Web Api - 如何检测响应何时完成发送

    在 Web api 方法中 我生成一个文件 然后将其流式传输到响应 如下所示 public async Task
  • NSUserDefaults standardUserDefaults 不适用于扩展

    我将应用程序组添加到开发人员门户中的应用程序 ID 并在我的配置文件中使用该应用程序 ID 我在 Xcode 中的产品标识符设置为该应用程序 ID 在我的应用程序委托中 我从 didFinishLaunchingWithOptions 中调
  • 在Python中捕获imaplib异常(使用IMAPClient包)

    我正在使用外部库 IMAPClient 当登录失败时 我看到以下错误 imaplib error AUTHENTICATIONFAILED Authentication failed 当我尝试时except imaplib error 我得
  • 将 IAsyncEnumerable 转换为列表

    所以在 C 8 中我们添加了IAsyncEnumerable界面 如果我们有一个正常的IEnumerable我们可以做一个List或者我们想要从中得到的几乎任何其他集合 感谢那里的 Linq var range Enumerable Ran
  • 如何在 openGL ES 2.0 中执行 2 遍以获得模糊效果

    为了创建模糊效果 理论上需要创建 2 个顶点着色器 一个用于水平通道 第二个用于垂直通道 然后使用一个片段着色器进行实际采样 我的问题是 如何实际执行 2 个顶点着色器 我是否需要渲染 然后通过 glReadPixels 返回像素 然后再次
  • jQuery 如果宽度等于百分比

    我知道以像素为单位你可以做这种事情 但如果使用百分比 则不会返回任何内容 如果我的 CSS 使用百分比 我该如何处理 我基本上需要查看具有特定值的 div 然后触发脚本的变体 jQuery if modPopUp css width 32
  • 使用 DirectX 或 OpenGL 显示 100 个浮动立方体

    我想使用显示 100 个浮动立方体DirectX or OpenGL 我正在寻找一些示例源代码或该技术的描述 我无法正确显示多个立方体 我在网上搜索了一系列很好的教程 尽管他们谈论了如何做3D基元 我找不到有关如何进行大量操作的信息3D原语
  • 如何为 VB.net 程序创建启动屏幕

    如何为 vb net 程序创建启动屏幕 我想制作一个在程序开始之前和结束之后出现的视觉效果 这可能吗 打开你的 vb net 添加新项目 转到表单的属性 清除文本 Set the 表单边框样式没有 插入背景图像 将背景图像设置为拉伸 Add
  • 如何删除xlwings中的列?

    我在用着xlwings在 Windows 上 带有 Python 2 7 的 Excel 2007 并且想要使用以下命令删除范围或列xlwings 据我所知 删除范围或列是一个缺失的功能 所以我尝试按照给出的说明进行操作here http
  • 隐式本地化和嵌入资源

    我们可以在使用嵌入资源文件 resx 的同时在 asp net meta resourcekey 中使用隐式本地化吗 如果 app localresouces 中的资源设置为 内容 则一切正常 但如果将其设置为 嵌入 则无法使其工作 使用隐
  • Android:如何以编程方式使活动窗口半透明?

    有没有办法以编程方式使活动窗口显示为半透明 出于我的目的 我无法使用静态 XML 资源 我尝试将背景资源设置为半透明颜色 但这只会使背景显示为纯黑色 把它写在你的活动课上 Window window this getWindow windo
  • 如何管理需要AsyncTask调用的不同任务

    我有一个外部库可以使用 它通过互联网与服务器进行通信 每当我需要从互联网获取一些信息时 Android 都会强制我使用异步任务 到目前为止没有问题 但是 我收到越来越多的任务来从互联网检索 以不同方式 数据 并且我不喜欢为每个调用增加不同的
  • 为什么我的 Julia 代码运行速度比 JavaScript 慢?

    最近 我对 Julia lang 很感兴趣 因为它声称是一种具有接近 C 性能的动态语言 然而 到目前为止我的经验并不好 至少在性能方面 我正在编写的应用程序需要随机访问特定的数组索引 然后将它们的值与其他特定的数组索引进行比较 经过多次迭
  • 返回 AJAX 调用数据的 JavaScript 函数 [重复]

    这个问题在这里已经有答案了 我想创建一个 JavaScript 函数 它返回 jQuery AJAX 调用的值 我想要这样的东西 function checkUserIdExists userid return ajax url theur
  • Spring 属性占位符不起作用

    我在 stackoverflow com 上读过类似的问题 但没有一个解决方案对我有帮助 我使用的配置如下 maven项目结构 这src main resources properties app properties file possi
  • angular.js 控制器作为使用 $template 缓存服务的语法模板绑定

    我之前已经使用过 Angular JS 但现在我在 Angular JS 中使用控制器作为语法 并且无法绑定模板 我的控制器代码 function angular module vkApp controller Feeds Feeds fu
  • 支持语音的 ASP.NET 应用程序

    我们正在开发一个 ASP NET Web 应用程序 该应用程序需要通过语音输入一些数据 用户可以使用普通用户界面输入一些数据 但是 我们需要一个附加功能 让他可以通过语音输入数据 我们可以修复语音命令 例如输入 value1 到 data1
  • Jooq、Spring 和 BoneCP 连接关闭两次错误

    我正在将 Spring 4 0 0 以及 jOOQ 3 2 0 和 BoneCP 0 8 0 用于 Web 应用程序 我的 PersistenceContext 配置与本指南相同 请浏览一下 代码有点太多 无法粘贴到此处 http www