jdbc mysql驱动_MySQL JDBC驱动程序如何处理准备好的语句

jdbc mysql驱动

准备的语句类型

在研究 高性能Java持久性》一书中的“ 语句缓存”一章时,我有机会比较了Oracle,SQL Server,PostgreSQL和MySQL处理准备语句的方式。

感谢Jess Balint (MySQL JDBC驱动程序撰稿人)在StackOverflow上给出了一个很好的答案 ,我从数据库性能的角度更好地了解了MySQL如何处理预备语句。

基本上,有两种准备语句的方式:在服务器端或客户端。

服务器端准备好的语句

最常见的类型是服务器端语句,它需要两次数据库往返:

  • 驱动程序提交一个准备请求,数据库将该语句解析为查询树 ,该查询树也可以转换为预先优化的树结构。 因为没有实际的绑定参数值很难构建执行计划 ,所以将执行计划推迟到执行语句之前
  • 执行请求包含当前绑定值,数据库将其用于将解析树转换为最佳执行计划。 执行者制定计划并构建关联的结果集。

如果数据访问逻辑未缓存准备好的语句,则额外的数据库往返实际上会损害性能。 为此,某些数据库系统不默认使用服务器端的预处理语句,而是执行客户端的语句准备。

要启用服务器端准备好的语句,必须启用useServerPrepStmts属性。

客户端准备的声明

当在客户端上准备语句时,在将语句发送到数据库服务器之前,将绑定参数标记替换为实际参数值。 这样,驱动程序可以使用单个请求来获取结果集。

缓存语句

在高性能OLTP系统中,语句缓存在降低事务延迟方面起着非常重要的作用。 为了避免多次准备语句,MySQL驱动程序提供了一个客户端语句缓存。 默认情况下禁用缓存,该缓存由cachePrepStmts Connection属性激活。

对于客户端语句,可以在不同的准备语句调用之间重用标记化语句结构。 缓存绑定到数据库连接,但是当使用连接池时,物理连接的生存期跨越多个应用程序级别的事务(因此,频繁执行的语句可以从使用缓存中受益)。

对于服务器端语句,驱动程序缓存ServerPreparedStatement以及对服务器端语句支持的检查(并非所有语句都可以在服务器端准备)。

缓存语句可能会对应用程序性能产生重大影响。如果您对此主题感兴趣,那么您还可以订阅“ 高性能Java持久性 ”状态通知书。

翻译自: https://www.javacodegeeks.com/2015/09/how-does-the-mysql-jdbc-driver-handle-prepared-statements.html

jdbc mysql驱动

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值