2011-11-15 29 views
1

我做了一个java类,它运行在它自己的线程中,通过mysql查询队列工作,以便它不会阻塞主应用程序线程。我想使用预准备语句,但是如果我继续重复使用相同的准备好的语句,那么如果队列中有两个或多个相同的准备语句(对于每种类型的查询使用相同的准备语句对象),它将会出错PARAMS。如果我每次创建一个新的预编译语句,每次都会重新编译准备好的语句,或者它会检测到它已经被编译并执行?多线程 - MySQL java连接器准备语句使用

回答

2

我觉得你真的不会成为能够利用预处理语句缓冲池在Java中连接池的实现,如Apache DBCP可用功能。这是因为您正在将准备好的语句对象存储在队列中。如果你能存储你的SQL和paramenters在自定义类代替,并创建/执行中的执行线程的PreparedStatement,你可以通过使用类似DBCP

参见如何启用语句池(poolPreparedStatements)DBCP configurations docs得到统筹的好处

+0

这几乎是我最终做的。 –

1

它会在每次运行时重新编译准备好的语句,还是会检测到它已经被编译并执行?

它是由数据库管理系统,而不是Java,但总的想法是,它可以检测到引擎盖下的现有编译声明和水池他们的重用,无论是在驱动程序或服务器。请参阅JDBC 4.0规范#11.6“通过池连接的语句的重用”。

0

Java教程

如果要执行Statement对象多次,通常降低了使用PreparedStatement对象,而不是执行时间。

PreparedStatement对象的主要特征是,与Statement对象不同,它在创建时会被赋予一个SQL语句。这样做的好处是,在大多数情况下,这个SQL语句会立即发送到DBMS,在那里编译它。因此,PreparedStatement对象不仅包含一条SQL语句,还包含一条预编译的SQL语句。这意味着当PreparedStatement被执行时,DBMS可以直接运行PreparedStatement SQL语句,而不必先编译它。

http://docs.oracle.com/javase/tutorial/jdbc/basics/prepared.html#supply_values_ps