使用相同的语句对象在多个线程中执行多个查询?

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】:

不,这绝对不是一个好主意。一方面,ResultSetsStatement 相关联。当另一个线程突然进行新查询时,您不希望遍历ResultSet(至少如果驱动程序表现良好,ResultSet 将被关闭)。

也没有任何迹象表明Statements 是线程安全的。如果没有明确指出,它就不是线程安全的(至少在大多数情况下)。

【讨论】:

谢谢。如果它不是 PreparedStatement 并且没有 ResultSet 怎么办?只是更新、删除、插入查询,而且这些查询是互斥的? @Kayaman:正如你自己所说,没有线程安全保证,所以在 并发场景。那时甚至没有“旧”的定义。除了所有其他可能的行为,一个线程可能会收到另一个线程查询的ResultSet @ankur:只是不要这样做。当使用多个Statements 时,甚至不能保证 JDBC 驱动程序支持多线程。您必须研究特定驱动程序的文档才能了解它的多线程功能。

以上是关于使用相同的语句对象在多个线程中执行多个查询?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用相同的语句和结果集运行多个选择查询? [复制]

使用 postgres 和 node js 在单个语句中执行多个查询

SQL查询语句查询多个数据

使用java语句类的单个execute()方法执行多个hive查询

Hibernate hql,在同一个查询中执行多个更新语句

如何在一个 PostgreSQL 查询中使用多个 WITH 语句?