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 方法可以指定数据源

2016-09-06 15:57

JPress 之家简洁好看,资源很有吸引力啊,+1024 个赞 ^_^

2016-09-05 23:34

@lyh061619 一台阿里云而已

2016-09-05 21:51

@海哥 那还不错,七牛这么好提供免费的云存储? 他靠什么营利啊?

2016-09-05 21:07

@海哥 这种方式是需要写额外管理代码的吧,还是习惯于项目是一个整体,懒人一个

2016-09-05 16:41

不是不想支持,只是 jfinal 社区带宽很有限,下载特别消耗带宽,会影响其他用户使用体验。在以后社区捐助支持更多以后,会添加带宽考虑支持这个需求

2016-09-05 16:03

@林栋 用 count 获取,你需要在私信等需要生成提醒的字段中添加字段,例如添加一个 isRead 字段,然后你需要维护这个字段,数据量大以后这个字段会占用一定空间,并且 count 也需要消耗性能
referMe 到来的时候字段加 1 ,不是关键数据,多出一个少出一个无所谓,而且这个值是访问后立即清零的,相当于随时能回到正确的状态,你在实践中去写代码的时候就能体会现这样设计的好处

2016-09-05 15:57

@林栋 所以静态资源全用的 nginx 接管,例如 css、js、jpg、png 等等,nginx 只需要设置 root /var/www/jfinal_com 即可,整体覆盖是指打包成 war 包以后,再用 war 包中的文件覆盖全部,当然,有时候会为了去掉一些不用的文件,是将原来部署的文件,只保留 upload 目录,其它全部删掉

2016-09-05 14:36

@Romeo 不用手动 new,放在业务层就好,没有人会这么用:UserService.me().dao.save(),但有人会这么用: User.dao.save()