2018-06-03 22:09
ExecutorService 与 AtomicLongMap 配合的使用性能会非常高,这个是亮点
有几个小建议:
1:saveAPICountsToDB.execute 中使用 lambda 会更简洁,省好几行代码
2:saveAPICallCountsToDB 中的 findFirst 方法中使用 sql 要添加一个 limit 1 性能才更好
3:saveAPICallCountsToDB 中的逻辑可以改进一下,性能会更高:
int n = Db.update("UPDATE yw_module_statistics SET count = count + ? WHERE controllerName = ? AND methodName = ? LIMIT 1", ...)
if (n == 0) {
Db.update("INSERT INTO....);
}
上面的逻辑是,默认一上来就执行 update ,得到的返回值 n 如果是 0,证明记录不存在,这个时间再执行 insert into
这样做的原因是,绝大部分情况下都会命中前一个 update,只有 action 在第一次被请求时才会命中后面的 insert into,避免掉了每次的 findFirts 判断是非常划算的
2018-06-03 21:53
@昵称而已 如果你使用的是 jfinal enjoy 引擎,热部署只需要配置一下:
engine.setDevMode(true)
2018-06-01 09:40
@jimchow 类似这样的 dependency 有很多,都仅仅是第三方集成 jfinal,而 jfinal 自身只依赖于接口,不会直接依赖于第三方
2018-05-31 22:15
@信阳 做个 MyVelocityRender 扩展一下 VelocityRender,然后覆盖父类的 render() 方法,将 VelocityRender 的所有代码 copy 到这个 render() 方法中
在这个 render 方法中添加一个 try catch,对所有异常做个明确的日志,看看 getTemplate(view) 是在 view 值是什么的时候出现的 null pointer 异常就能清楚地定位了
然后再做个 MyRenderFactory 以便切换到自己 MyVelocityRender:
public MyRenderFactory extends RenderFactory {
public Render getVeloictyRender(String view) {
return new MyVelocityRender(view));
}
}
最后配置一下即可:
public void configConstant(Constants me) {
me.setRenderFactory(new MyRenderFactory());
}