2016-10-30 18:49

@JFinal 谢谢波总的耐心指点。\\^_^//

2016-10-30 15:51

@JFinal 波总,上面提到new Xxx().put()/save/update后,那我业务层的public static final LogService me = new LogService 在这段,在多线程下可以在控制层正常使用的吧?,我个人认为在每个操作数据折地方已经修改为new Xxx().put()/save/update/find后,其他地方使用LogService.me.xxx()方法的话就不有线程不安全问题出现了,不知道是否理解正确,请教下波总^_^_^。

2016-10-30 09:24

@JFinal 嗯,那我在业务层new Xxx().put()/save/update的话,因为每调用一次对像都被new一次,在堆中分配一块新的内存空间,这样的话就不存在对象共享了。

2016-10-29 23:21

@JFinal 我这个,参照波您回答这个做的:http://www.jfinal.com/feedback/296,不过我在保存是用了.put,哈哈。

2016-10-29 22:34

@JFinal
1、dao不是静态的哦,service层定义:
/**
* 日志服务层
* Created by slsoft on 2016/10/6.
*/
public class LogService {
public static final LogService me = new LogService();
final SLog dao = new SLog();

2、现在修改成:
/**
* 日志服务层
* Created by slsoft on 2016/10/6.
*/
public class LogService {
public static final LogService me = new LogService();
SLog dao = new SLog();
把final去掉问题解决了。

2016-10-17 14:36

JFinal开发是不用什么@serive注解的,在这块非常灵活的如:
public class TestService{
public static final TestService me = new TestService();
}
控制层:
public void TestController{
public void index(){
TestService.me.xxx();
}
}
就好了,如果想用aop的话如:
TestService testService = Duang.duang(TestService.class)
或TestService testService = Enhancer.enhance(TestService.class)然后就可以在控制层调用服务层的方法了。

2016-10-13 10:50

@JFinal 波总这个是必须的,支持JFinal支持社区发展。^_^^_^

2016-10-13 10:37

@JFinal 用Db.find做查询跑到这个com.jfinal.plugin.activerecord包下的SqlReporter类中的方法:
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
try {
if (method.getName().equals("prepareStatement")) {
String info = "Sql: " + args[0];
if (logOn)
log.info(info);
else
System.out.println(info);
}
return method.invoke(conn, args);
} catch (InvocationTargetException e) {
throw e.getTargetException();
}
}
}
走到这里:method.invoke(conn, args);就抛异常了。

其中args参数是:
select cast(sum(case when HSNB in('成药费','西药费', '中药费','疫苗费') then ORD_TOT_PRC else null end) / sum(ORD_TOT_PRC) * 100.0 as decimal(18,2)) as ypbl, cast(sum(case when HSNB in('检查费','诊查费') then ORD_TOT_PRC else null end) / sum(ORD_TOT_PRC) * 100.0 as decimal(18,2)) as jcbl, cast(sum(case when HSNB in('治疗费') then ORD_TOT_PRC else null end) / sum(ORD_TOT_PRC) * 100.0 as decimal(18,2)) as zlbl, cast(sum(case when HSNB in('材料费','手术费','注射费') then ORD_TOT_PRC else null end) / sum(ORD_TOT_PRC) * 100.0 as decimal(18,2)) as qtbl from CHRG_LIST_V where CHRG_DT BETWEEN '2015-11-11 00:00:00' AND '2015-11-11 23:59:59' and ORD_WIDE = '1'

排查过程:
第一步JFinal追踪:提示lang包下NumberUtils没找到,这个工具类主要用作数据类型转换用的,从这点来判断肯定是JFinal 操作sqlserver数据库,执行操作过程中转换数据类型时报错了,但即使是自己手动添加apache commons lang下去也是解决不了,还是抛出异常,感觉还是不对头异常不成立。
第二步alibaba druid追踪,踪进入method.invoke方法进入FilterChainImpl类执行到这个方法:
public PreparedStatementProxy connection_prepareStatement(ConnectionProxy connection, String sql) throws SQLException {
if(this.pos < this.filterSize) {
return this.nextFilter().connection_prepareStatement(this, connection, sql);
} else {
PreparedStatement statement = connection.getRawObject().prepareStatement(sql);
return this.wrap(connection, statement, sql);
}
}
走到这里:this.nextFilter().connection_prepareStatement(this, connection, sql);就开始抛异常。
最终判断,alibaba druid 1.0.24 版本存sql server 连接数据在bug,立马换1.0.26最新版本再跑,问题解决了。^_^YY

2016-10-05 22:55

是哦,不过ssh用jrebel的话修改除web.xml之外的.xml文件是会自动热加载和更新的,但jfinal这块是有些特殊,按理.java是会自动更新加载的但是配置文件是在是通过web.xml配置并启动加载所以,比较另类些。^_^!!如果是新手估计在这折腾不少。

2016-09-23 09:22

@JFinal 这个搞个官方支持下,也挺不错的,常用插件了。

2016-09-23 08:32

@海哥 支持海哥的提义,哈哈。