gpt4 book ai didi

java - 在同一线程中使用(强制)与同一数据库的第二个 JDBC 连接

转载 作者:行者123 更新时间:2023-11-30 06:19:18 26 4
gpt4 key购买 nike

我在 MySQL DB 查询中使用流式传输。工作正常,直到我在流式传输期间发出另一个查询。这是完全可以的,并在 java.sql.SQLException 中进行了解释:

Streaming result set com.mysql.jdbc.RowDataDynamic@16559dec is still active. No statements may be issued when any streaming result sets are open and in use on a given connection. Ensure that you have called .close() on any active streaming result sets before attempting more queries.

由于我真的想在流式传输过程中进行第二次查询,显然我只需要使用另一个数据库连接即可。

那么如何强制在同一线程中使用另一个连接?

我正在使用 Spring Data 和 Hibernate

不要建议一次获取所有内容或分页,这不是问题的重点。

编辑:

程序流程:

  • 使用流运行查询(使用连接 1)
  • 对于流中的每一行
    • 在数据库上执行某些操作(使用连接 2)
  • 流式传输结束,连接 1 关闭

最佳答案

所以 1 个线程 { 1. 打开 conn, 2 - 8. 异步流, 9. 关闭 conn }, { 3. 打开或使用 conn, 4. 查询, 9. 关闭或跳过 }??

如果流足够短,请尝试使用连接池

否则,大流最好作为文件名存储在数据库中(例如使用 UUID 来生成文件名)。然后,可以在数据库外部完成流式传输,并且您可以限制流式传输以阻止自制的拒绝服务。

<小时/>

重新编辑问题后。

所以场景是:

void f() {
open conn
do a java 8 stream
g()
close conn
}

void g() {
open conn
...
close conn
}

这是可能的,有多种处理方式:使用单个全局连接、使用连接池、事务性或非 cq。自动提交。

对于查询,我认为最重要的是关闭事物。尝试使用资源是不泄漏资源的理想选择。

try (Connection conn = ...) {
...
try (PreparedStatement stm = conn.prepareStatement(sql)) {
...
try (ResultSet rs = stm.executeQuery()) {
... the stream
}
}
}

上面还关闭了 ResultSet,这可能会给您带来麻烦。

也可以想象你传递流,它可以访问结果集。由于 Stream 也是 AutoCloseable,因此您可能需要调整那里的代码。或者使用 CachedRowSet 而不是 ResultSet。

很抱歉这个不确定的答案。

关于java - 在同一线程中使用(强制)与同一数据库的第二个 JDBC 连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48519983/

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