IS ResultSet线程安全

时间:2010-05-08 13:07:34

标签: java multithreading jdbc

ResultSet线程安全吗?

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

3 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:4)

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

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

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

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

  1. 遵循Sun Java编码约定。这看起来似乎微不足道,但任何使你的代码更难阅读的东西都是一个坏主意。您的“doComms”和“savetodatabase”类打破了“类名以大写字母开头”的惯例。
  2. 命名很重要。 “doComms”不是我对良好抽象的想法。
  3. 魔术数字/常数无处不在。他们会让你的代码以后更难改变。
  4. Java是一种面向对象的语言;你正在写另一种风格。当我看到“插入studentinfo”时,它让我想知道学生班的位置。
  5. 您的JDBC代码根本无法正确处理资源。
  6. 好奇 - 您是否正在尝试学习如何编写服务器?您有没有理由不使用servlet引擎作为此应用程序的基础?套接字是一个非常低级别的地方,可以开始解决这样的问题。

答案 2 :(得分:2)

我编写手工编写JDBC的次数很少,但它既丑陋又容易出错。当然,这可能只是我,但使用Spring JDBC data access类可能会有更好的结果。您不必使用整个spring容器,只需使用DataSource和spring的JdbcTemplate类。

它强制使用JDBC的使用模式,它既是线程安全的,也是资源安全的。