Java会话(session)和事务
会话(session)和事务的区别
⼀个session可以启动多个事务,session指⼀次连接。⼀个session中可以完成多个事务。
⼀个事务 是指⼀个操作单元,要么成功,要么失败,没有中间状态。
会话,在应⽤程序中连接数据库要执⾏连接,然后会关闭,这算⼀次会话。
事务呢,就好⽐在打开会话后要执⾏程序中的某⼀个或多个对数据库进⾏的操作。
session怎么创建关闭,及其对性能的影响
开启了事务之后,Session会⼀直占⽤⼀个连接,所以⼀个http请求对应⼀个Session会降低数据库的并发性能,应该怎么解决?
⼀个好的办法是交给Spring去管理。下⾯给出⼀个例⼦:
表现层:
假如页⾯上有⼀个Button⽤于调⽤应⽤层的转账服务:
应⽤层:
public void TransferAccountService(int id1,int id2) {
session怎么记忆ITransaction tx = _session.BeginTransaction(); //开始事务
Account a1 = session.Get<Account>(id1);
Account a2 = session.Get<Account>(id2);
//由于业务逻辑很慢,但是已经开始了事务,
//有⼀个数据库连接会被始终被占⽤。导致数据库的并发性能很低
LogicTransferAccount(a1,a2)
otherFunc();
tx.Commit(); //提交事务,为了简单,先不考虑回滚事务的情况。
}
业务逻辑层:
public void LogicTransferAccount(Account a1,Account a2) {
XX x =new XX();
x.x1=....
....
session.Save(x);.
......
......//假设业务逻辑负载,很慢,⾮数据库原因导致的
}
public void otherFunc(Account a1,Account a2) {
....
session.update(x);
...
session.save(y);
....
......//假设业务逻辑负载,很慢,⾮数据库原因导致的
}
如果每个服务层的⽅法开⼀个session,动作完了之后commit,服务层⽅法数量千千万,写太多了这种开闭很⿇烦,,,
⽽且上诉例⼦确实抛出了因为服务时延和session创建消亡机制导致的性能问题,那么在服务时延改进不了的前提下,怎么对session的这种⽅式进⾏优化?
--项⽬代码⾥⾯,是⽤Spring去管理session,连接池的⽅法,创建bean,然后有⼀个最⼤session数量的配置项(⽐如说10),session 的关闭时由Spring控制的,⽽不需要⾃⼰去新开和关闭。
java 服务层⼀个⽅法有多个DAO,它们在同⼀个事务,还是每个DAO⼀个事务?
答案:⼀个可能更好的做法是 把它们放在⼀个事务⾥
只给service的⽅法配置事务,但不给dao的⽅法配置事务,那就能保存service调⽤dao的n个⽅法(增删改查)都在同⼀个事务中 ,应该让dao层把异常向service层抛,由它来回滚事务,因为它是事务发起者
像这个整个service配置⼀个事务,SQL⾥⾯可以做些⽐较灵活的操作,⽐如说:A表主键是B的外键,这样会要求:先要在A中添加数据,然后才可以在B中添加数据,代码⾥⾯,因为整个service⼀个事务,所以可以先在B⾥⾯加,再在A⾥⾯加,然后统⼀提交,或者把个顺序颠倒⼀下也是可以的,反正事务是⼀起提交i的,就不会有这种因为主外键的约束导致的SQL失败。
@Service("AService")
@Transactional
// @Transactional(timeout = Timeout.LEVEL_NINE)
public class AServiceImpl implements AService {
XXXXXXXXXXXXXXXXXX
}
当然,还有⼀种情况,有些情况下服务层的某个⽅法可能需要⾃⼰单独的起⼀个事务,然后先去提交
@Service("AService")
@Transactional
// @Transactional(timeout = Timeout.LEVEL_NINE)
public class AServiceImpl implements AService {
XXXXXXXXXXXXXXXXXX
@Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRES_NEW)
@Override
public void save(Bill bill) throws Exception {
XXX
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论