【发布时间】:2012-02-08 08:03:58
【问题描述】:
我有多个线程试图更新 MySQL 数据库?使用 executeUpdate 方法是线程安全的吗?
【问题讨论】:
-
如果你有多个线程,你应该使用多个连接。就这么简单。
-
除了担心线程安全之外,可能还需要考虑并发数据库访问(事务)。
标签: java multithreading jdbc
我有多个线程试图更新 MySQL 数据库?使用 executeUpdate 方法是线程安全的吗?
【问题讨论】:
标签: java multithreading jdbc
不,使用它不是线程安全的。
实际上,如果某个其他线程使用了一个语句,然后另一个线程调用了executeUpdate(),那么其他线程的ResultSets,如果有的话,就会被关闭。 JavaDoc for java.sql.Statement (of which PreparedStatement is a subtype) "Statement 接口中的所有执行方法都会隐式关闭一个语句的当前 ResultSet 对象,如果存在打开的对象。"
此外,executeUpdate() 的给定实现不太可能被编写为多线程安全的。
您应该同步所有使用的语句和结果集,或者建立多个连接,以便每个线程使用自己的 JDBC Connection 到数据库。我推荐后者。
【讨论】:
考虑使用 synchronized 关键字创建更新方法,并考虑那里的并发线程死锁
【讨论】: