波总,跟您请教个问题代码如下^_^//:
1、服务层代码:
/** * 保存 * @param log * @return */ public boolean save(SLog log) { if (null == log) { log = new SLog(); } if (dao.put(log).save()) { if (!sl.isEmpty(log.getId())) { CacheKit.remove(SLog.CacheName.NAME, log.getId()); } else { CacheKit.remove(SLog.CacheName.NAME, SLog.CacheKey.KEY); } return true; } return false; }
2、控制层代码:
if (1 == fn) { Resource resource = matchRecordLogUrl(request); if (null != resource) { SLog sLog = new SLog(); int uid = controller.getCookieToInt(Const.Co._USER, 1); String username = "游客"; if (!sl.isEmpty(uid)) { username = UserService.me.findById(uid).getName(); } sLog.setUsername(username); sLog.setName(resource.getName()); sLog.setUrl(resource.getUrl()); sLog.setType(1); sLog.setIp(request.getRemoteAddr()); sLog.setInfo("成功!"); sLog.setStatus(fn); sLog.setCreateAt(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); LogService.me.save(sLog); } }
备注:
(1)、数据库是mysql库,数据库主键已经设置自动增长,数据保存时主键不自增问题。
(2)、参数传递是javabean模式,也就是说在做参数传递时,传的是javabean 的 getxx或setxx的这种形式。
项目:JFinal
dao 是 static 声明的全局共享的东西,不同线程在使用它的时候,数据是共享的,那么你第一次 dao.put 进去东西,第二再使用的时候与第一次会混乱,如果是多线程并发使用,数据是乱窜
所以 jfinal 最佳实践已经明确明说了,要将 Model 中的 dao 彻底删掉,避免这样的误用
删掉以后,查询的时候可以 new Xxx().find(sql) 这样就永远没有线程安全问题了