关于jFinal项目中java.sql.SQLException: 求助!

先说下我的需求吧:需求就是随机生成30w数据并导入mysql数据库。起初用的Db.batchSave()方法,但是因为数据量大,耗时比较长,就换用了下面的方法。

下面中的代码101行会报错:image.png

image.png

具体的报错信息如下:

image.png

报错的意思应该是:不能将java.sql包下的PreparedStatement对象,转换为com.mysql.jdbc包下的PreparedStatement对象,但是我同样的代码在springBoot的框架下是可以正常运行的。直接copy到我自己搭建的jFinal项目中就报错了,昨天搜了半天也没能解决,求波总指点一下,我对底层的逻辑不是很明了。


评论区

zzutligang

2020-09-29 10:58

用Db.tx()这种方式,一次插入50万数据也很快,记得在tx最后return true;最后一性提交。有了JFinal,你还用原始的jdbc,何苦呢。

zzutligang

2020-09-29 11:01

boolean ret = Db.use("APP").tx(() -> {
Record r = new Record();

for(int i=1;i<=10_000_000;i++) {
r.set("queue_id", IDUtil.nextId());
r.set("purchase_id", i);
Db.use("APP").save("queue_purchase", "queue_id", r);
}
return true;
});
我试验的代码,插入1000万数据,很快的。数据库还不是本机的,还存在网络开销。

彭大勃

2020-09-29 11:14

@zzutligang 你这样的方式1000w数据,插入耗时多久?

zzutligang

2020-09-29 12:01

我刚试验了一下,
DruidPlugin start -> true
ActiveRecordPlugin start -> true
start -> 1601351854600
end -> 1601352017333
total -> 162733
insert 300_000 records -> true
30万耗时162秒,不到3分钟

彭大勃

2020-09-29 13:13

@zzutligang 那不行啊,30万数据,设计能接受的最大时间是5秒。我用Db.batchSave()是不到两分钟。用mysql命令在spring框架下是3秒,所以用命令的方式要快的多。我得研究下怎么弄,或者有其他方式没

小李子a

2020-09-29 15:39

多开几个线程,一个线程插入几万数据,用线程去堆,只要配置够高,几秒还不是小意思?我测试了一下,一个线程插10万,五个线程,插入50W,耗时20S左右

彭大勃

2020-09-29 15:54

@小李子a 不能这样啊,大数据环境下,插入千万级别数据呢?程序不是让玩死了。我这边需求要5秒,哎

JFinal

2020-09-29 16:02

没有用过你的这种用法,不知道原因

这里的重点是,jfinal 的数据库操作紧贴 JDBC,性能上接近最好的极限

而你谈到的在 spring 下 3 秒,别的方法更耗时,如果 java 代码一样,很可能是数据库配置的原因,或者是数据量大小的原因

小李子a

2020-09-29 16:13

@彭大勃 几十万数据,用线程去堆还是可以的,无非就是多开几个线程,几秒的时间就可以把线程回收掉,没有什么太大影响,千万数据要求秒级处理,基本上已经不是代码可以优化到的了(大佬做到的话,可以让我瞅瞅(本人萌新))

李通

2020-09-29 19:16

@彭大勃 导错包了,将11含的com.mysql.jdbc.PreparedStatement改为java.sql.PreparedStatement即可解决错误

李通

2020-09-29 21:03

@彭大勃 说错了是111行

彭大勃

2020-09-30 09:16

@李通 不对吧,我这一行的目的就是将java.sql.PreparedStatement转换成com.mysql.jdbc.PreparedStatement从而使用com.mysql.jdbc.PreparedStatement.setLocalInfileInputStream()方法。这个方法的目的是将流数据直接插入到数据表中。java.sql.PreparedStatement是不提供这样的方法的

李通

2020-09-30 09:27

@彭大勃 既然这样,我也帮不到你了 你给出的代码太少,不便于调试,建议你到gitee上创建一个工程,详细描述一下问题,在提一个反馈