//方法1,用model.save()方式。 private void saveClickNum(Integer type,Long click_pkid,Integer click_num){ SysClick sc = new SysClick().set("click_id", "s_system_click.nextval").set("click_type", type).set("click_pkid", click_pkid).set("click_num", click_num).set("click_date", "to_char(sysdate,'yyyy-MM-dd')"); sc.save(); } //方法2,用Db.update()方式 private void insertClickNum(Integer type,Long click_pkid,Integer click_num){ String sql = "insert into t_system_click (click_id,click_type,click_pkid,click_num,click_date)values(s_system_click.nextval,?,?,?,to_char(sysdate,'yyyy-MM-dd'))"; Db.update(sql, type,click_pkid,click_num); } public void test1 (){ for(int i=0;i<3;i++){ saveClickNum(1,1L,i); } } public void test2 (){ for(int i=0;i<3;i++){ insertClickNum(1,1L,i); } }
调用test2都可以成功入库。
调用test1时,只有第一次(i=0)时能入库,第二次开始就会报错:
com.jfinal.plugin.activerecord.ActiveRecordException: java.sql.SQLException: 索引中丢失 IN 或 OUT 参数:: 5
at com.jfinal.plugin.activerecord.Model.save(Model.java:298)
at net.evecom.web.core.service.VisitStatService.saveClickNum(VisitStatService.java:144)
at net.evecom.web.core.service.VisitStatService._flush(VisitStatService.java:122)
at net.evecom.web.core.service.VisitStatService.run(VisitStatService.java:86)
at java.util.TimerThread.mainLoop(Timer.java:512)
at java.util.TimerThread.run(Timer.java:462)
Caused by: java.sql.SQLException: 索引中丢失 IN 或 OUT 参数:: 5
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:146)
at oracle.jdbc.driver.OraclePreparedStatement.processCompletedBindRow(OraclePreparedStatement.java:1704)
at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3280)
at oracle.jdbc.driver.OraclePreparedStatement.executeUpdate(OraclePreparedStatement.java:3368)
at com.alibaba.druid.filter.FilterChainImpl.preparedStatement_executeUpdate(FilterChainImpl.java:2721)
at com.alibaba.druid.wall.WallFilter.preparedStatement_executeUpdate(WallFilter.java:592)
at com.alibaba.druid.filter.FilterChainImpl.preparedStatement_executeUpdate(FilterChainImpl.java:2719)
at com.alibaba.druid.filter.FilterAdapter.preparedStatement_executeUpdate(FilterAdapter.java:1069)
at com.alibaba.druid.filter.FilterEventAdapter.preparedStatement_executeUpdate(FilterEventAdapter.java:491)
at com.alibaba.druid.filter.FilterChainImpl.preparedStatement_executeUpdate(FilterChainImpl.java:2719)
at com.alibaba.druid.proxy.jdbc.PreparedStatementProxyImpl.executeUpdate(PreparedStatementProxyImpl.java:145)
at com.alibaba.druid.pool.DruidPooledPreparedStatement.executeUpdate(DruidPooledPreparedStatement.java:253)
at com.jfinal.plugin.activerecord.Model.save(Model.java:292)
... 5 more
1。如果是参数不对,那第一次也无法入库吧。我下了druid源码,断点到com.alibaba.druid.pool.DruidPooledPreparedStatement.executeUpdate,查看参数,几次的参数个数,参数类型都是一样的,
2.如果使用C3P0做连接池,就不会出现这种情况。
如果是特定driver错误,感觉就像databasemetadata获取出来有错误了。
druid什么版本?你用druid-0.2.26试试看
回复<aclass='referer'target='_blank'>@wenshao:你好,麻烦看下这个BUG怎么改。谢谢,实在不行我的项目只好用C3P0了<atarget='_blank'>@robin69最近很忙,国庆期间再跟进请问这个问题要怎么解决啊。算bug不?真的有问题,0.2.26一样错怎么不认真看呢?那么大的一个标题用简单的 NamedParameterJdbcTemplate重现了,org.springframework.jdbc.datasource.DriverManagerDataSourceOK,druid会错
oracle下
https://github.com/alibaba/druid/issues/453
ojdbc14+DriverManagerDataSourceOK
ojdbc14+com.alibaba.druid.pool.DruidDataSourceERROR
ojdbc6的话,都OK
但既然DriverManagerDataSource是OK的,所以应该还要从druid下手修复
@JFinal这个问题在最新的JFinal中依然存在,我在ORACLE抓取了对应的SQL,发现后面有这么一截:insertintoghtc_task_ret(FUNC_RETDESC,FUNC_RETNUM,TASK_SEQ,RET_ID,EXEC_TIME,FUNC_NO,TASK_ID)values(:1,:2,:3,:4,:5,:6,:7)RETURNINGret_idINTO:8,注意RETURNINGret_idINTO:8这一段,问题应该就出在这里,当进行循环插入的时候,插入第二条的时候就报:索引中丢失 IN或OUT参数::8
简单跟了下代码,感觉大概是fillstatement这个地方,也就是预编译语句进行绑定变量的时候出了问题,目前暂时用db.batch来操作,后面有时间再分析代码。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。