开发者社区> 问答> 正文

JFinal 1.4 + druid 0.2.26 model.save()保存怪事?报错

//方法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做连接池,就不会出现这种情况。

展开
收起
爱吃鱼的程序员 2020-06-22 16:49:05 600 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB

    如果是特定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来操作,后面有时间再分析代码。

    2020-06-22 16:49:24
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载