鍍金池/ 問(wèn)答/Java  數(shù)據(jù)庫(kù)/ oracle新增返回主鍵 插入報(bào)錯(cuò)java.sql.SQLExcept

oracle新增返回主鍵 插入報(bào)錯(cuò)java.sql.SQLException: 索引中丟失 IN 或 OUT 參數(shù)

問(wèn)題背景:我需要插入一條數(shù)據(jù)并且返回主鍵id,mysql沒(méi)有問(wèn)題,oracle多次插入報(bào)錯(cuò)丟失參數(shù),重啟服務(wù)器后又可以插入幾條

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;
    }

德魯伊數(shù)據(jù)源配置

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}" /> <!-- 打開(kāi)removeAbandoned功能 -->
        <property name="removeAbandonedTimeout" value="${druid.removeAbandonedTimeout}" /> <!-- 1800秒,也就是30分鐘 -->
        <property name="logAbandoned" value="${druid.logAbandoned}" /> <!-- 關(guān)閉abanded連接時(shí)輸出錯(cuò)誤日志 -->
    </bean>

產(chǎn)生問(wèn)題的環(huán)境中的配置信息:
1:多數(shù)據(jù)源;
2:數(shù)據(jù)源有mysql,有oracle;
3:數(shù)據(jù)源默認(rèn)為mysql,mysql測(cè)試正常;切換數(shù)據(jù)源到oracle插入數(shù)據(jù)只能插入一條。插入第二條是就是報(bào)出這個(gè)錯(cuò)誤重啟服務(wù)便可以再次插入一條數(shù)據(jù);

排查問(wèn)題過(guò)程:
1.sql直接插入并無(wú)異常;
2.mysql測(cè)試沒(méi)有異常

  1. 這兩位和我問(wèn)題差不多

https://segmentfault.com/q/10...
http://www.zhimengzhe.com/shu...
根據(jù)這位前輩從德魯伊換了c3p0依然報(bào)錯(cuò),只是部分插入語(yǔ)句由第二次插入報(bào)錯(cuò),變成了第3次報(bào)錯(cuò),還有些從第五次報(bào)錯(cuò)變成了第9次報(bào)錯(cuò)。

回答
編輯回答
賤人曾

會(huì)不會(huì)是因?yàn)閛racle不支持這種一個(gè)insert into 多個(gè)values的方法導(dǎo)致的?

2018年5月23日 14:38