Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/354.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
Java 没有bind变量的PreparedStatement会影响性能吗?_Java - Fatal编程技术网

Java 没有bind变量的PreparedStatement会影响性能吗?

Java 没有bind变量的PreparedStatement会影响性能吗?,java,Java,如果我不在准备好的语句中使用绑定变量,性能会降低吗 考虑下面的例子: String selectSQL = "SELECT USER_ID, USERNAME FROM DBUSER WHERE USER_ID = '101'"; PreparedStatement preparedStatement = dbConnection.prepareStatement(selectSQL); 据我所知,低于一个更好。 它防止sql注入 String selectSQL = "SELECT

如果我不在准备好的语句中使用绑定变量,性能会降低吗

考虑下面的例子:

String selectSQL = "SELECT USER_ID, USERNAME FROM DBUSER WHERE USER_ID = '101'";
PreparedStatement preparedStatement =     dbConnection.prepareStatement(selectSQL);
据我所知,低于一个更好。 它防止sql注入

String selectSQL = "SELECT USER_ID, USERNAME FROM DBUSER WHERE USER_ID = ?";

问这个问题是因为我的一个项目在所有的查询中都有硬编码的字符串文本,即使他们使用的是准备好的语句。

准备好的语句只意味着你“准备”了语句。这意味着您将其发送到数据库,并让数据库已经解析/编译该语句。这对于经常执行的语句很有用

参数化语句通常执行多次,因此它们有时与准备好的语句相关联(您只需发送值,服务器将有一个已编译的语句准备执行查询)

但是,即使使用经常执行的“静态”语句,您也可以从准备语句中获益(特别是对于“复杂”语句)。使用的另一种技术是在存储过程中实现查询。这样,查询就已经编译好了,服务器只需要在运行存储过程调用时编译它

只有在您不取消准备stamenent(例如,在关闭连接时)的情况下,它才会起作用。因此,您可能需要一个池和一个预处理语句缓存,以避免预处理语句请求使服务器溢出(预处理语句需要服务器端的资源)


参数化查询还用于防止sql注入(因为它基于数据类型而不是字符串)。然而,这与准备好的陈述的好处是正交的。(请注意,您的两个查询都不会暴露于sql注入)

准备好的语句只表示您“准备”了该语句。这意味着您将其发送到数据库,并让数据库已经解析/编译该语句。这对于经常执行的语句很有用

参数化语句通常执行多次,因此它们有时与准备好的语句相关联(您只需发送值,服务器将有一个已编译的语句准备执行查询)

但是,即使使用经常执行的“静态”语句,您也可以从准备语句中获益(特别是对于“复杂”语句)。使用的另一种技术是在存储过程中实现查询。这样,查询就已经编译好了,服务器只需要在运行存储过程调用时编译它

只有在您不取消准备stamenent(例如,在关闭连接时)的情况下,它才会起作用。因此,您可能需要一个池和一个预处理语句缓存,以避免预处理语句请求使服务器溢出(预处理语句需要服务器端的资源)


参数化查询还用于防止sql注入(因为它基于数据类型而不是字符串)。然而,这与准备好的陈述的好处是正交的。(注意,您的两个查询都不会暴露于sql注入)

使用参数是否更有效主要取决于您的用例。当您监控语句的准备和执行所花费的时间时,您会注意到,语句的准备有时比实际执行要昂贵得多,因此这取决于您是否可以节省准备时间

在这种情况下,您将始终获胜:

PreparedStatement stmt = dbConnection.prepareStatement(...);
stmt.setInt(1, x);
stmt.executeQuery();
...
stmt.setInt(1, y);
stmt.executeQuery();
...
因为你节省了准备时间。这是独立于DBMS的

一些数据库管理系统执行一些服务器端缓存。他们做什么和如何做是高度供应商的,甚至是版本特定的。但是,我们了解到,在Oracle DBMS中,经常使用的参数化语句在这种情况下有时会获得相当大的加速:

PreparedStatement stmt = dbConnection.prepareStatement(...);
stmt.setInt(1, x);
stmt.executeQuery();
...
PreparedStatement stmt2 = dbConnection.prepareStatement(...);
stmt2.setInt(1, y);
stmt2.executeQuery();
...
在这里,服务器能够识别出这两条语句本质上是相同的,并且第二条语句的准备时间显著减少。这不适用于固定字符串语句,因为服务器无法确定它们是否相同


我认为,您不会发现这样一种情况,即使用参数化语句比使用固定字符串语句更慢,但在许多情况下,情况正好相反。

使用参数是否更有效主要取决于您的用例。当您监控语句的准备和执行所花费的时间时,您会注意到,语句的准备有时比实际执行要昂贵得多,因此这取决于您是否可以节省准备时间

在这种情况下,您将始终获胜:

PreparedStatement stmt = dbConnection.prepareStatement(...);
stmt.setInt(1, x);
stmt.executeQuery();
...
stmt.setInt(1, y);
stmt.executeQuery();
...
因为你节省了准备时间。这是独立于DBMS的

一些数据库管理系统执行一些服务器端缓存。他们做什么和如何做是高度供应商的,甚至是版本特定的。但是,我们了解到,在Oracle DBMS中,经常使用的参数化语句在这种情况下有时会获得相当大的加速:

PreparedStatement stmt = dbConnection.prepareStatement(...);
stmt.setInt(1, x);
stmt.executeQuery();
...
PreparedStatement stmt2 = dbConnection.prepareStatement(...);
stmt2.setInt(1, y);
stmt2.executeQuery();
...
在这里,服务器能够识别出这两条语句本质上是相同的,并且第二条语句的准备时间显著减少。这不适用于固定字符串语句,因为服务器无法确定它们是否相同


我认为,您不会发现这样一种情况,即使用参数化语句比使用固定字符串语句更慢,但在许多情况下,情况正好相反。

这两种查询都不会受到sql注入的影响。除非第一个获得userid作为动态变量。@Abhishek这个例子可能是不幸的。我猜他的意思是类似于
“SELECT…WHERE USER_ID=”“+userId+”
@Thomas我想他的意思是:P
PreparedStatement的优点:SQL语句的预编译和DB端缓存导致总体执行速度更快,并且能够批量重用相同的SQL语句。
如果查询中的值确实是硬编码的,例如,
“…用户_