账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    oracle新增返回主键 插入报错java.sql.SQLException: 索引中丢失 IN 或 OUT 参数
    36
    0

    问题背景:我需要插入一条数据并且返回主键id,mysql没有问题,oracle多次插入报错丢失参数,重启服务器后又可以插入几条

    long meterId = updateWithReturnKey(addSql.toString(), paramMaps, new String[] { "F_METERID"}).longValue();
    @Override
        public Number updateWithReturnKey(final String sqlString, Map<String, ?> paramMaps, String[] keyColumnNames) {
            KeyHolder generatedKeyHolder = new GeneratedKeyHolder();
            int rowAffected = -1;
            try {
                rowAffected = getNamedParameterJdbcTemplate().update(sqlString, new MapSqlParameterSource(paramMaps),
                        generatedKeyHolder, keyColumnNames);
            } catch (DataAccessException e) {
                SystemLogger.error("GenericDaoJdbc-updateWithReturnKey-Exception:" + StringUtils.getStackMessage(e));
            }
            return rowAffected > 0 ? generatedKeyHolder.getKey() : -1L;
        }

    德鲁伊数据源配置

    druid.url=jdbc:oracle:thin保密
    druid.driverClassName=oracle.jdbc.driver.OracleDriver
    druid.username= 保密
    druid.password=保密
    druid.filters=stat
    druid.maxActive=20
    druid.initialSize=1
    druid.maxWait=60000
    druid.minIdle=10
    druid.timeBetweenEvictionRunsMillis=60000
    druid.minEvictableIdleTimeMillis=300000
    druid.validationQuery=SELECT 'x'
    druid.testWhileIdle=true    
    druid.testOnBorrow=false
    druid.testOnReturn=false
    druid.maxOpenPreparedStatements=100
    druid.removeAbandoned=true 
    druid.removeAbandonedTimeout=1800
    druid.logAbandoned=true
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"
            destroy-method="close">
            <property name="url" value="${druid.url}" />
            <property name="username" value="${druid.username}" />
            <property name="password" value="${druid.password}" />
            <property name="driverClassName" value="${druid.driverClassName}" />
            <property name="filters" value="${druid.filters}" />
            <property name="maxActive" value="${druid.maxActive}" />
            <property name="initialSize" value="${druid.initialSize}" />
            <property name="maxWait" value="${druid.maxWait}" />
            <property name="minIdle" value="${druid.minIdle}" />
            <property name="timeBetweenEvictionRunsMillis" value="${druid.timeBetweenEvictionRunsMillis}" />
            <property name="minEvictableIdleTimeMillis" value="${druid.minEvictableIdleTimeMillis}" />
            <property name="validationQuery" value="${druid.validationQuery}" />
            <property name="testWhileIdle" value="${druid.testWhileIdle}" />
            <property name="testOnBorrow" value="${druid.testOnBorrow}" />
            <property name="testOnReturn" value="${druid.testOnReturn}" />
            <property name="maxOpenPreparedStatements" value="${druid.maxOpenPreparedStatements}" />
            <property name="removeAbandoned" value="${druid.removeAbandoned}" /> <!-- 打开removeAbandoned功能 -->
            <property name="removeAbandonedTimeout" value="${druid.removeAbandonedTimeout}" /> <!-- 1800秒,也就是30分钟 -->
            <property name="logAbandoned" value="${druid.logAbandoned}" /> <!-- 关闭abanded连接时输出错误日志 -->
        </bean>

    产生问题的环境中的配置信息:
    1:多数据源;
    2:数据源有mysql,有oracle;
    3:数据源默认为mysql,mysql测试正常;切换数据源到oracle插入数据只能插入一条。插入第二条是就是报出这个错误重启服务便可以再次插入一条数据;

    排查问题过程:
    1.sql直接插入并无异常;
    2.mysql测试没有异常

    1. 这两位和我问题差不多

    https://segmentfault.com/q/10...
    http://www.zhimengzhe.com/shu...
    根据这位前辈从德鲁伊换了c3p0依然报错,只是部分插入语句由第二次插入报错,变成了第3次报错,还有些从第五次报错变成了第9次报错。

    0
    打赏
    收藏
    点击回答
        全部回答
    • 0
    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部