2016-12-14 14:37

事务的具体用法,jfinal 手册上有,在首页下载 jfinal 手册

2016-12-14 14:37

开启事务即可

2016-12-14 11:05

@jacok 多说一句,直接用 Redis.use().select(n) 切换这个方法切换数据库是无法使用的,因为 select(int) 这个方法中切换完成以后,会调用 jedis.close(),关联连接以后又会回到原来的数据库,相当于切换不成功, jedis 这样设计是为了线程安全,所以当某线程获取到连接的时间点是可以切换,但 close() 了以后,其它线程会再次获取到这个连接,如果不恢复到最初的 db,就会造成混乱

综上,select 这个方法本质上只有在 ICallback 接口中才可以正常使用,因为这个接口中的方法是处于一个连接中,并且处在连接关闭之前

还有一种 select 的使用方式是通过创建多个 RedisPlugin,让每一个不同的 RedisPlugin 通过不同的 db 参数连到不同的 db,这样在用的时候,不同的 Cache 天然就连到了不同的库,不用使用 select 这个方法即可实现多数据库的访问

2016-12-14 10:59

@qin 基本问题,仔细看手册

2016-12-14 10:56

操作 select 最好的办法是创建多个 Redis 实例,不同的 Redis 对象连接上不同的 db

2016-12-14 10:42

下面这样用即可:
Redis.call(new ICallback(){
public void call(Jedis jedis) {
}
}
这个接口本质上的好处就是在 call 方法中为你提供一个未封装过的 jedis 对象,可以使用原生的 jedis 的各种方法,而 jfinal 封装过的 Cache 里面并不会覆盖所有 jedis 的方法

2016-12-14 10:38

@luorongda 应该是跳坑里去了,再跳出来即可:https://my.oschina.net/jfinal/blog/353062

2016-12-14 10:37

将 inv.invoke(); 这一行放到 else 块中去,不要单放出来,基本的 if 分支逻辑

2016-12-14 10:36

@nbjgl 事务的用法在 jfinal 手册上有详细的例子,有两种用法,下面提供我个人常用的一种:
Db.tx(new IAtom() {
public void run() {
Db.update(sql, ...);
Db.update(sql,...);
new Xxx().set(...).set(...).save();
}
}

2016-12-13 20:05

@奋斗-now struts 的 namespace 就需要额外的 xml 配置,提交个表单还需要个 ActionForm,现在的存量用户还挺多,苦了他们了

2016-12-13 17:55

input 的 name 属性保持唯一,不要重名即可

2016-12-13 15:19

@nbjgl 那就拆分成两个 sql,大致如下:
int n = Db.update("update t set count=count+1 where where id=? and date=?", id, date);
if (n == 0) {
Xxx xxx = new Xxx();
xxx.setId(id);
xxx.setCount(1);
xxx.setDate(new Date());
xxx.save();
}
上面的代码意思是,先尝试性的让其加1,如果 n 为 0 表示记录不存在,此时就可以去插入一条记录

注意上述代码放在一个事务中,以免并发情况下插入同 id 且同 date 的记录

最好的办法还是使用缓存,让一个专门的线程处理,连事务都不需要

2016-12-13 13:26

@深海的鱼 没错,最好的办法是使用中间件,让读写分离对你的程序完全透明

2016-12-13 11:45

@奋斗-now 这就叫无招胜有招,不需要引入新的东东即可实现需要的功能

2016-12-13 11:30

@奋斗-now 天然就支持,这里是前台:
me.add("/", IndexController.class);
me.add("/project", ProjectController.class);

这里是后台:
me.add("/admin", IndexAdminController.class);
me.add("/admin/project", ProjectAdminController.class);

controllerKey 中可以包含 "/" 字符,可以自由实现 namespace 功能,并且无需引入新的概念