14年618前夕的某个晚上的如下sql:
<!--添加同步数据--> <insert id="insert" parameterClass="order"> INSERT INTO aa(ID,ORDERID,CREATEDATE) VALUES (seq.Nextval,#orderId#,#createDate#) <selectKey resultClass="java.lang.Long"> SELECT seq.CURRVAL FROM DUAL </selectKey> </insert>
会抛出800多条如下错误
Caused by: java.sql.SQLException: ORA-01013: 用户请求取消当前的操作 at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112) at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:331) at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:288) at oracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java:745) at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:219) at oracle.jdbc.driver.T4CPreparedStatement.executeForRows(T4CPreparedStatement.java:970)
原因是sql执行时间太长,jdbc驱动主动去取消了操作。
建议:
1、看一下该sql的平均执行时间,对该sql设置一个超时时间。(执行时间太长会对占用着连接,造成其他人拿不到连接)
2、找DBA咨询下有没有办法优化下该sql,比如能不能并行插入。或者能不能做分区。
1、数据源配置
如果使用apache dbcp时,且可能遇到连接数瓶颈时,可以调整如下配置:
<!—建议以下值尽量一样,没必要频繁的过期空闲连接(除非比如连接池资源紧缺,可以考虑) -->
<property name="maxIdle" value="80" />
<property name="minIdle" value="80" />
<property name="initialSize" value="80"/>
<property name="maxActive" value="80" />
<!—这个是等待获取连接池连接时间,也不要太大,比如设置在500毫秒 -->
<property name="maxWait" value="500" />
<!-- 移除无引用连接(那些没有close的连接)此处设置为false,需要保证程序中连接一定释放 -->
<property name="removeAbandoned" value="false"></property>
<property name="removeAbandonedTimeout" value="300000"></property>
<!-- 一个连接空闲多久从池中移除,此处不做判断-->
<property name="minEvictableIdleTimeMillis" value="-1" />
<!-- 过期时循环测试多少次(0 就相当于关闭定时器) -->
<property name="numTestsPerEvictionRun" value="0" />
<!-- expire connection 定时器周期 -->
<property name="timeBetweenEvictionRunsMillis" value="120000" />
<!-- 当连接空闲时是否测试,即保持连接一直存活,配合expire connection 定时器使用 -->
<property name="testWhileIdle" value="false"></property>
如果是mysql库,可能存在8小时问题,可以考虑开启过期定时器(numTestsPerEvictionRun=1),定期过期一下连接,timeBetweenEvictionRunsMillis时间可以设置在8小时左右.
另外可以通过如下配置来配置socket连接/读超时:
<property name="connectionProperties"
value="oracle.net.CONNECT_TIMEOUT=2000;oracle.jdbc.ReadTimeout=2000"></property>
(此处的连接和读取超时时间,请根据自己业务来考虑大小)
具体配置请参考:http://www.importnew.com/2466.html
2、ibatis配置
**项目使用的是ibatis-sqlmap-2.3.4.726.jar版本,而从2.3.1起:
o Removed maxTransactions, maxRequests, maxSessions from configuration, all are now controlled by the resource providers。(即已经移除了maxTransactions, maxRequests, maxSessions配置)
因此我们只需要如下配置:
<settings cacheModelsEnabled="false" enhancementEnabled="true"
lazyLoadingEnabled="false" errorTracingEnabled="true" maxRequests="32"
defaultStatementTimeout="2"/>
defaultStatementTimeout单位是秒;根据业务配置。
如果想只设置某个Statement的超时时间,可以考虑:<insert ……timeout="2">
之前线上报如下错误,原因就是statement执行超时了。
Cause:java.sql.SQLException:ORA-01013:用户请求取消当前的操作
3、spring事务管理器配置
提供全局的事务级别的超时时间:
<bean id="oracleTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="oracleDataSource" />
<property name="defaultTimeout" value="2"/>
</bean>
总结:
超时设置主要有以下几个:
1、连接超时
2、读数据超时
3、Statement超时
4、事务级别的超时=N* Statement超时 + GC 暂停time
之前总结过事务超时的一些问题,有兴趣可以参考下:
http://jinnianshilongnian.iteye.com/blog/1986023
http://www.importnew.com/2466.html
相关推荐
常用的JDBC连接池文件 在commons-DBCP文件夹中有4个jar文件
包含jdbc连接数据库与dbcp连接数据库代码,方便基础学习与深入理解数据库连接池
包含jdbc连接数据库与dbcp连接数据库代码,方便基础学习与深入理解数据库连接池
DBCP(DataBase connection pool),数据库连接池。...本资源内含Apache Commons Pool 2.4.2 (Java 6.0+)、Apache Commons DBCP 2.1.1 for JDBC 4.1 (Java 7.0+)、Apache Commons DBCP 1.4 for JDBC 4 (Java 6.0)。
打包好的DBCP配置相关jar包,配置DBCP时会很有用,包含commons-dbcp.jar与commons-pool.jar
c3p0和dbcp和jdbc.zip需要的jar包
DBCP,C3P0,Tomcat_JDBC 性能及稳定性测试代码,和博客DBCP,C3P0,Tomcat_JDBC 性能及稳定性测试一起,单看代码的人慎下
为了更明确怎样开发出高并发程序,本人写了一个测试例子去体验下 C3P0 tomcatJdbc dbcp 他们的并发能力。采用乐观锁控制oracle数据并发访问。测试结果表明在 c3p0 和dbcp 都能执行完4800以下并发线程访问。c3p0 比较...
Apache Jakarta Commons DBCP supports JDK 1.3 (JDBC 2.0) and JDK 1.4-1.5 (JDBC 3.0). JDK 1.6 (JDBC 4.0)
java连接数据库的几种方式
数据库连接池DBCP的详细配置详解,教你如何配置详细的DBCP的参数
DBCP配置数据库连接池实现对数据库的连接并附上增删改查
dbcp配置中文版本,翻译自apache 官方文档,原文请见http://commons.apache.org/dbcp/configuration.html
DBCP数据库连接池配置文件
Apache-dbcp基本配置过程 Apache-dbcp基本配置过程Apache-dbcp基本配置过程Apache-dbcp基本配置过程
dbcp,c3p0,oracleJdbc,sqlJdbc jar包 dbcp,c3p0,oracleJdbc,sqlJdbc jar包 dbcp,c3p0,oracleJdbc,sqlJdbc jar包
第24讲 JDBC编程3-DBCP.ppt第24讲 JDBC编程3-DBCP.ppt第24讲 JDBC编程3-DBCP.ppt第24讲 JDBC编程3-DBCP.ppt
java使用jdbc连接池时所使用的dbcp工具包,也可在官网下载
commons DBCP 配置参数简要说明
apache基金会的开源数据源dbcp的基本配置