ITPub博客

首页 > 数据库 > 数据库开发技术 > 浅谈PostgreSQL JDBC preparedstatement

浅谈PostgreSQL JDBC preparedstatement

原创 数据库开发技术 作者:as6575810 时间:2015-08-21 12:51:08 0 删除 编辑
PG JDBC官方文档中关于这部分的说明https://jdbc.postgresql.org/documentation/94/server-prepare.html
功能很明确避免SQL的反复解析(由于解析会消耗cpu资源,在操作频繁的数据库中,反复解析会给cpu造成压力)

为了说明过程,创建如下测试用例(数据库版本9.4.4)

点击(此处)折叠或打开

  1. postgres=# create table test as select 111 a; /*测试表*/
  2. postgres=> show log_parser_stats ; /*log_parser_stats参数为开启状态*/
  3.  log_parser_stats
  4. ------------------
  5.  on
  6. postgres=# show log_planner_stats ; /*log_planner_stats参数为开启状态*/
  7.  log_planner_stats
  8. -------------------
  9.  on


下面这段java代码,使用绑定变量的方式实现'selcet * from test where a=?',根据jdbc的说明,在连接串中设置prepareThreshold参数为3
意味着,在同一session中,同样的sql执行次数达到3次,下次执行将免去解析的过程,在程序中同样的sql执行4次,执行之后查看日志的情况 

点击(此处)折叠或打开

  1. import org.postgresql. * ;
  2. import java.sql. * ;
  3.    public class TestDB_1 {
  4.    public TestDB_1() {
  5.     }
  6.   public static void main(String args[])
  7.      {
  8.         System.out.println( "this is a test" );
  9.          try
  10.           {
  11.             Class.forName( "org.postgresql.Driver" ).newInstance();
  12.             String url = "jdbc:postgresql://192.168.88.128:5432/postgres?prepareThreshold=3" ;
  13.             Connection conn = DriverManager.getConnection(url, "postgres" , "12345678" );
  14.             int foovalue = 111;
  15.    PreparedStatement st = conn.prepareStatement("SELECT * FROM test WHERE a = ?");
  16.             st.setInt(1, foovalue);
  17.             ResultSet rs = st.executeQuery();
  18.             ResultSet rs1 = st.executeQuery();
  19.             ResultSet rs2 = st.executeQuery();
  20.    ResultSet rs3 = st.executeQuery();
  21.    while (rs3.next())
  22.              {
  23.                 System.out.println(rs3.getString( 1 ));
  24.             }
  25.             rs.close();
  26.    rs1.close();
  27.    rs2.close();
  28.    rs3.close();
  29.    st.close();
  30.         }
  31.          catch (Exception ee)
  32.          {
  33.             System.out.print(ee.getMessage());
  34.         }
  35.     }
  36. }


将csv格式日志导入表中查看,java程序执行结果如下 

点击(此处)折叠或打开

  1. postgres=# select command_tag,message from postgres_log ;
  2. command_tag | message
  3. PARSE | PARSER STATISTICS
  4. PARSE | PARSE ANALYSIS STATISTICS
  5. PARSE | REWRITER STATISTICS
  6. BIND | PLANNER STATISTICS
  7. SELECT | execute : SELECT * FROM test WHERE a = $1
  8. PARSE | PARSER STATISTICS
  9. PARSE | PARSE ANALYSIS STATISTICS
  10. PARSE | REWRITER STATISTICS
  11. BIND | PLANNER STATISTICS
  12. SELECT | execute : SELECT * FROM test WHERE a = $1
  13. PARSE | PARSER STATISTICS
  14. PARSE | PARSE ANALYSIS STATISTICS
  15. PARSE | REWRITER STATISTICS
  16. BIND | PLANNER STATISTICS
  17. SELECT | execute S_1: SELECT * FROM test WHERE a = $1
  18. BIND | PLANNER STATISTICS
  19. SELECT | execute S_1: SELECT * FROM test WHERE a = $1


从日志中可以看出,postgres SQL解析日志中记录了三步PARSER STATISTICS->PARSE ANALYSIS STATISTICS ->REWRITER STATISTICS,当执行第四遍的时候已经忽略了解析的过程,之后会直接生成执行计划(有绑定变量,故第四次执行也要从新产生执行计划)

因为是浅谈,后面没有啦 。。。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29352653/viewspace-1778488/,如需转载,请注明出处,否则将追究法律责任。

上一篇: 没有了~
下一篇: 没有了~
请登录后发表评论 登录
全部评论

注册时间:2014-09-28

  • 博文量
    1
  • 访问量
    8966