2016-09-07 21:36

@chenwang 用一下 Db.execute(ICallback) 在 ICallback 接口的 call 方法中用 connection 对象调用存储过程。对于有些存储过程,使用一下 Db.update(...) 或者 Db.query(...) 也可以直接调用

2016-09-07 15:51

界面做得很专业啊, UI 也是你自己做的? 源代码能分享出来不,可以在项目频道发布出项目,起个好名字

2016-09-06 22:18

@冬眠的蛇 jfinal 社区介绍的资源还是很靠谱的,多多关注社区动态,社区将不遗余力地提供最优质的资源分享给大家

2016-09-06 18:03

可能是在连网情况下,会请求某些非本地的资源,而等待这个资源返回花了很长时间,断网情况下没有请求该资源,所以很快。检查一下是不是有数据库连接、socket 连接之类的外网请求

2016-09-06 17:31

做缓存没有很通用的方式,只能根据情况来做选择,但以上谈到的让 XxxService 统一管理 Xxx 的缓存是极重要的,其它的 YyyService 需要 Xxx 数据时,只能通过 XxxService 来获取,不能自己直接查库获取

2016-09-06 17:29

至于对于 delete 操作,可以是整体清掉 id list,也可以是在读二级缓存时,发现得到的是 null,此时就断定有数据被 delete,那么 id list 也需要重新查库

2016-09-06 17:28

@潇洒太爷 findByOther 可以是整个清掉缓存,这个属于大粒度使用缓存,还可以引入两级缓存,一级让这个 findByOther 只缓存 id 值的列表,如 List idList,通过列表再去二级缓存中去取具体的 model值,好处是不担心 update 操作,总是获取到最新的

2016-09-06 17:24

jfinal 启动顺序大致为:
1:JFinalFilter.init()
2:YourJFinalConfig.configConstant(...)
3:YourJFinalConfig.configRoute(...)
4:YourJFinalConfig.configPlugin(...)
5:YourJFinalConfig.configInterceptor(...)
6:YourJFinalConfig.configHandler(...)
ServerSocket 应该是添加在 web.xml 之中,与 jfinal 无关

2016-09-06 17:20

3:每个 service 类中都有一个 private void clearCache(int id) 这样的方法,只供该业务的其它方法调用,例如 delete、update 这类方法在最后一行,总是调用一下 clearCache(id)
4:如果其它业务一定要要直接查询数据来获取其它业务的数据,例如在 UserService 中获取本该由 ProjectService 来管理的 project 表中的数据,那么查询得到的结果不能缓存,否则内存中会有多个版本

2016-09-06 17:16

以上关于缓存粒度的问题细节不再多说,下面给出在使用缓存时的一些经验:
1:先假定缓存不存在,先实现功能,业务功能不依赖于缓存,缓存只作为一个辅助
2:引入业务层,将所有业务放在业务层之中,并且极度重要的是对于某个 model 的数据库操作尽可能放在这个 model 所对应的业务中,不要要数据库操作散步到其它业务中。 好处是当前业务可以很方便地维护自己该负责的缓存,例如:project 这表表对应的是 ProjectService,里面有 getById、deleteById、update 这样的方法,当用户使用 getById 的时候先是从缓存取,缓存没有的时候则从数据库取并存入缓存。然后 deleteById、update 这样的方法中,只需要 remove 掉相应的缓存就可以了,下次 getById 到来时自然会去库中得到最新数据。其它业务需要使用 project 数据时,只能通过 ProjectService 来获取,这样的话,整个 project 的缓存逻辑全部只由 ProjectService 负责,对外界是透明的,极度可靠

2016-09-06 17:11

总得来说,不同的场景使用不同的缓存策略,大方向上可以分为细粒度与大粒度缓存
1:细粒度来说,缓存的更新、与同步精确到每一个 model,例如 jfinal 对所有的用户 model 采用的细粒度方案,因为整个社区处处都要用到不同用户的头像、昵称、id 这样的数据,当某个用户的数据更新了,只需要清掉缓存中的对应的用户就行

2:大粒度来说,缓存的是整个 list、paginate 之类的数据,例如对于所有 project 数据,缓存 list,当 project 中任何数据有更新时,清掉缓存中的整个 list 缓存

2016-09-06 16:40

@潇洒太爷 开个新贴详细描述下吧,简单一两句说不清楚

2016-09-06 16:07

serverMap = common_common.getMap('${server_infos}'); 这种用法没有见到过,用的是啥模板?

2016-09-06 16:04

Db.tx 默认是对主数据源应用事务,而你的代码在 run 方法内用的 Db.use(...) 切换到了另一个数据源,所以没有生效,解决办法是,在 Db.tx 时指令数据源与内部的 Db.use(...) 数据源一致,Db.tx 方法可以指定数据源