IS ResultSet线程安全

Vin*_*rge 3 java multithreading jdbc

ResultSet线程安全吗?

我的问题出现了,因为在我的程序中,我已经为每个查询使用了不同的语句,我已经将ResultSet声明为局部变量,但是在ResultSet关闭后,它给出了一个不允许的操作错误.但我的语句正在工作,因为我正在使用插入和删除查询中的语句.我已经评论了ResultSet部分,并没有得到错误!

Ste*_*n C 6

真正的问题是您在多个线程之间共享Statement对象.每次"执行"Statement时,先前返回的ResultSet将自动关闭.在这种情况下,ResultSet对象"属于"可能尚未使用它的其他线程.因此例外......

您不应在多个线程之间共享Connection,Statement/PreparedStatement或ResultSet对象.每个线程都应该获取并释放自己的资源.


duf*_*ymo 5

不,ResultSet 不应暴露给多个线程。

ResultSet 的范围永远不应大于单个方法:执行查询,将 ResultSet 映射到对象或集合,并在创建它的同一范围内关闭 ResultSet。

关闭 ResultSet 的正确方法是在它自己的 try/catch 中的 finally 块中。

查看您另一个问题中的代码。它需要一个严肃的、完整的重构。您遇到问题并不奇怪。以下是一些建议:

  1. 遵循 Sun Java 编码约定。这可能看起来微不足道,但任何使您的代码更难阅读的事情都是一个坏主意。您的“doComms”和“savetodatabase”类打破了“类名以大写字母开头”的约定。
  2. 命名很重要。“doComms”不是我认为的一个好的抽象概念。
  3. 神奇的数字/常数无处不在。它们会使您的代码以后更难更改。
  4. Java 是一种面向对象的语言;你完全是在用另一种风格写作。当我看到“插入studentinfo”时,我不知道Student 类在哪里。
  5. 您的 JDBC 代码根本无法正确处理资源。

只是好奇 - 您是否正在尝试学习如何编写服务器?是否有理由不使用 servlet 引擎作为此应用程序的基础?套接字是开始解决此类问题的非常低级的地方。