2016-12-14 20:14

@Irin.Chan 多多支持 jfinal 发展,2017 必定极速发展

2016-12-14 20:13

@nbjgl 事务的理解没那么简单,任何数据库实现事务都是在保障数据一致性的前提下,尽可能速度快,也就是说可以不必排队就不去排,例如两个线程同时操作同一个库,但是为不同的表,又或者操作的同一张表,但不是同一条记录,又或是同一条记录但不是同一个字段,必然会针对性能搞出一整套理论

2016-12-14 16:56

@白银骑士 多尝试一下,大前提是只要是 jdbc 支持的功能, jfinal 在本质上都支持

2016-12-14 15:56

任意选择一个数据源,然后在 sql 中直接查询就好,例如:
Db.use("mysql").find("select * from db1.table1 a join db2.table2 b on a.field = b.field")

jfinal 仅仅对 jdbc 进行了一层极其薄的封装,相当于直接将 sql 与其参数直接扔给了 JDBC,所以只要是 JDBC 支持的,jfinal 在理论上都支持,基于这个基本点,只需要研究好 jdbc 可以怎么实现就可以直接再应用于 jfinal 之上

2016-12-14 15:50

@ploolp 事务的控制策略是一个复杂问题,不同数据库有自己的一套算法,建议看看相关文档,jfinal 站在 web mvc + orm 这个层面,只管去使用数据库的事务,并不关心数据库底层如何利用事务控制保障数据的一致性

2016-12-14 15:10

@ploolp 即便是 100 个独立的程序,但数据库是同一个实例,事务是针对当前的数据库实例来说的,事务就是来保障多线程或多项目实例同时操作同一个数据库时数据一致性的

2016-12-14 14:38

@luorongda 感谢回来分享,赞一个

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 分支逻辑