ResultSet线程安全吗?
我的问题出现了,因为在我的程序中,我已经为每个查询使用了不同的语句,我已经将ResultSet声明为局部变量,但它在ResultSet关闭后给出了一个不允许的操作错误。但我的语句正在工作,因为我正在使用插入和删除查询中的语句。我已经评论了ResultSet部分,并没有得到错误!!
答案 0 :(得分:6)
真正的问题是您在多个线程之间共享Statement对象。每次“执行”Statement时,先前返回的ResultSet将自动关闭。在这种情况下,ResultSet对象“属于”可能尚未使用它的其他线程。因此例外......
您不应在多个线程之间共享Connection,Statement / PreparedStatement或ResultSet对象。每个线程都应该获取并释放自己的资源。
答案 1 :(得分:4)
不,不应将ResultSet暴露给多个线程。
ResultSet的范围绝不应大于单个方法:执行查询,将ResultSet映射到对象或集合,并在创建它的同一范围内关闭ResultSet。
关闭ResultSet的正确方法是在自己的try / catch中的finally块中。
查看其他问题中的代码。它需要一个严肃,完整的重构。你遇到问题并不奇怪。以下是一些建议:
好奇 - 您是否正在尝试学习如何编写服务器?您有没有理由不使用servlet引擎作为此应用程序的基础?套接字是一个非常低级别的地方,可以开始解决这样的问题。
答案 2 :(得分:2)
我编写手工编写JDBC的次数很少,但它既丑陋又容易出错。当然,这可能只是我,但使用Spring JDBC data access类可能会有更好的结果。您不必使用整个spring容器,只需使用DataSource和spring的JdbcTemplate类。
它强制使用JDBC的使用模式,它既是线程安全的,也是资源安全的。