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" />
<!—这个是等