连接池里缓存PreparedStatement有什么用???

问题描述

一个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

连接池里缓存PreparedStatement有什么用???的相关文章

虚拟主机上,hibernate的连接池如何配置

问题描述 有这方面经验的,希望能指导一下,最好能给出C3PO的配置,或者proxool的配置,如果能解决,分数全部奉上,谢谢:下面的配置不行,而且修改了几个类似参数也不行,最好能说明原因<!-- 最大连接数 --><property name="hibernate.c3p0.max_size">20</property><!-- 最小连接数 --><property name="hibernate.c3p0.min_siz

连接池泄露的问题

问题描述 昨天发的帖子可能描述的不是很清楚,今天整理了再发一次,求大师们帮忙看看,两个帖子一起结!1,应用一datasource配置<bean id="ds" class="org.apache.commons.dbcp.BasicDataSource"> <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>

连接池、ORA-00020以及编码习惯的问题

这两天手下的项目经理病休了,其他人又不能很快接手,只好自己顶上作一些很久没有干过的具体工作了.干多了,还是有一些感慨的. 其中一个很深刻的体会就是:编码的习惯真的很重要. 比如:在我们的一个项目中,在一个功能模块中,要上线了,开始做贝塔测试了,发现系统在工作一段时间之后就会出现莫名其妙的错误.比如:点击一个链接之后没有任何反应,控制台没有任何异常. 程序员们分析了很久,仍然是一头雾水.我也是在客户身边,打开自己的程序员写的代码开始分析.压力很大. 认真分析之后,发现很多问题.其中,导致这个问题的

jsp中实现连接池

js 在JSP里有两种实现的办法,一种是用JNDI(Java Naming Directory Interface),这可能和应用服务器有关,如果是Resin,先在resin.conf里定义 <resource-ref> <res-ref-name>jdbc/oracle</res-ref-name> <res-type>javax.sql.DataSource</res-type> <init-param driver-name=&quo

简述SQL SERVER连接池的内部机制

当应用程序运行的时候,会有一个连接池的管理控件运行在应用程序的进程里,统一管理应用程序和SQLSERVER建立的所有连接, 并且维护这些连接一直处于活动状态.当有用户发出一个connection open指令时连接池会在自己维护的连接池中找一个处于空闲状态 的连接放回自己管理的连接池里,给这个用户使用.当用户使用完毕后,发出connection close指令,连接池会把这个连接放回自己 管理的连接池里,让他重新处于空闲状态,而不是真的从SQL里登出.这样如果下次有用户需要相同连接,就可以重用这

连接池-关于Glassfish部署javadb项目第一次启动无法连接

问题描述 关于Glassfish部署javadb项目第一次启动无法连接 我做了个个人网站,就是基本的增删改查.网络项目.部署到了glassfish上,用的是javadb的数据库. 每次启动glassfish服务器以及javadb的端口,第一次都无法连接,必须要在glassfish的配置连接池里先ping一下,说数据库不存在,然后关掉javadb的那个端口黑框,重新打开一个就可以ping通了.请问要怎么弄才能在启动时一次就ping通呢? 解决方案 http://developer.51cto.co

HttpClient连接池的连接保持、超时和失效机制

HTTP是一种无连接的事务协议,底层使用的还是TCP,连接池复用的就是TCP连接,目的就是在一个TCP连接上进行多次的HTTP请求从而提高性能.每次HTTP请求结束的时候,HttpClient会判断连接是否可以保持,如果可以则交给连接管理器进行管理以备下次重用,否则直接关闭连接.这里涉及到三个问题: 1.如何判断连接是否可以保持? 要想保持连接,首先客户端需要告诉服务器希望保持长连接,这就是所谓的Keep-Alive模式(又称持久连接,连接重用),HTTP1.0中默认是关闭的,需要在HTTP头加

c# SqlConnection 与 连接池

问题描述 c# SqlConnection 与 连接池 为什么如果在SqlHelper.Conn里open(),连接池会有2个或3个连接呢? 如果在using里再open(),则只有一个连接. 不用using也是一样的情况. 解决方案 using会在超出using作用域外释放变量,就是会自动调用close方法关闭连接 你直接调用SqlHelper.Conn,需要自己调用Close方法释放连接 http://blog.csdn.net/csdbfans/article/details/561881

连接池的Connection问题

问题描述 项目中使用了proxool数据源,配置了静态创建连接类. public class DBConnection { public static Connection getConn() throws Exception{ return DriverManager.getConnection("proxool.db_master"); } public static void closeDB(Connection conn){ try{ if (conn!=null) conn.