Java程序使用预处理语句的性能提升

打印 上一主题 下一主题

主题 1601|帖子 1601|积分 4803

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
Java程序使用预处理语句的性能提升

GreatSQL提供了对服务器端预处理语句(Prepared Statements)的支持。预处理语句可以利用了高效的客户机/服务器二进制协议。使用带有参数值占位符的预处理语句有以下好处:

  • 每次执行时剖析语句的开销更少。通常,数据库应用程序处理大量几乎相同的语句,只对语句中的笔墨值或变量值进行更改,如 SELECT 和 UPDATE 中的 WHERE,UPDATE 语句中的 SET 和 INSERT 语句中的VALUES。
  • 防范SQL注入攻击。参数值可以包含未转义的SQL引号和分隔符。
本文编写Java程序,执行常规SQL语句和预处理语句,对比性能差异,量化预处理语句的性能提升。
1. 程序设计

通过Java程序进行DML操纵,每次DML的数量是10万条,每50条一个提交批次。对比执行预处理语句和普通SQL语句,通过执行时间是非,判断执行的性能。

  • 函数 testInsertPerformance 对比 INSERT 性能;
  • 函数 testUpdatePerformance 对比 UPDATE 性能;
  • 函数 testSelectPerformance 对比 SELECT 性能;
  • 函数 testDeletePerformance 对比 DELETE 性能;
1.1 测试表
  1. greatsql> CREATE DATABASE IF NOT EXISTS testdb1;
  2. greatsql> USE testdb1;
  3. greatsql> CREATE TABLE IF NOT EXISTS test_table (
  4.     id INT AUTO_INCREMENT PRIMARY KEY,
  5.     col1 INT,
  6.     col2 VARCHAR(100),
  7.     col3 DATETIME
  8. );
复制代码
1.2 Java程序代码

Java程序比力轻易使用预处理SQL语句,主要有两点:

  • 数据库连接字符串中增加useServerPrepStmts=true;
  • SQL语句使用conn.prepareStatement进行预处理;
[code]import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.Statement;import java.sql.Timestamp;import java.util.Date;public class SqlPerformanceTest {    private static final String URL = "jdbc:mysql://192.168.134.208:3307/testdb1?useServerPrepStmts=true";    private static final String USER = "testuser";    private static final String PASSWORD = "testpass";    private static final int NUM_ITERATIONS = 100000;    private static final int BATCH_SIZE = 50;    public static void main(String[] args) {        try (Connection conn = DriverManager.getConnection(URL, USER, PASSWORD)) {            // 清空测试表            clearTable(conn);            // 测试 INSERT 操纵            testInsertPerformance(conn);            // 测试 UPDATE 操纵            testUpdatePerformance(conn);            // 测试 SELECT 操纵            testSelectPerformance(conn);            // 测试 DELETE 操纵            testDeletePerformance(conn);        } catch (Exception e) {            e.printStackTrace();        }     }    private static void clearTable(Connection conn) throws Exception {        try (Statement stmt = conn.createStatement()) {            stmt.execute("TRUNCATE TABLE test_table");        }    }    private static void testInsertPerformance(Connection conn) throws Exception {        long startTime, endTime;        // 清空测试表        clearTable(conn);       // 普通 SQL 语句        startTime = System.nanoTime();        conn.setAutoCommit(false); // 关闭自动提交        try (Statement stmt = conn.createStatement()) {            for (int i = 1; i
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

农妇山泉一亩田

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表