gpt4 book ai didi

java - JDBC 不需要的语句关闭

转载 作者:行者123 更新时间:2023-12-03 12:57:59 24 4
gpt4 key购买 nike

我有一个 Java JDBC 应用程序,它使用多个线程从 Oracle 数据库中检索信息。每个线程 si 应该定期执行一个语句,该语句在特定表上执行选择(表对于每一行都是不同的)。

线程是扩展 Thread 类的类的实例。此类有一个私有(private)变量,用于存储与数据库的连接。该线程还有一个子线程,它通过语句定期从表中删除一些信息。

当我运行单个线程(从单个表中获取数据)时,它运行良好,但是当我运行多个线程(试图从多个表中获取数据)时,我收到一个错误,提示我的语句在打印整个结果集之前已关闭由该语句生成。

我的问题是:

为什么另一个线程关闭了我的语句?
为什么子线程不关闭父线程语句?
我能做些什么来防止这种情况发生?

我希望有人能帮帮忙。
康斯坦丁

我不使用连接池,因为 eacht 线程上的连接永久保持打开状态,因为我每 20 毫秒执行一次 select 语句,而 cild 线程(有自己的连接)每 10 秒执行一次删除语句。

我无法将数据存储在数组中,因为一旦我检索到它,我就必须将它发送到 API 进行处理。

我无法理解。每个线程都是该类的一个不同实例(除了用于连接又名用户、密码的那些参数之外,具有不同的参数)(女巫没有任何静态),但彼此关闭语句。

每个线程都有自己的连接对象和自己的语句和结果集对象。它应该是线程安全的

这是一个代码示例

stmt = conn.createStatement();
rs = stmt.executeQuery(query);
while (rs.next()) {
//some processing
}
stmt.close();

conn 变量是一个连接,是在 thrad 的构造函数中创建的,这可能是问题吗?

新编辑

我已经将我的连接对象包装在一个包装器类中,并将其扩展为两个不同的连接包装器类,一个由执行选择语句的线程使用,一个由执行删除语句的线程使用。
我不会在声明后关闭我的连接,因为它效率低下,但我确实关闭了satement
我在线程之间没有任何共享对象,因为我不需要任何对象。每个线程使用不同的语句对象和不同的结果集从不同的表中选择数据并将其传递给 API。
使用连接池意味着重新考虑我的整个应用程序,但如果没有其他解决方案出现,我将不得不这样做。

谢谢你的帮助,如果我听起来很固执,很抱歉,很抱歉从一开始就没有更清楚地表达自己

最佳答案

如果您确保不在线程之间共享状态,则无需担心同步。

  • 使用连接池 .在执行每个数据库语句之前,从池中检索一个连接。即使您每秒获取和释放 50 次连接,与数据库的连接仍将由池保持打开状态,并且仅当多个线程同时需要数据库连接时才需要新连接。我建议你看看DBCP它很好地实现了健壮、线程安全和灵活的数据库连接池。
  • 使用局部变量 确保连接的范围意味着它只对当前线程可见。
  • 始终关闭连接 (或将它们释放回池中)当您完成数据库语句执行时。在您的 JDBC 代码周围使用 finally block 来执行此操作。
  • 在创建语句时,再次确保它们是本地的,以便它们的范围仅对当前线程可见。
  • 始终关闭语句 当您在 finally block 中完成它们时。
  • public Data getMyData() {
    Connection conn = null;
    Statement statement = null;
    try {
    conn = ConnectionPool.getConnection();
    statement conn.prepareStatement("select mydata from mytable");
    //execute statement, get results
    //return Data
    }finally{
    if (statement != null) statement.close();
    if (conn != null) conn.close(); //release the connection back to the pool
    }
    }

    只要您的连接池是线程安全的,这段代码也应该是线程安全的,因为您永远不会在线程之间共享连接或语句。

    关于java - JDBC 不需要的语句关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1199737/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com