问题描述
一个sql会在db端解析成(sql,parseTree)这种hash结构,然后下次该sql就可以从db端的缓存中取得parseTree,从而省去了查错,解析等过程。但问题是为什么要在server端缓存这个PreparedStatement对象呢。有几个问题不解:1.PreparedStatement属于Connection,如果线程A归还Connection后,线程B拿到该Connection,PreparedStatement缓存是否被清空??2.如果db端(sql,parseTree)过期被清空,server端缓存的PreparedStatement还能起到提高性能的效果吗?3.如果2不成立,那缓存PreparedStatement在哪方面提高了性能?
解决方案
解决方案二:
都是缓存Connection,没见过缓存PreparedStatement的
解决方案三:
同LS,没见过在应用server上缓存PreparedStatement,实际上我认为没太多意义,因为关键在于数据库服务器,如果数据库服务器有缓存PreparedStatement解析后的数据结构,那么对于任何应用server来说,其开销只是多了一步ms级别的网络io(长连接);如果数据库服务器没有缓存,那么你在应用server上怎么折腾都没用
解决方案四:
引用1楼longtian1213的回复:
都是缓存Connection,没见过缓存PreparedStatement的
引用2楼ygycomon的回复:
同LS,没见过在应用server上缓存PreparedStatement,实际上我认为没太多意义,因为关键在于数据库服务器,如果数据库服务器有缓存PreparedStatement解析后的数据结构,那么对于任何应用server来说,其开销只是多了一步ms级别的网络io(长连接);如果数据库服务器没有缓存,那么你在应用server上怎么折腾都没用
有的,dbch跟c3p0两个连接池都有个参数配置缓存PreparedStatement的。
解决方案五:
缓存PreparedStatement的配置实际上是在JDBC驱动中实现的,目的是减少重新编译的次数。详情参考这里:
时间: 2024-09-28 09:05:27