Tomcat JDBC 连接池问题:“语句已关闭”

2023-12-13

我有一个使用 Tomcat JDBC 连接池的服务器应用程序。

这是我用来创建数据源的代码:

PoolProperties connProperties = new PoolProperties();
connProperties.setUrl(resources.getProperty("db.url"));
connProperties.setDriverClassName(resources.getProperty("db.driver"));
connProperties.setUsername(resources.getProperty("db.user"));
connProperties.setPassword(resources.getProperty("db.password"));
connProperties.setJmxEnabled(true);
connProperties.setTestWhileIdle(false);
connProperties.setValidationQuery("SELECT 1");
connProperties.setTestOnReturn(false);
connProperties.setValidationInterval(30000);
connProperties.setTimeBetweenEvictionRunsMillis(30000);
connProperties.setMaxActive(500);
connProperties.setInitialSize(50);
connProperties.setMaxWait(10000);
connProperties.setRemoveAbandonedTimeout(60);
connProperties.setMinEvictableIdleTimeMillis(60000);
connProperties.setSuspectTimeout(60);
connProperties.setMaxIdle(50);
connProperties.setMinIdle(10);
connProperties.setLogAbandoned(false);
connProperties.setRemoveAbandoned(true);
connProperties.setJdbcInterceptors("org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;"+
"org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer");

dataSource = new DataSource();
dataSource.setPoolProperties(connProperties); 

然后我有一个从池中获取连接的方法

protected Connection getDbConnection() throws Exception
{
    dbConn = dataSource.getConnection();
    return dbConn;
}

每次我想执行一条语句时,我都会调用以下代码:

protected CallableStatement executeCSqlQuery(String sql) throws Exception
{
    CallableStatement cstmt;
    ResultSet rs = null;

    try {
        cstmt = getDbConnection().prepareCall(sql);     
        cstmt.execute();            
    } catch (SQLException e) {
        throw e;
    }

    return cstmt;
}

这是调用前面代码的示例:

try {
    cstmt = dbConnection.executeCSqlQuery(query);
    rs = cstmt.getResultSet();
} catch (Exception e) {
    // do smething
} finally {
    try {
        if (cstmt != null) {
            cstmt.close();
        }
        dbConnection.shutdown();
    } catch (Exception e) {
        // do something
    }
}

public void shutdown() {
    if (this.dbConn != null) 
        this.dbConn.close();
}

我面临的问题是,当我每 X 秒在线程中执行一次调用时,我会时不时地收到异常“语句已关闭”。 我不知道为什么会发生这种情况。我认为这可能是驱动程序错误或数据库连接失败(在不同的服务器中运行)。

我没主意了。我缺少什么?

我应该使用c3p0而是连接池?


我设立了赏金来帮助雷兹尼克,但我最终通过查看他的代码找出了问题所在。

问题是每次从池中获取新连接时

protected Connection getDbConnection() throws Exception
{
    dbConn = dataSource.getConnection();
    return dbConn;
}

物体dbConn已更新为新连接。

Example:

T1调用getDbConnection()

T2调用getDbConnection()

T1执行查询,处理resultSet并打电话shutdown()

public void shutdown() {
    if (this.dbConn != null) 
        this.dbConn.close();
}

Because T2更新了对象,正在使用的连接T2将被关闭T1

T2尝试使用该连接,但该连接已关闭。

这样,不必总是更新连接,只需返回它,然后添加额外的逻辑来关闭从池中获取的连接。

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

Tomcat JDBC 连接池问题:“语句已关闭” 的相关文章

  • Java Swing:从 JOptionPane 获取文本值

    我想创建一个用于 POS 系统的新窗口 用户输入的是客户拥有的金额 并且窗口必须显示兑换金额 我是新来的JOptionPane功能 我一直在使用JAVAFX并且它是不同的 这是我的代码 public static void main Str
  • 如何默认将 Maven 插件附加到阶段?

    我有一个 Maven 插件应该在编译阶段运行 所以在项目中consumes我的插件 我必须做这样的事情
  • 如何使用 SparkR 1.6.0 写入 JDBC 源?

    使用 SparkR 1 6 0 我可以使用以下代码从 JDBC 源读取数据 jdbc url lt jdbc mysql localhost 3306 dashboard user
  • 如何找到给定字符串的最长重复子串

    我是java新手 我被分配寻找字符串的最长子字符串 我在网上研究 似乎解决这个问题的好方法是实现后缀树 请告诉我如何做到这一点或者您是否有任何其他解决方案 请记住 这应该是在 Java 知识水平较低的情况下完成的 提前致谢 附 测试仪字符串
  • Android:捕获的图像未显示在图库中(媒体扫描仪意图不起作用)

    我遇到以下问题 我正在开发一个应用程序 用户可以在其中拍照 附加到帖子中 并将图片保存到外部存储中 我希望这张照片也显示在图片库中 并且我正在使用媒体扫描仪意图 但它似乎不起作用 我在编写代码时遵循官方的Android开发人员指南 所以我不
  • JavaMail 只获取新邮件

    我想知道是否有一种方法可以在javamail中只获取新消息 例如 在初始加载时 获取收件箱中的所有消息并存储它们 然后 每当应用程序再次加载时 仅获取新消息 而不是再次重新加载它们 javamail 可以做到这一点吗 它是如何工作的 一些背
  • Mockito when().thenReturn 不必要地调用该方法

    我正在研究继承的代码 我编写了一个应该捕获 NullPointerException 的测试 因为它试图从 null 对象调用方法 Test expected NullPointerException class public void c
  • 十进制到八进制的转换[重复]

    这个问题在这里已经有答案了 可能的重复 十进制转换错误 https stackoverflow com questions 13142977 decimal conversion error 我正在为一个类编写一个程序 并且在计算如何将八进
  • 禁止的软件包名称:java

    我尝试从数据库名称为 jaane 用户名 Hello 和密码 hello 获取数据 错误 java lang SecurityException Prohibited package name java at java lang Class
  • Java按日期升序对列表对象进行排序[重复]

    这个问题在这里已经有答案了 我想按一个参数对对象列表进行排序 其日期格式为 YYYY MM DD HH mm 按升序排列 我找不到正确的解决方案 在 python 中使用 lambda 很容易对其进行排序 但在 Java 中我遇到了问题 f
  • 加密 JBoss 配置中的敏感信息

    JBoss 中的标准数据源配置要求数据库用户的用户名和密码位于 xxx ds xml 文件中 如果我将数据源定义为 c3p0 mbean 我会遇到同样的问题 是否有标准方法来加密用户和密码 保存密钥的好地方是什么 这当然也与 tomcat
  • 如何在 javadoc 中使用“<”和“>”而不进行格式化?

    如果我写
  • 在 Mac 上正确运行基于 SWT 的跨平台 jar

    我一直致力于一个基于 SWT 的项目 该项目旨在部署为 Java Web Start 从而可以在多个平台上使用 到目前为止 我已经成功解决了由于 SWT 依赖的系统特定库而出现的导出问题 请参阅相关thread https stackove
  • 仅将 char[] 的一部分复制到 String 中

    我有一个数组 char ch 我的问题如下 如何将 ch 2 到 ch 7 的值合并到字符串中 我想在不循环 char 数组的情况下实现这一点 有什么建议么 感谢您花时间回答我的问题 Use new String value offset
  • 如何在桌面浏览器上使用 webdriver 移动网络

    我正在使用 selenium webdriver 进行 AUT 被测应用程序 的功能测试自动化 AUT 是响应式网络 我几乎完成了桌面浏览器的不同测试用例 现在 相同的测试用例也适用于移动浏览器 因为可以从移动浏览器访问 AUT 由于它是响
  • 玩!框架:运行“h2-browser”可以运行,但网页不可用

    当我运行命令时activator h2 browser它会使用以下 url 打开浏览器 192 168 1 17 8082 但我得到 使用 Chrome 此网页无法使用 奇怪的是它以前确实有效 从那时起我唯一改变的是JAVA OPTS以启用
  • 声明的包“”与预期的包不匹配

    我可以编译并运行我的代码 但 VSCode 中始终显示错误 早些时候有一个弹出窗口 我不记得是什么了 我点击了 全局应用 从那以后一直是这样 Output is there but so is the error The declared
  • simpleframework,将空元素反序列化为空字符串而不是 null

    我使用简单框架 http simple sourceforge net http simple sourceforge net 在一个项目中满足我的序列化 反序列化需求 但在处理空 空字符串值时它不能按预期工作 好吧 至少不是我所期望的 如
  • 获取 JVM 上所有引导类的列表?

    有一种方法叫做findBootstrapClass对于一个类加载器 如果它是引导的 则返回一个类 有没有办法找到类已经加载了 您可以尝试首先通过例如获取引导类加载器呼叫 ClassLoader bootstrapLoader ClassLo
  • Spring Boot @ConfigurationProperties 不从环境中检索属性

    我正在使用 Spring Boot 1 2 1 并尝试创建一个 ConfigurationProperties带有验证的bean 如下所示 package com sampleapp import java net URL import j

随机推荐

  • 使用seaborn.swarmplot 将数据点映射到颜色图

    我想生成一个seaborn swarmplot 其中单个数据点的颜色映射到颜色图 我有一个与此类似的数据框 In 48 df Out 48 a c Key 0 1 12 1st 1 4 35 2nd 2 5 12 2nd 3 6 46 1s
  • Angular 2 ng 模块导入

    当我们在顶部导入文件时 导入 ngmodule 装饰器的元数据有什么意义 两个输入之间的差异 这些导入是完全不同的概念 文件顶部的导入是 TypeScript 导入 以使当前文件已知的类 接口和变量 与 Angular2 无关 The Ng
  • Android中使用WallpaperManager设置壁纸

    以下是我的代码 我想使用壁纸管理器设置为壁纸 我在用着通用图像加载器 但我不知道如何实现壁纸管理器 我的 setWall 不起作用 有点令人困惑 import android graphics Bitmap import android o
  • 智能编译器是否可以在不成为语言一部分的情况下完成 std​​::move 所做的所有事情?

    这是一个有点理论上的问题 但是尽管我对 std move 有一些基本的了解 但我仍然不确定它是否为该语言提供了一些理论上无法通过超级智能编译器实现的附加功能 我知道这样的代码 std string s1 STL std string s2
  • Google 表格 - 将某个范围内的值重复“n”次

    I am trying to execute the following in google sheets by repeating certain cell values from a range of cells number of r
  • 无需连接即可获取 WiFi 的 SSID?

    我想连接到SSID应用程序中的 wifi 网络 Code WifiConfiguration conf new WifiConfiguration conf SSID networkSSID 但问题是我不知道network SSID 如何获
  • Flow 无法识别回调内的细化

    此代码通过了流程检查 flow function test list Array
  • 带有相应归属链接的随机背景图片?

    我有一个页面显示 5 张图像数组中的随机背景图像 我还想在页面底部提供该图像的适当归属链接 但我不确定如何使用 javascript 或 php 执行此操作 这就是我现在所拥有的
  • 隐式复制构造函数/赋值运算符的行为

    我有一个关于 C 标准的问题 假设您有一个带有用户定义的复制构造函数和赋值运算符的基类 派生类使用编译器生成的隐式类 派生类的复制 赋值是否调用用户定义的复制构造函数 赋值运算符 或者您是否需要实现调用基类的用户定义版本 感谢您的帮助 如果
  • R 基于应用于多列的多个部分字符串过滤行

    数据集样本 diag01 lt as factor c S7211 J47 J47 K729 M2445 Z509 Z488 R13 L893 N318 L0311 S510 A047 D649 diag02 lt as factor c
  • 序列化对象时忽略继承的类

    当我从一个类继承并序列化新类时 我获得了所有属性 我怎样才能防止这种情况发生 我无法控制我继承的类 所以我无法向其属性添加属性 XmlIgnore Example class A public string PropertyA get se
  • 用单个字符初始化字符串

    我想初始化一个std string具有单个字符 以下代码不起作用 int main string s c cout lt
  • 如何在asp.net core 3中设置json序列化器设置?

    旧版 ASP NET Core 应用程序的 json 序列化器设置是通过添加AddMvc AddJsonOptions 但我不使用AddMvc in asp net core 3 那么如何设置全局 json 序列化设置呢 AddMvc返回一
  • java中会话超时删除cookie

    我正在开发一个java web应用程序 我已经在其中配置了session timeout等于 4 分钟 此应用程序也使用 cookie 我的问题是 4 分钟不活动后 HttpSession 过期 但 cookie 仍保留在浏览器中 年龄设置
  • VBA:文本框新/下一行

    我的文本框需要一些帮助 我的文本框内容由单元格值提供 现在单元格值的构造如下 日期注释 并且它逐渐发生 我可以有多个这样的条目 基本上 我希望我的文本框将每个值显示为用户表单中文本框中的单行 使它们看起来像项目符号列表 这可能吗 我正在考虑
  • 带有 Material ui 和 Reactjs 的嵌套侧边栏菜单

    我正在尝试使用 Material ui 开发一个侧边栏菜单 我可以制作简单的列表 在我的项目中 我需要嵌套侧边栏菜单 但我无法实现 如果我尝试使用递归函数 它仅提供主标题菜单 而不呈现子元素 请帮我开发它 嵌套侧边栏菜单的代码如下 impo
  • 在 Apache Web 服务器上部署 Angular 4 应用程序

    我想在我的 Apache Web 服务器上部署我的 Angular 应用程序 我已经添加了一个 htaccess文件到我的 var www html文件夹中 我尝试了几个base hrefs 但和很多人一样 我在路由方面也遇到了问题 我只能
  • wp7 枢轴控制设置标题为空

    对于 PivotControl 我使用这样的代码将 Title 和 Header 属性设置为 null 但数据透视控件仍然在 Header 中显示一个字符串 其中包含为该 PivotItem 绑定的对象的名称 我想基本上隐藏 PivotIt
  • TikZ 中节点名称的模算术?

    假设我想在 TikZ 中构建一个循环图 具有可变数量的节点 标记为 v0 v1 v n 1 用于我选择的某个 n 例如 5 我希望能够使用 TikZ 中的 foreach 命令迭代地 1 定义节点 以及 2 连接节点 比方说 我希望能够将
  • Tomcat JDBC 连接池问题:“语句已关闭”

    我有一个使用 Tomcat JDBC 连接池的服务器应用程序 这是我用来创建数据源的代码 PoolProperties connProperties new PoolProperties connProperties setUrl reso