1.什么是预处理
当你在你的应用程序或者EJB中使用Prepared Statement或者Callable Statement时,应用服务器和数据库服务器会首先对Prepared Statement和CallableStatement进行预处理,然后再进行执行。Statement cache是Weblogic提供的对预处理后的Statement进行缓存的功能,可是使减少预处理所用的时间。
2.什么是statement cache size
“语句高速缓存大小”属性确定在数据源的每个实例中为每个连接缓存的准备和可调用语句的总数。 通过缓存语句,可以提高系统性能。 但是,您必须考虑您的DBMS如何处理打开准备好的和可调用的语句。 在很多情况下,DBMS将为每个打开的语句维护一个游标。 这适用于语句高速缓存中已准备和可调用的语句。 如果缓存太多的语句,则可能会超出数据库服务器上打开游标的限制。
3.如何设置statement cache
设置Statement Cache,可以到WebLogic Console -> Datasource -> ConnectionPool下进行。两个参数分别是Statement Cache Type和Statement Cache Size.
Statement Cache Type是Statement Cache的算法,共提供了两种cache的算法,一种是LRU,就是当一个新的Prepared或者Callablestatement使用时,会将缓存中非使用时间最长那个statement给替换掉。另外一种是FIXED,就是首先用到过的确定数目的prepared和callable statement被加入到缓存中。一般情况下可选用LRU的cache算法。
Statement Cache Size是指有多少个prepared statement或者callable statement可以被缓存,WebLogic在遇到对这些statement的请求时会重用缓存中的statement而不会重新加载。
4.如何计算Statement Cache打开的游标数
配置Statement Cache Size需要打开数据库游标,假设Statement Cache Size值为20,数据源连接池大小为20,有两个节点使用了此数据源,就需要打开20x20x2=800个游标。
5.Statement Cache Size过大可能导致OOME
内存泄漏点信息如下:
A Linked List Data Structure Detected.
2,718,568,008 bytes (65.45 %) of Java heap is used by 16 instances of java/util/LinkedList$Entry
Contains the following object:
- 15 instances of weblogic/jdbc/common/internal/ConnectionEnv holding 2,275,930,168 bytes
Contains 2 instances of the following leak suspects:
- oracle/jdbc/driver/T4CPreparedStatement holding 13,158,688 bytes at 0x73288fdf8
- oracle/jdbc/driver/T4CPreparedStatement holding 313,857,888 bytes at 0x7a8e70428
解决方法:
设置statement-cache-size的值为0
<jdbc-connection-pool-oarams>
<statement-cache-size>200</statement-cache-size>
<jdbc-connection-pool-oarams>
网友评论