oracle新增返回主键 插入报错java.sql.SQLException: 索引中丢失 IN 或 OUT 参数

新手上路,请多包涵

问题背景:我需要插入一条数据并且返回主键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次报错。

阅读 3.7k
1 个回答

会不会是因为oracle不支持这种一个insert into 多个values的方法导致的?

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题