ORACLE ORA-01000: 超出打开游标的最大数(解决及原因)

在for循环中调用数据库插表语句,容易造成ORA-01000: 超出打开游标的最大数的问题,主要原始是用CONNECTION 创建了 PREPAREDSTATEMENT ,用完了 PREPAREDSTATEMENT 后,没有关闭PREPAREDSTATEMENT,导致游标一直处于打开状态,因此在大数据访问量的情况下很容易出现数据库游标使用到最大,无法分配游标错误。

解决方式:

通过批量插入的方式:

oracle批量插入语句:

INSERT ALL 
INTO TABLEA(field_1,field_2) VALUES (value_1,value_2) 
INTO TABLEA(field_1,field_2) VALUES (value_3,value_4) 
INTO TABLEA(field_1,field_2) VALUES (value_5,value_6)
SELECT 1 FROM DUAL;

在mybatis中,需要将最后的一个;号去掉,并且mybatis批量插入oracle时需要显式指定为 useGeneratedKeys="false"

<insert id="addList" parameterType="java.util.List" useGeneratedKeys="false">
    INSERT ALL
    <foreach item="item" index="index" collection="list">
    INTO T_APPLAUD
    (
        ID,
        USER_ID,
        BUSINESS_TYPE,
        PRODUCT_ID,
        CREATE_TIME
    ) VALUES
    (
        #{item.id, jdbcType=NUMERIC},
        #{item.userId, jdbcType=VARCHAR},
        #{item.businessType, jdbcType=VARCHAR},
        #{item.productId, jdbcType=VARCHAR},
        #{item.createdTime, jdbcType=NUMERIC} 
    )
    </foreach>
    SELECT 1 FROM DUAL
</insert>

 

<insert id="insertMedadata" parameterType="String" useGeneratedKeys="false">
    ${insertSql}
</insert>

另外一种方法是 insert into table(...) (select ... from dual) union all (select ... from dual)

<insert id="addList" parameterType="java.util.List" useGeneratedKeys="false">
    INSERT INTO T_APPLAUD
    (
        ID,
        USER_ID,
        BUSINESS_TYPE,
        PRODUCT_ID,
        CREATE_TIME
    )
    <foreach item="item" index="index" collection="list" separator="union all">
    (
        SELECT 
            #{item.id},
            #{item.userId},
            #{item.businessType},
            #{item.productId},
            #{item.createdTime} 
        FROM DUAL
    )
    </foreach>
</insert>
<insert id="insertBatch">
    INSERT INTO t_user
            (id, name, del_flag)
    VALUES
    <foreach collection ="list" item="user" separator =",">
         (#{user.id}, #{user.name}, #{user.delFlag})
    </foreach >
</insert>

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值