问题背景:我需要插入一条数据并且返回主键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测试没有异常
- 这两位和我问题差不多
https://segmentfault.com/q/10...
http://www.zhimengzhe.com/shu...
根据这位前辈从德鲁伊换了c3p0依然报错,只是部分插入语句由第二次插入报错,变成了第3次报错,还有些从第五次报错变成了第9次报错。
会不会是因为oracle不支持这种一个insert into 多个values的方法导致的?