我还是一名本科生,只是在做兼职,所以我总是试图了解更好的做事方法。最近,我必须编写一个工作程序,其中程序的主线程将生成“任务”线程(对于每个数据库“任务”记录),该线程将执行一些操作,然后更新记录以表明它已完成。因此,我需要 ThreadedTask 对象中的或可用的数据库连接对象和PreparedStatement 对象。
这大致就是我最终写的内容,正在创建一个PreparedStatement
每个线程对象浪费吗?我以为静态PreparedStatments
可以创造竞争条件...
Thread A stmt.setInt();
Thread B stmt.setInt();
Thread A stmt.execute();
Thread B stmt.execute();
A 的版本永远不会被执行..
这个线程安全吗?正在创造和毁灭PreparedStatement
总是相同的对象不是一种巨大的浪费吗?
public class ThreadedTask implements runnable {
private final PreparedStatement taskCompleteStmt;
public ThreadedTask() {
//...
taskCompleteStmt = Main.db.prepareStatement(...);
}
public run() {
//...
taskCompleteStmt.executeUpdate();
}
}
public class Main {
public static final db = DriverManager.getConnection(...);
}
我认为在线程之间共享数据库连接(和准备好的语句)不是一个好主意。 JDBC 不要求连接是线程安全的,而且我希望大多数驱动程序都不是线程安全的。
为每个线程提供自己的连接(或在每个查询的连接上进行同步,但这可能违背了拥有多个线程的目的)。
创建和销毁始终相同的PreparedStatement对象不是一种巨大的浪费吗?
并不真地。大部分工作发生在服务器上,如果您使用相同的 SQL 语句,这些工作将被缓存并重新使用。一些 JDBC 驱动程序还支持语句缓存,因此甚至可以重用客户端语句句柄。
不过,通过使用批量查询而不是(或除了)多线程,您可以看到显着的改进。准备一次查询,然后针对单个大批次中的大量数据运行该查询。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)