2020-09-30 11:52

@Dreamlu 如果是异步,会不会丢事件?这是我最关系的问题。

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 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 10:58

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

2020-09-29 10:55

不是如何“解决”的问题。要么你用上面图上的代码做,要么你就自己写sql做。两种方法任选其一。

2020-09-29 10:50

@彭大勃 谢谢你的回复。我再看看源码里那个序列化接口,从那个接口实现一个序列化对象,传进去应该就可以了。

2020-09-29 09:08

@JFinal,确实,我是在线程里run里不停的操作访问redis,如果不关闭,一会儿线程就卡死了。每次操作完,close掉,线程就不卡死了。我看JFinal里Redis的源码,也就是第二种用法,每次操作完,在finall里都关闭了。
另外,我想追问下,上次问了关于序列化的问题。如果全部用Redis封装好的方法而不是调用Redis.use(adapter.getRedisConfigName()).getJedis();后拿到Jedis操作,JFinal默认使用fst序列化库。能不能不用这个序列化库,就用原始的方法读写redis库?因为如果用封装的方法,会使用fst序列化库,但lua脚本里又使用原始的读写方法,这样两边序列化不一致,会报错。

2020-09-28 14:23

@李通,见到mm头像就不认识路了是吧。说不定后面是一个络腮胡子的大汗呢。开个玩笑!楼主提的问题,很奇怪。JFinal本来就是一套web的开发框架,你非要去做桌面应用,开发桌面应用,有很多更好用的开发语言和开发工具。何必为难自己呢!

2020-09-25 18:31

GSON是挺气蛋,安卓上默认使用的就是GSON,不少东西挺是特立独行了。用了他,就的容忍他的气蛋。

2020-09-24 18:11

好的,接下来我就这么做了!

2020-09-24 17:29

刚才看了源码,确实是因为使用fst序列化,不同的序列化工具可能会增加一些额外的特征字节。我这个问题就是使用了JFinal封装的redis操作函数(这些函数都加了额外的序列化操作)。然后又用lua脚本去读数据,结果反序列化成string的时候,就出错了。现在只能是回避这个问题了,因为我控制不了lua脚本的序列化和反序列化,就只能使用jedis原生的取、放数据的函数来操作了。

2020-09-21 18:24

@JFinal,是的,我就是这么做的,使用jdk的线程池ExecutorService来控制的。我能保证线程里run函数每次循环执行,只会执行很少的点时间,一般不会超过1秒,其实就是往redis里的list压数据,和从redis的list里pop数据。这都会很快的。每次run的时候都去检查stop标志是否设置成true,如果为true,就停止run里的while,这样线程也就执行完了。从理论上来说,这种方法应该是可以保证数据不会丢失的。