2019-03-13 13:47

1:假定有 A、B 两个并发线程

2:没加锁的那个版本,当 A 线程执行完下面代码得到 isSigned 后被操作系统挂起:
boolean isSigned = checkSignIn(userId, RuleID);
A 线程得到的 isSigned 是 false,并且在得到后立即被操作系统挂起

3:这时,线程 B 追上来,也执行到了 boolean isSigned = checkSignIn(userId, RuleID) 这行代码,也得到一个 false 值

4:接下来,A、B 继续向下执行,必然会引起重复签到和加分

这个问题显然是与 jfinal 无关的,是 java 的多线程基础问题。解决办法除了你的加锁版本以外,还可以通过数据库事务来解决,不要将 isSigned 读到内存中来,而是要让所有动作一气呵成,全部转化成数据库操作,大致如下:
Db.tx(() -> {
String sql = "(update user set score=score + 1 where id not in(select userId from user_signed where createDate = ?)";

int n1 = Db.update(sql, 今天日期);

// 插入一条签到数据
int n2 = Db.update("insert into user_signed ...");

return n1 > 0 && n2 > 0;
});

上面假定了你要更新的表是 user 的 score 字段,仅演示了加 1,假定签到表为 user_signed

2019-03-12 20:12

每次生成的数量很多,可以用多线程并发去生成

生成二维码的代码,拿到 jfinal 的 com.jfinal.render.QrRender.java 源码,将里头的输出 OutputStream 定向到你自己的 FileOutputStream 即可

先搞定生成,然后用 java 自带的 visual vm 工具检查哪里是瓶颈,有针对性的优化性能即可

2019-03-12 20:09

先将日志配置好,让异常显形,然后根据异常来解决问题

DbPro.java 的 batch 方法上有示例代码,一定要看一下

此外,日志需要 log4j 的 jar 包与 log4j.properties 配置文件,在首页下载 jfinal demo for maven ,里头有

2019-03-12 17:59

IndexController 里面没有 public void index() 方法,仔细看一下有关路由的文档:
https://www.jfinal.com/doc/2-3

2019-03-12 17:57

jfinal 的依赖都不添加,这怎么弄

2019-03-12 17:56

enjoy 被设计为用于任何 java 开发环境,所以是不会与 requset 产生耦合的

想要获取参数,可以在 controller 中通过 keepPara() 以及 keepModel 来实现

如果希望全局都可以获取 request 对象,做一个全局拦截器,里头的代码大致如下:
public void intercept(Invocation inv) {
try {
inv.invoke();
finally {
inv.getController().setAttr("request"), inv.getController().getRequest());
}
}


然后就可以在模板中任意使用 request 对象了,例如:
#(request.getAttribute(...))

2019-03-12 16:29

@两行泪 maven 库中全都有,永久存在:
https://mvnrepository.com/search?q=jfinal

https://search.maven.org/search?q=jfinal

2019-03-12 16:27

jsp 的 maven 依赖要添加正确,文档中都有:
https://www.jfinal.com/doc/1-6

2019-03-12 15:28

@JJfinal 前面的 1、2、3、4 步就是将 jfinal 3.7-SNAPSHOT 安装到你本机的方法

2019-03-12 14:27

@JJfinal 其实就是同一个错误,当前线上的代码已经解决了,可以先用上:
1: git clone git@gitee.com:jfinal/jfinal.git
2: cd jfinal
3: 修改 pom.xml , 将其中的 skip 的 false 改为 true 值
4: mvn clean install
5:修改项目中的 jfinal 版本号为 3.7-SNAPSHOT

2019-03-12 11:54

@JJfinal 有些什么错误,一定要反馈一下,在 3.7 一起解决多好

2019-03-12 11:33

@lantsui src/main/resources 下的所有文件,默认会被 copy 到 target/classes 之下,如果有目录结构也会被保留

可能是你的项目过滤了相关配置,没有 copy 过去

2019-03-11 17:49

@libofei sqlite 的 JDBC 驱动没有很好实现 JDBC 的规范,所以就有问题,升级一下驱动到最新版本试试

2019-03-11 17:48

@两行泪 首页右侧 jfinal 3.6 all

2019-03-11 16:25

@libofei 先配置 arp.setShowSql(true) ,将 sql 输出, 看看是什么 sql 不支持

按理说 findById 的 sql 是支持的,因为就是最基本的:select * from t where id = ?