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