JFinal 启动的问题

海耶逖 发布于 2014/09/26 14:34
阅读 410
收藏 1

@JFinal  你好,这几天才接触JFinal,感觉系统清爽简洁,的确可以为我们做开发的省了很多时间。

 现在有个问题想请教。

我根据文档,试了demo程序,一切都很正常。然后尝试把手头的一个项目转成JFinal框架,发现怎么都启动不了,然后逐渐排查,结果发现原因是JFinal的启动时间,跟我数据库表的数据有关,表里面数据量大,就会启动很慢。。百万级的数据表,启动要3、4分钟,上千万的表,要十几分钟。 上亿数据的话。。系统就根本起不来了。。

我学习了一下源代码,发现原因出在JFinal每次启动的时候,都会加载plugin,然后在ActiveRecord的start()方法里面,会自动把mapping的每个数据表的结构信息读出来,生成对应的Model。我用的是oracle, 发现会每个表执行一下 “select * from *** t  where rownum = 0”来获得metadata。

问题是,如果数据表的数据很大,select * 的话会非常慢,一个百万级数据的表要几分钟。如果多几个表,启动就得耗时很久。如果要用于商用系统,这样的启动速度肯定不行吧。

一般中型或大型的系统,百万千万数据的表是比较正常的。。 可能我接触的时间不长,我想请问一下这种情况下怎么解决?

加载中
0
JFinal
JFinal

    启动时为了得到数据表的结构需要向数据库发送一条sql语句,而这条sql语句让 where 语句永远为 false,所以该 sql 所花费的时间理应是零,OracleDialect 由于我没有测试环境,所以这条 sql 是网友提供的,或许如你所说产生了该 sql 所花费时间不为 0 的情况。

    解决办法很简单,创建一个 MyOracleDialect extends OracleDialect,覆盖forTableBuilderDoBuild 方法,使用一条 select * from tableName where condition 语句,condition 让其永远为 false 即可。

   MysqlDialect 使用的是 where 1 = 2,但这条语句貌似当时在 oracle 下会被 Druid 认为是 sql 注入,所以无法使用。建议你试试其它的永false的 where condition语句,记得搞定后回来分享

0
海耶逖

按照JFinal兄的方法,覆盖方法后把 rownum = 0改成 where 1=2,测试发现果然有效,启动时间不受数据量影响了。

感谢JFinal指教~

返回顶部
顶部