使用相同的语句对象在多个线程中执行多个查询?
Posted
技术标签:
【中文标题】使用相同的语句对象在多个线程中执行多个查询?【英文标题】:using same statement object to execute multiple queries in multiple threads? 【发布时间】:2014-08-07 07:54:08 【问题描述】:重复使用 java.sql.Statement 对象来在多个线程中同时执行多个查询是个好主意吗?
我在某处读到建议重用相同的语句对象,但它是顺序执行。
Statement statement = con.createStatement();
现在,如果我使用这个单语句实例来运行executeUpdate()
以在多个线程中同时进行多个查询?
请注意,它不是 PreparedStatement,我没有得到任何 ResultSet。
我认为答案取决于两种情况:
-
如果查询是互斥的,那么应该没问题。
如果查询处理的是同一组数据,则可能存在问题。
我的理解正确吗?
谢谢。
【问题讨论】:
【参考方案1】:不,这绝对不是一个好主意。一方面,ResultSets
与 Statement
相关联。当另一个线程突然进行新查询时,您不希望遍历ResultSet
(至少如果驱动程序表现良好,ResultSet
将被关闭)。
也没有任何迹象表明Statements
是线程安全的。如果没有明确指出,它就不是线程安全的(至少在大多数情况下)。
【讨论】:
谢谢。如果它不是 PreparedStatement 并且没有 ResultSet 怎么办?只是更新、删除、插入查询,而且这些查询是互斥的? @Kayaman:正如你自己所说,没有线程安全保证,所以在 并发场景。那时甚至没有“旧”的定义。除了所有其他可能的行为,一个线程可能会收到另一个线程查询的ResultSet
。
@ankur:只是不要这样做。当使用多个Statement
s 时,甚至不能保证 JDBC 驱动程序支持多线程。您必须研究特定驱动程序的文档才能了解它的多线程功能。以上是关于使用相同的语句对象在多个线程中执行多个查询?的主要内容,如果未能解决你的问题,请参考以下文章
使用 postgres 和 node js 在单个语句中执行多个查询