Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
多线程-MySQL java连接器准备语句的使用_Java_Mysql_Multithreading_Prepared Statement - Fatal编程技术网

多线程-MySQL java连接器准备语句的使用

多线程-MySQL java连接器准备语句的使用,java,mysql,multithreading,prepared-statement,Java,Mysql,Multithreading,Prepared Statement,我创建了一个java类,它在自己的线程中运行,通过mysql查询队列工作,这样就不会阻塞主应用程序线程。我想使用preparedstatement,但是如果我继续重用相同的preparedstatement,那么如果队列中有两个或多个相同的preparedstatement(我对该类型的每个查询使用相同的preparedstatement对象),它将具有错误的参数。如果我每次都创建一个新的preparedstatement,它会在每次运行时重新编译preparedstatement,还是会检测到

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

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

这取决于DBMS,而不是Java,但总体思路是它可以检测对现有编译语句的重用,并将它们集中在引擎盖下,无论是在驱动程序中还是在服务器上。请参阅JDBC4.0规范,#11.6,“按池重用语句”
连接“

来自java教程

如果要多次执行语句对象,通常使用PreparedStatement对象可以缩短执行时间

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


我认为您真的无法利用Java连接池实现(如ApacheDBCP)中提供的预置语句池功能。这是因为您正在队列中存储准备好的语句对象。如果您可以将SQL和参数存储在自定义类中,并在执行线程中创建/执行PreparedStatements,那么您可以通过使用类似DBCP的方法获得池的好处


请参见如何启用语句池(poolPreparedStatements)

这正是我最终要做的。