迷茫了,service层里到底该写啥,才比较符合j2ee的定义

问题描述

spring+hibernate 或 spring+mybatis结构以前写简单的crud,还没有感觉到问题。最近写游戏,逻辑复杂多了,比如有个功能,要求,用户登陆后,检测用户持有的道具纪录,如果发现有纪录没有的(因为游戏更新,会加新道具),要插入。我这么干的@servicepublic class UserInfoServiceImpl implements UserInfoService{private GoodsInfoService goodsInfoService;public GoodsInfoService getGoodsInfoService() {return goodsInfoService;}@Resourcepublic void setGoodsInfoService(GoodsInfoService goodsInfoService) {this.goodsInfoService = goodsInfoService;} @Override public boolean selectUserLogin(UserInfo userInfo) { List<GoodsInfo> userGoodsInfos = goodsInfoService.selectUserAllGoods(userId); // 获取玩家所有的道具 //伪代码, //遍历检测是否有缺少的然后插入新的userGoodsInfos = goodsInfoService.selectUserAllGoods(userId); //再次获得新的玩家道具列表。。。。。。。 }}坑爹的是,select用的事务传播级别为support,一般select不需要事务,但是hibernate和mybatis都存在session缓存,在selectUserLogin方法中selectUserAllGoods执行了两次,但是实际上只得到了同样的结果,第二次执行未查询数据库而是直接就从缓存中取得。而实际上结果集在数据库里已经编了,我对这个地方很纠结,不知道应该改造成什么样子,似乎service上面还需要再有一层来处理逻辑,但是service不处理逻辑,那就是纯粹的crud,把dao的工作抢去了。那像我这样检测旧纪录,插入新纪录,插入完后再次查询,并获得新结果集的service层到底该怎么写,如何设置事务传播级别?

解决方案

调整selectUserAllGoods方法的事务隔离级别,事务隔离级别分为如下几种:1. 读未提交,最低的级别,此级别可以读到其他事务未处交的数据,此级别性能最高,但是会有脏读的数据。2. 读已提交,此级别保证读到的数据都是其他事务已提交的数据,不会读到脏数据,但是不可重复读,也就是同样的条件下,第一次读到的数据和第二次读到的数据,可能是会变化的。3. 可重复读,此级别保证的是同样的条件下,第一次读到的数据和第二次读到的数据是不会变的,对应数据库的实现方式应该是就是锁行,锁定读到的那些数据行,但是此级别会有一个问题,那就是幻读,也就是说,同样的条件,第一次可能读到了10条数据,第二次可能读到了11条数据,因为多的那个数据是新插入的。4.序列化,最高隔离级别,对应的基本上就是锁表,安全性最高,但是性能最低,此级别可以保证不会出现幻读。根据你的需求,你的隔离级别应该设置为2.读已提交。mysql的默认级别是3.可重复读,所以你可能需要显式地设置你的事务隔离级别。如果你用的是spring,那么加如下注解就可以了:@Transactional(isolation = Isolation.READ_COMMITTED)如果你用的是JDBC的话,直接在Connection对象上设置隔离级别,如下:conn.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);
解决方案二:
@Override public boolean selectUserLogin(UserInfo userInfo) { List<GoodsInfo> userGoodsInfos = goodsInfoService .selectUserAllGoods(userId); // 获取玩家所有的道具 //伪代码, //遍历检测是否有缺少的然后插入新的 userGoodsInfos = goodsInfoService .selectUserAllGoods(userId); //再次获得新的玩家道具列表 。。。。。。。 } } 其实这里的逻辑还是数据库的访问呗,所以你把dao层扩展就可以了,service还是直接用就行了

时间: 2024-07-31 12:21:16

迷茫了,service层里到底该写啥,才比较符合j2ee的定义的相关文章

jsp-怎么把service层的一个model类型的数组通过controller层传递给一个JSP并显示出来

问题描述 怎么把service层的一个model类型的数组通过controller层传递给一个JSP并显示出来 如题,我的controller里的函数是: @RequestMapping("/storelogin.do")//查询到请求映射规则 public String Swelcome(@RequestParam(value="dsid")String did,@RequestParam(value="dsps")String dsps,Mo

把业务逻辑从Action层移到Service层遇到的麻烦,求解

问题描述 以前一直把逻辑全部放在action层的,service只是从被action调用,从daoInterfaceFactory里获得dao然后用dao执行crud,最近一直听别人说service层离数据库更近一点,于是开始尝试把业务逻辑放在service,但是出现了一个让我意想不到的问题,在service层里,我需要把数据库里的数据取出和外部传来的一个vo里的数据作比较,符合条件就更新这个vo,我把vo的id赋值为和数据库取出的那个对象的id一样的数值,然后用hibernate的templt

在使用spring的过程中,service层写在配置文件中好呢还是注解配置好呢?

问题描述 在使用spring的过程中,service层写在配置文件中好呢还是注解配置好呢? 在使用spring的过程中,service层写在配置文件中好呢还是注解配置好呢?在配置文件中是这样的注解配置时这样的@Service(""userService"")说说理由哦. 解决方案 一般应用性开发使用注解就可以.它较xml配置方式的优势在于省去了xml复杂的配置,而且不需要维护两套内容(xml配置方式需要维护service类和xml文件).但是如果需要修改相关内容,注

ssh框架的。。购物车用数据库dao层,service层,和action层怎么写啊

问题描述 ssh框架的..购物车用数据库dao层,service层,和action层怎么写啊 求大神给指点一下!!!!!!!!!!!!!!!!!!谢谢了!!!!!!!!!!!!!!!!!! 解决方案 dao层和service层Android中的分层----service 层domain层,dao 层,action层等设计Action层 Service层 ,modle层 和 Dao层的作用? 解决方案二: Action层 Service层 ,modle层 和 Dao层的作用?Action层 Ser

service层如何做到在属性上加@resource后,不写set和构造也可以直接注入

问题描述 service层如何做到在属性上加@resource后,不写set和构造也可以直接注入 不是说注入必须要写set或者构造方法吗,可是我在程序service层注入service,和dao的bean直接就可以注入,但是注入controller就不可以,这是为什么 解决方案 可以的,controller层可以注入service.但是像实体的话不可以注入,必须有get,set方法

如何写出一个完全和Service层剥离的dao层?

问题描述 如何写出一个完全和Service层剥离的dao层?不要在service层构造hql语句,完全只是传参数,dao层构造hql,如果换了别的持久化框架,那么只需要修改dao层就可以,service完全可以不动,这样体现出来低耦合的软件开发原则 解决方案 在Service层传来参数,使用Map传过来,然后在到层增加一个函数,专门负责在dao层生成hql语句,一般的函数都封装好了,基本要构造hql语句的,都是需要查询的,需要构造key=value形式的,所以map刚好符合,我在dao层就是这么

模板类-学数据结构是一个叫殷人昆写的,书里各种bug,下面的重载函数到底怎么写?不要+内容,只要重载格式

问题描述 学数据结构是一个叫殷人昆写的,书里各种bug,下面的重载函数到底怎么写?不要+内容,只要重载格式 #ifndef SORTEDCHAIN_INCLUDED #define SORTEDCHAIN_INCLUDED #include #include using namespace std; template struct ChainNode { E data; ChainNode* link; ChainNode(): link(NULL){}; ChainNode(E& e1, Ch

J2EE中dao层和Service层的理解

  dao层 最基本的CRUD操作,方法体里的内容一两句代码搞定.如this.save(student)等等.   Service层 ①可能调用多个dao.有一个Service,叫StudentService.比如存进去一个Student,利用的是StudentDao.要把存入Student这个操作,记录到系统日志里面,还要调用LogDao.这样就需要把两个Dao注入到StudentService里面.   ②可能加入了逻辑判断.比如存入一个student对象,那么这个student对象可能是"

ssh框架,用注释完成的,普通类怎么调用service层

问题描述 publicclassXYDBTaskextendsTimerTask{@Resource(name="deviceConfigServiceImpl")privateIDeviceConfigServicedeviceConfigService;deviceConfigService.getDeviceConfigAll();//报错空指针这种方法在action中完全可以,但是在这个类会报空指针异常..在线等 解决方案 解决方案二:@Autowired用这个注解@Resou