Changes between Initial Version and Version 1 of Ticket #136


Ignore:
Timestamp:
02/18/2013 10:16:42 AM (13 years ago)
Author:
yuanhuoqing
Comment:

Legend:

Unmodified
Added
Removed
Modified
  • Ticket #136

    • Property Status changed from new to closed
    • Property Resolution changed from to fixed
  • Ticket #136 – Description

    initial v1  
    1     之前产品库遇到个问题,oracle数据表表增加个字段后会报数据库异常:Cause: java.sql.SQLException: 违反协议 
    2   然后导致数据库查询很慢,时间久了点会导致数据库游标超限等异常。对应的应用代码可以不更新,只要应用重启后问题就可以解决,在应用重启的过程中会影响网友访问10来分钟。网上找到一个相同的案例:http://www.iteye.com/topic/900077 ,这个报错跟启用preparestatment cache有关。 
     1    之前产品库遇到个问题,oracle数据表表增加个字段后会报数据库异常:Cause: java.sql.SQLException: 违反协议,然后导致数据库查询很慢,时间久了点会导致数据库游标超限等异常。对应的应用代码可以不更新,只要应用重启后问题就可以解决,在应用重启的过程中会影响网友访问10来分钟。网上找到一个相同的案例:http://www.iteye.com/topic/900077 ,这个报错跟启用preparestatment cache有关。 
    32    经过在测试环境测试分析,发现是我们的数据源配置启用了preparestatment cache,配置如下: 
    43{{{ 
     
    1211     参数<prepared-statement-cache-size>8</prepared-statement-cache-size>即是启用preparestatment cache,默认是不启用的,即这个值为0。 
    1312    PreparedStatement是JDBC里面提供的对象,很多连接池都引入了PreparedStatementCache的概念。如Jboss连接池、C3P0,DBCP等。PreparedStatementCache即用于保存与数据库交互的prepareStatement对象。在cache里的ps对象,不需要重新走一次DBMS连接请求去创建。  
    14     PreparedStatementCache是跟着connection走的。一个connection就会有一个cache。比如一个cache允许缓存20条语句,20个connection就可能缓存400个。一般连接池可以支持这个的配置,能提高性能,但会占用较大内存,同时增加表字段时如果不重启应用会报异常:java.sql.SQLException: 违反协议,需要重启应用才能解决,所以用PreparedStatementCache。 
     13    PreparedStatementCache是跟着connection走的。一个connection就会有一个cache。比如一个cache允许缓存20条语句,20个connection就可能缓存400个。一般连接池可以支持这个的配置,能提高性能,但会占用较大内存,同时增加表字段时如果不重启应用会报异常:java.sql.SQLException: 违反协议,需要重启应用才能解决,所以一般不建议启用PreparedStatementCache。