听说很多人在谈论“ 绑定变量 ”将提高Java应用程序的性能。 这是真的吗? 我对此表示怀疑,并在PreparedStatement类中的 Bind变量与Statement类中的Non Bind变量之间进行了简单的性能测试
我该如何测试?
我将创建一个简单的Java类,并继续以绑定变量方法和非绑定变量方法向PostgreSQL数据库发送SQL查询。 Java类将显示执行结果时间的开始和结束。
使用什么工具?
1)PostgreSQL数据库
2)PostgreSQL JDBC驱动程序
3)Java JDBC PrepareStatement和Statement类
这是PreparedStatement类中的绑定变量的源代码
import java.sql.DriverManager;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Date;
public class BindVariableJDBC {
public static void main(String[] argv) {
ResultSet rs = null;
Connection conn = null;
PreparedStatement pstatement = null;
try {
conn = DriverManager.getConnection("jdbc:postgresql://127.0.0.1:5432/db_test","mkyong", "password");
Class.forName("org.postgresql.Driver");
pstatement = conn.prepareStatement("SELECT * FROM s_user where userid = ?");
System.out.println("Start: " + new Date());
for (int i = 1; i < 100000; i++) {
pstatement.setInt(1, i);
rs = pstatement.executeQuery();
}
System.out.println("End: " + new Date());
} catch (Exception e) {
e.printStackTrace();
return;
}
}
}
这是Statement类中Non Bind变量的源代码
import java.sql.DriverManager;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Date;
public class NonBindVariableJDBC {
public static void main(String[] argv) {
ResultSet rs = null;
Connection conn = null;
Statement statement = null;
try {
conn = DriverManager.getConnection("jdbc:postgresql://127.0.0.1:5432/db_test","mkyong", "password");
Class.forName("org.postgresql.Driver");
statement = conn.createStatement();
System.out.println("Start: " + new Date());
for (int i = 1; i < 100000; i++) {
rs = statement.executeQuery("SELECT * FROM s_user where userid = " + i);
}
System.out.println("End: " + new Date());
} catch (Exception e) {
e.printStackTrace();
return;
}
}
}
性能测试结果
循环1000次
绑定变量方法 | 非绑定变量方法 |
开始:2009年1月9日星期五14:09:41 结束:2009年1月9日星期五14:09:42 | 开始时间:2009年1月9日星期五14:15:08 结束:2009年1月9日星期五14:15:08 |
1秒 | 0秒 |
哇,经过1000次循环时间测试,结果令人惊讶,这表明非绑定变量方法比绑定变量方法要快一些 。 我做错什么了吗? 没关系…我只是在10000个循环时间内继续测试。
循环10000次
绑定变量方法 | 非绑定变量方法 |
开始时间:2009年1月9日星期五14:18:31 结束:2009年1月9日星期五14:18:35 | 开始时间:2009年1月9日星期五14:19:53 结束:2009年1月9日星期五14:19:59 |
4秒 | 6秒 |
10000次循环时间测试,结果表明与非绑定变量方法相比 , 绑定变量方法更快,性能提高了50% 。 听起来很有趣,我只是在100000个循环时间内继续进行测试。
循环100000次
绑定变量方法 | 非绑定变量方法 |
开始时间:2009年1月9日星期五14:22:40 结束:2009年1月9日星期五14:23:17 | 开始时间:2009年1月9日星期五14:23:49 结束:2009年1月9日星期五14:24:46 |
37秒 | 57秒 |
100000次循环时间测试,结果表明与非绑定变量方法相比 , 绑定变量方法更快,性能提高了35% 。 最后一次测试的循环时间为1000000。
循环1000000次
绑定变量方法 | 非绑定变量方法 |
开始时间:2009年1月9日星期五14:30:51 结束:2009年1月9日星期五14:37:08 | 开始:2009年1月9日星期五14:41:59 结束:2009年1月9日星期五14:51:58 |
6分17秒 | 9分钟59秒 |
1000000次循环时间测试,结果表明与非绑定变量方法相比 , 绑定变量方法更快,性能提高了37% 。
结论
在轻型数据库访问应用程序中, 绑定变量和非绑定变量之间的性能不是很明显。 但是,当应用程序涉及大量的数据库访问时,建议始终使用绑定变量方法将Java性能至少提高30% 。
翻译自: https://mkyong.com/java/bind-variables-performance-test-in-java/