`
singleant
  • 浏览: 377828 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

【性能】JDBC PreparedStatement和连接池PreparedStatement Cache学习记录

阅读更多

之前看JDBC规范的时候对PreparedStatement只是简单的知道会进行sql预编译,能提高性能。具体原理也没怎么理解。

最近在性能测试遇到一个连接池的调优刚好是和PreparedStatement和PreparedStatementCache相关的。固重新系统的看了点资料学习了点,简单记录一下。

 

1.java.sql.PreparedStatement

首先看wiki对使用PS的解释:

The typical workflow of using a prepared statement is as follows:
    Prepare: The statement template is created by the application and sent to the database management system (DMBS). Certain values are left unspecified, called parameters, placeholders or bind variables (labelled "?" below):
        INSERT INTO PRODUCT (name, price) VALUES (?, ?)
    The DBMS parses, compiles, and performs query optimization on the statement template, and stores the result without executing it.
Execute: At a later time, the application supplies (or binds) values for the parameters, and the DBMS executes the statement (possibly returning a result). The application may execute the statement as many times as it wants with different values. In this example, it might supply 'Bread' for the first parameter and '1.00' for the second parameter.

 简单翻译

一个 PreparedStatement 的执行过程:

1.        prepare :语句模板被创建,并发送给 DBMS ,具体参数没有指定,知识用占位符替代。(会有一次连接开销,等会介绍PreparedStatemetCache会优化这个开销。 )

2.        编译:数据库收到语句后会预先编译和优化产生执行计划。

3. 执行:客户端传进来绑定参数,数据库根据动态参数拼装并执行产生结果返回给客户端

 

 

再看JDBC java.sql.Connection类的prepareStatement 方法注释:

 

 

public PreparedStatement prepareStatement(String sql)
                                   throws SQLException

    Creates a PreparedStatement object for sending parameterized SQL statements to the database.

    A SQL statement with or without IN parameters can be pre-compiled and stored in a PreparedStatement object. This object can then be used to efficiently execute this statement multiple times.

    Note: This method is optimized for handling parametric SQL statements that benefit from precompilation. If the driver supports precompilation, the method prepareStatement will send the statement to the database for precompilation. Some drivers may not support precompilation. In this case, the statement may not be sent to the database until the PreparedStatement object is executed. This has no direct effect on users; however, it does affect which methods throw certain SQLException objects.

 

 

基本意识就是:

创建一个 PreparedStatement object 给数据库发送参数化的 sql 语句。一个没有参数的语句可以被预先编译并存储在 PreparedStatement 语句里面。这个对象可以用来高效的多次执行语句。

 

以前理解预编译和这个不太一致,罪过罪过。

 

 

2. orachle 的PreparedStatement如何发生效果

具体可以见附件   oracle preparedStatements.ppt   里面有很详细的描述。

Oracle SQL 执行过程可以简单描述如下:

 

 

 

 


 

预编译后的语句的执行计划存在于DBMS的shared pool中,可以省去前两个阶段的操作。直接进入第三阶段。
也有很多DBMS是不支持的。好像mysql就不支持,这样api上虽然看似使用PreparedStatement,实际上驱动实现并没有真正实现这个功能,而是生成statement。

 

3.连接池的PreparedStatement cache
这个概念也是之前我所不了解的。
PreparedStatement是JDBC里面提供的对象,很多连接池都引入了PreparedStatementCache的概念。如Jboss连接池、C3P0,DBCP等。PreparedStatementCache即用于保存与数据库交互的prepareStatement对象。在cache里的ps对象,不需要重新走一次DBMS连接请求去创建。
如Jboss连接池的PreparedStatementCache实现,支付宝DBA的一个总结:JBOSS连接池1-PreparedStatementCache参数的作用及原理
PreparedStatementCache是跟着connection走的。一个connection就会有一个cache。比如一个cache允许缓存20条语句,20个connection就可能缓存400个。

一般连接池可以支持这个的配置。由于会占用较大内存,所以一般配置的时候要特别注意。DBCP里对应的是poolPreparedStatements和maxOpenPreparedStatements两个参数。
具体可以参考:dbcp configuration
这个对性能的优化还是很有价值的。尤其对于应用内sql比较固定的场景,会有很大的性能提升。之前在我们项目里,一个压力场景没有设置这两个参数之前的tps大约是1700,设置之后的tps大约是3100.当然也有一定的内存开销需要特别注意。

 

 

 

 

 

 

 

 

  • 大小: 37.8 KB
1
0
分享到:
评论
3 楼 单眼皮大娘 2015-09-29  
楼主,真是不错的文章 解答了我的疑惑。
2 楼 singleant 2013-01-11  
hot66hot 写道
引用
也有很多DBMS是不支持的。好像mysql就不支持,这样api上虽然看似使用PreparedStatement,实际上驱动实现并没有真正实现这个功能,而是生成statement。
mysql5.0支持PreparedStatement.
    MySQL 5.0 provides support for server-side prepared statements. This support takes advantage of the efficient client/server binary protocol implemented in MySQL 4.1, provided that you use an appropriate client programming interface.
http://dev.mysql.com/doc/refman/5.0/en/sql-syntax-prepared-statements.html

谢谢指出,老版本不支持
1 楼 hot66hot 2013-01-09  
引用
也有很多DBMS是不支持的。好像mysql就不支持,这样api上虽然看似使用PreparedStatement,实际上驱动实现并没有真正实现这个功能,而是生成statement。
mysql5.0支持PreparedStatement.
    MySQL 5.0 provides support for server-side prepared statements. This support takes advantage of the efficient client/server binary protocol implemented in MySQL 4.1, provided that you use an appropriate client programming interface.
http://dev.mysql.com/doc/refman/5.0/en/sql-syntax-prepared-statements.html

相关推荐

    java连接cache数据库说明,数据库驱动,cache可视化工具

    6. **性能优化**:在实际应用中,需要考虑性能优化,如使用连接池管理数据库连接,减少每次建立新连接的开销;使用批处理执行多条SQL语句;合理设计数据库表结构和索引等。 7. **安全性**:确保数据库连接的安全性...

    关于Weblogic 9/10 中JDBC优化和监控的那点事

    这些文件对于配置JDBC连接池和其他资源至关重要。 ##### 2. 可配置的JDBC参数 以下是Weblogic 9/10中可以配置的关键JDBC参数: - **RowPrefetchEnabled**: 启用客户端和WebLogic Server之间的结果集行预取功能。 -...

    java程序性能优化

    此外,了解JDBC批处理和连接池(如HikariCP、Druid)的作用,也是数据库性能优化的重要部分。 5. **JVM参数调优**:理解JVM的工作原理,如堆内存分配、新生代与老年代的划分,以及垃圾回收器的工作机制(如CMS、G1...

    WebLogic开发优化宝典

    - 数据库连接池(如WebLogic的JDBC Connection Pool)、Socket Pool、Object Pool和Thread Pool能有效提高资源利用率,降低创建销毁成本。 - 在I/O操作中使用缓冲区,尤其处理大文件时,避免内存溢出。 - 利用缓存...

    JSP+Oracle数据库组建动态网站经典实例

    - 连接池管理:使用连接池(如C3P0、Apache DBCP)管理数据库连接,提高资源利用率。 9. **错误处理与日志记录** 建立完善的错误处理机制,捕获并记录异常,有助于快速定位问题和调试代码。 通过上述知识点的...

    MySQL数据库毕业论文.doc

    根据提供的文档信息,本文将对MySQL数据库的关键特性及其在Jsp/Servlet网上拍卖系统中的应用进行深入...通过对这些知识点的学习和实践,可以更好地理解和掌握MySQL数据库的核心功能,并能够有效地应用于实际项目中。

    MariaDB + gelara集群部署(可离线),附带安装包及依赖包

    2. **连接池**:为了提高性能和资源利用率,可以使用连接池,如HikariCP、C3P0、Apache DBCP等。它们能管理和复用数据库连接,减少创建和关闭连接的开销。 3. **SQL语句执行**:使用`Statement`或`...

    java数据批量处理

    1. JDBC批处理:使用`PreparedStatement`的`addBatch()`和`executeBatch()`方法,可以将多条SQL语句一次性提交,减少数据库交互次数。 2. ORM框架:Hibernate、MyBatis等ORM框架提供了批量插入、更新、删除的功能,...

    提高MySQL 查询效率的三个技巧第1/2页

    通过使用PreparedStatement、随机获取记录和连接池,可以在处理大量数据时显著提升MySQL的查询效率,尤其在高并发和频繁操作的环境中。此外,还有其他一些策略,如优化查询语句、创建合适的索引、使用批量操作等,都...

    JSP中使用数据库5 删除数据.txt

    - **连接池管理**:使用连接池管理数据库连接,减少频繁创建和销毁连接带来的性能开销。 ### 五、总结 本文详细介绍了如何在JSP中实现数据库数据删除的操作。通过分析具体的代码示例,我们不仅了解了JSP页面的结构...

    电话面试题(华为/中兴/腾讯)

    3. **连接池**:如C3P0、DBCP、HikariCP,提高数据库连接复用,减少创建销毁连接的开销。 4. **O/R Mapping**:Hibernate和iBatis,前者全自动,后者半自动,区别在于灵活性和性能。 5. **SQL优化**:索引使用、查询...

    SpringBoot .yml

    - **`max-idle`**:连接池最大空闲连接数。 - **`max-wait`**:获取连接的最大等待时间(单位毫秒),如果小于等于0,则表示等待时间无限。 - **`min-idle`**:连接池最小空闲连接数。 - **`timeout`**:连接超时...

    Spring中DAO被循环调用的时候数据不实时更新的解决方法

    这样,每次调用`getUser`时,都会从连接池中获取新的连接,从而能够获取到最新的数据库状态。 2. **手动控制连接**: 另一种解决办法是直接在`checkUserInfo`中获取新的数据库连接,而不是依赖Spring的事务管理。...

Global site tag (gtag.js) - Google Analytics