全部产品
云市场

Prepare 协议使用说明

更新时间:2018-08-23 09:50:05

Prepare 协议介绍

DRDS 提供对服务器端预处理语句的支持,支持利用高效的客户端/服务器二进制协议。使用准备好的语句和占位符来获取参数值具有以下好处:

  • 每次执行时解析语句的开销都较小。通常情况下,数据库应用程序处理大量几乎相同的语句,只改变 Prepare 语句中的变量值,这样可以大幅度提升 SQL 执行效率。
  • 防止 SQL 注入攻击。

协议详细说明

  • Prepare 协议支持范围
  • Prepare 协议 SQL 支持范围
    • 支持所有 DML 语句,例如:SELECT、UPDATE、DELETE、INSERT 等
  • Prepare 协议 SQL 不支持范围
    • 不支持 DML 以外其他 SQL 语句,例如: SHOW、SET 等
  • Prepare 协议不支持在 MySQL 命令行使用
    • 如:以下方法不支持
      1. mysql> SET @s = 'SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse';
      2. mysql> PREPARE stmt2 FROM @s;
      3. mysql> SET @a = 6;
      4. mysql> SET @b = 8;
      5. mysql> EXECUTE stmt2 USING @a, @b;

在 JAVA 中开启 Prepare 协议

  • 在JAVA 客户端中,如果需要使用 Prepare 协议,需要强行在 URL 连接串中增加 useServerPrepStmts=true 参数,如果不指定此参数,则 PreparedStatement 默认会走普通查询
  • 如:jdbc:mysql://xxxxxx:3306/xxxxxx?useServerPrepStmts=true

Java 使用示例:

  1. Class.forName("com.mysql.jdbc.Driver");
  2. Connection connection = DriverManager.getConnection("jdbc:mysql://xxxxxx:3306/xxxxxx?useServerPrepStmts=true", "xxxxx", "xxxxx");
  3. String sql = "insert into batch values(?,?)";
  4. PreparedStatement preparedStatement = connection.prepareStatement(sql);
  5. preparedStatement.setInt(1, 0);
  6. preparedStatement.setString(2, "corona-db");
  7. preparedStatement.executeUpdate();