2017-03-22 12:26

@cleverbug 先直接改源码试用下,然后反馈给我是不是好用,后续版本会考虑改进这里,要改进只需要在 init 上添加一个 protected 即可

2017-03-22 12:24

1:代码大致是可以的,但不够简洁,例如第七行的 find 可以改为 findFirst。更好的方案后面说
2:如果动态创建 ActiveRecordPlugin 与其依赖的 DuirdPlugin,那么都需要动态回收资源,需要调用 ActiveRecordPlugin 以及 DruidPlugin 的 stop() 方法

创建数据库连接池会有一定的延迟,所以通常是系统初始化的时候创建,下面给出新的方案:
1:在系统启动的时候,读出所有客户有关数据库的信息,一次性统一创建好 ActiveRecordPlugin
2:如果后期有新客户加入,那么在加入的同时就创建好 ActiveRecordPlugin
3:为了避免多个 ActiveRecordPlugin 在启动时就耗尽数据库允许的最大连接数,所以要需要控制 DruidPlugin 的初始连接个数
4:创建一个名为 ConfigNameInterceptor 的全局拦截器,里面放一个 ThreadLocal属性来存放当前请求客户的 configName,通过查询主数据库设定好合适的 configName
5:用户请求某个业务时,业务从 ConfigNameInterceptor 的 ThreadLocal 中获取 configName
6:代码中统一: Db.use(configName).find(...) ,这样就实现了业务层对所有客户都是完全一样代码的目标

2017-03-22 12:11

添加一个全局拦截器: me.add(new SessionInViewInterceptor()),然后在页面这样获取数据:
#(session.obj.field)

2017-03-22 12:10

@zhongshg 还好我的回复比较详细,要不然只发现部分原因,仍然无法解决,多多支持社区发展

2017-03-22 12:06

添加 ContextHandler("ctx") 以后,在页面中直接 #(ctx) 就可以获取了

2017-03-21 22:01

这些代码是演示如何手动去切换 locale,也可以不用手动做这事,jfinal 有一套自动化的策略,只需要提供好相应的 properties 文件就可以了

2017-03-21 21:56

我刚测试了一下,是绝对可以的,你在本地测试一下下面的代码:

import com.jfinal.plugin.cron4j.Cron4jPlugin;
import com.jfinal.plugin.cron4j.ITask;

public class Test {

public static void main(String[] args) {
new Cron4jPlugin().addTask("* * * * *", new ITask() {
public void run() {
System.out.println("运行");
}

public void stop() {
System.out.println("停止");
}
}).start();

try {
System.out.println("主线程睡眠");
Thread.currentThread().sleep(99999999);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

2017-03-21 21:51

使用拦截器支持事务时,不要将内部的异常吃掉,所以 try catch 中需要将异常再次抛出来,这个可能是在你的代码中没有支持事务的根本原因

此外,还要注意 mysql 只有 innodb 引擎才支持事务,myisam 天然不支持事务,还要注意事务级别是否匹配当前的数据库操作,如果是 jfinal 3.0 版本,默认级别比较高,一般不需要调整

最后,上面的代码中,既然 savePay 中已经使用了 @Before 声明了事务,那么在 enhance 时就不需要添加 Tx.class 这个参数了

最后的最后,个人一般建议直接使用 Db.tx(...) 的方式支持事务,控制起来更加方便,例如,可以 try catch,然后在 catch 中 return false 就可以控制事务回滚了,然后通过得到 Db.tx(...) 方法的返回值再控制对上层响应什么返回值会更方便

2017-03-21 16:34

@zhaozhihong sql 中最后的分号去掉没有,注意将 sql 彻底改造成 JDBC 支持的格式

2017-03-21 15:12

用一下 renderFile(new File("D:/download/myFile.zip")) 这种形式,可以指定任意路径下的文件,这个在 jfinal 手册中应该有说明

如果没有说明,可以注意一下 jfinal 大部分 API 都会提供相应的重载方法,这些重载方法可以实现不同的需求

2017-03-21 15:09

对代码进行单步调试,确认一下是哪个地方很慢

2017-03-21 14:56

@英俊的小铁匠 你的建议已经添加到了改进列表之中,后续如果有两到三个人提出同样的需求会考虑添加该 API,感谢你的反馈

2017-03-21 14:54

@hmgx 输出要等到第 0 秒,不是一开启会有反应,cron 表达式为 * * * * * 的含义一定要清楚

2017-03-20 21:06

升级到 jfinal 3.0,这个版本已经去掉了对 order by 子句的处理

以前的版本用正则去掉了分页方法中用于查询总记录数 sql 中的 order by 是为了提升性能,因为 select count(*) ... 这类 sql 是否存在 order by 并不影响最终的结果