繁体   English   中英

多线程 - MySQL java连接器编写语句使用

[英]Multithreading - MySQL java connector prepared statement use

我创建了一个java类,它运行在它自己的线程中,该线程通过mysql查询队列工作,这样它就不会阻塞主应用程序线程。 我想使用预处理语句,但是,如果我继续重复使用相同的预处理语句,那么如果队列中有两个或多个相同的预处理语句(对于该类型的每个查询,我都使用相同的preparestatement对象),它将有错误的提示PARAMS。 如果我每次创建一个新的preparestatement它会在每次运行时重新编译准备好的语句,还是会检测到它已经被编译并执行了?

我认为您真的无法利用Apache DBCP等Java连接池实现中提供的Prepared Statement Pooling功能。 这是因为您将准备好的语句对象存储在队列中。 如果您可以将SQL和参数存储在自定义类中,并在执行线程中创建/执行PreparedStatements,您可以通过使用DBCP之类的东西获得池化的好处

请参阅有关如何启用语句池的DBCP配置文档 (poolPreparedStatements)

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

这取决于DBMS,而不是Java,但是总体思路是,它可以检测现有编译语句的重用,并将其合并到驱动程序或服务器中。 请参见JDBC 4.0规范#11.6“池连接的语句重用”。

来自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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM