preparedStatement
执行过程描述
1.执行connection.prepareStatement方法时判断serverPrepStmts为true,于是构造一个prepare的数据包(数据包中有sql),发送给MySQL服务器,服务器返回一个statementId。
2.执行executeUpdate方法时,会将statementId和参数值传给MySQL服务器(不再发送sql),由MySQL服务器执行。
prepareStatement为false执行过程
1.执行prepareStatement时判断prepareStatement为false,会创建一个ClientPreparedStatement对象,不会向MySQL服务器发送数据包。
2.执行executeUpdate方法时,会对设置的参数进行转义操作,最后直接将拼接好的完整SQL发送给MySQL服务器。
客户端和服务端PreparedStatement的执行效率
1.SQL解析时间。SQL发送到MySQL服务器后并不是直接执行的,需要先经过SQL解析、SQL优化等步骤,使用serverPrepStmts时在prepare阶段会将SQL解析,之后多次执行不会再次解析,不使用serverPreptStmts时每次执行SQL服务器都需要解析,在批量执行的时候效率会有一定的影响。
2.网络开销。使用serverPrepStmts,在prepare阶段会多一次与MySQL服务器的交互,但是执行的时候不会传SQL,只会传参数,在批量执行的时候可以减少数据传输量;使用ClientPreparedStatement不会有prepare阶段的交互开销,但是每次执行都是传输完整的SQL,数据量较大。
参考:https://zhuanlan.zhihu.com/p/661572799