2018-06-03 22:18

java web 规范下的一个 context path 问题

将 context path 设置为 "/" 即可,注意页面中的所有资源路径以 “/” 打头

2018-06-03 22:16

redis 的核心价值在于:
1:持久化
2:中心化(共享)
3:极为丰富的数据结构
4:数据结构配套的 API

ehcahce 的核心价是:
1:JVM 内缓存,速度极快,无需序列化与反序列化
2:无需安装服务端

redis 与 ehcache 的选择取决于应用场景。我个人的使用经验,尽可能只使用 ehcache, redis 仅用于在超高并发下解决雪崩问题

一般的应用用一下 ehcache ,集群环境下使用 jgroup 广播做好缓存同步就好

最后, encache 支持配置 diskPersistent="true" 来持久化数据

2018-06-03 22:09

我自己也点赞收藏一个,ExecutorService 与 AtomicLongMap 配合确实是个高招

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

@tt520 看一下控制台输出的 jfinal action report ,观察 action 请求的是那个

2018-06-03 21:56

pom.xml 配置错误

2018-06-03 21:55

启动数库事务与是否使用 cron4j 没有关系,只考虑业务是否要启动数据库事务即可

2018-06-03 21:53

@昵称而已 如果你使用的是 jfinal enjoy 引擎,热部署只需要配置一下:
engine.setDevMode(true)

2018-06-03 21:52

如果 jfinal action report 中的 parameter 这一栏中根本没有正确的参数,将精力集中解决于前端传参,然后再去关注后端

2018-06-03 21:51

看一下控制台输出的 jfinal action report 中的 parameter 这一栏中的数,然后再选择合适的 getPara 系方法

2018-06-03 21:49

主要取决于你的传值方式,看一下控制台输出的 jfinal action report 中的 parameter 这一栏中的参数,如果是数组会是下面这样:
szxm=[值1, 值2,......, 值n]

如果控制台输出的 szxm 不是数组的形式,自然就无法获取到

2018-06-03 21:47

模板中使用了 user.id, 但你的 user 本身是 null ,因此 user.id 就相当于 null.id ,必然会报错的

jfinal enjoy 对此引入了空合安全表达式,使用 user.id ?? 即可

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());
}

2018-05-31 22:08

injectListBean 可以注入 List Bean 数据,这个功能是 jfinal 所没有的,感谢你的分享

前几天还有人问题这个功能呢,好像是 @山东小木 问的这个需求,看看这个是否满足 @山东小木 需求