?
(3)问题分析
?
(3.1)错误日志分析
从这个错误上看,是我们执行SQL时,超过了最大的游标设置数
?
?
(3.2)为何游标的数量越来越大?
通过
SELECT * FROM v$open_cursor a WHERE a.USER_NAME = ‘ZCRM‘;
这句SQL,我们发现每执行一个SQL,游标的数量就会增加
?
?
(3.3)配置文件分析
(3.3.1)Druid连接池+Mybatis
?
<bean id="oracleZcrmDataSource" class="com.alibaba.druid.pool.DruidDataSource"
? ? ? ? init-method="init" destroy-method="close">
? ? ? ? <!-- 数据库基本信息配置 -->
? ? ? ? <property name="driverClassName" value="${jdbc_driver}" />
? ? ? ? <property name="url" value="${jdbc_url}" />
? ? ? ? <property name="username" value="${jdbc_username}" />
? ? ? ? <property name="password" value="${jdbc_password}" /> ? ? ? ?
? ? ? ? <!-- 初始化连接数量 -->
? ? ? ? <property name="initialSize" value="${initialSize}" />
? ? ? ? <!-- 最大并发连接数-->
? ? ? ? <property name="maxActive" value="${maxActive}" />
? ? ? ? <!-- 最大空闲连接数 ? 已经不再使用,配置了也没效果-->
? ? ? ? <property name="maxIdle" value="${maxIdle}" />
? ? ? ? <!-- 最小空闲连接数 -->
? ? ? ? <property name="minIdle" value="${minIdle}" />
? ? ? ? <!-- 配置获取连接等待超时的时间 --> ? ?
? ? ? ? <property name="maxWait" value="${maxWait}" />
? ? ? ? <!-- 超过时间限制是否回收 -->
? ? ? ? <property name="removeAbandoned" value="${removeAbandoned}" />
? ? ? ? <!-- 超过时间限制多长; -->
? ? ? ? <property name="removeAbandonedTimeout" value="${removeAbandonedTimeout}" />
? ? ? ? <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
? ? ? ? <property name="timeBetweenEvictionRunsMillis" value="${timeBetweenEvictionRunsMillis}" />
? ? ? ? <!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
? ? ? ? <property name="minEvictableIdleTimeMillis" value="${minEvictableIdleTimeMillis}" />
? ? ? ? <!-- 用来检测连接是否有效的sql,要求是一个查询语句-->
? ? ? ? <property name="validationQuery" value="${validationQuery}" />
? ? ? ? <!-- 申请连接的时候检测 -->
? ? ? ? <property name="testWhileIdle" value="${testWhileIdle}" />
? ? ? ? <!-- 申请连接时执行validationQuery检测连接是否有效,配置为true会降低性能 -->
? ? ? ? <property name="testOnBorrow" value="${testOnBorrow}" />
? ? ? ? <!-- 归还连接时执行validationQuery检测连接是否有效,配置为true会降低性能 ?-->
? ? ? ? <property name="testOnReturn" value="${testOnReturn}" />
? ? ? ? <!-- 打开PSCache,并且指定每个连接上PSCache的大小 -->
? ? ? ??<property name="poolPreparedStatements" value="${poolPreparedStatements}" /> ? ?
? ? ? ? <property name="maxPoolPreparedStatementPerConnectionSize" value="${maxPoolPreparedStatementPerConnectionSize}" />
? ? ? ? <!--属性类型是字符串,通过别名的方式配置扩展插件,常用的插件有: ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? 监控统计用的filter:stat
? ? ? ? ? ? ? ? ? 日志用的filter:log4j
? ? ? ? ? ? ? ? ?防御SQL注入的filter:wall -->
? ? ? ? <property name="filters" value="${filters}" /> ? ? ?
? ? </bean>
?
(3.3.2)深入分析
?
poolPreparedStatements
是否缓存preparedStatement,也就是PSCache。PSCache对支持游标的数据库性能提升巨大,比如说oracle。在mysql下建议关闭。
这边需要特别注意的是:如果我们的查询不是通过prepareStatement方式去查询的时候,PSCache没有效果,并且会增加Oracle数据库的游标,这个时候如果游标值设置的过小,就会出现【ORA-01000:?maximum?open?cursors?exceeded】这个错误。
因为我们这边的SQL是动态生成的,所以无法使用prepareStatement查询
?
?