程序代码public class DaoReal extends HibernateDaoSupport implements Dao {
public List<User>getAll() {
return super.getHibernateTemplate().find("from User")}} 在上面的这个例子中,我们并没有关闭Session,但程序并没有任何问题,那是因为Spring已经帮我们关闭了。那么再看一个例子:
程序代码public class DaoReal extends HibernateDaoSupport implements Dao {
public List<User>getAll() {
return super.getSession().createQuery("from User").list()}} 这个例子会不会有问题呢?的确,上面的例子中隐藏了一个问题,数据库连接并没有被关闭,在我们的印象中这件事似乎应该是Spring的。程序执行后,好像也没有什么问题,但是连续执行该语句n次(n<=最大连接数,如果没有指定最大连接数,那么默认为10次)后,系统处于等待状态,不会继续执行了,控制台上并没有输出任何信息。打开log文件,发现系统抛出java.lang.IllegalStateException: Pool not open的异常,无法打开连接。这说明系统连接池中所有的连接都在使用中。那么我们手动关闭Session后,应该就没有问题了吧!是这样吗?修改我们的例子,如下:
程序代码public class DaoReal extends HibernateDaoSupport implements Dao {
public List<User>getAll() {
Session s = super.getSession()try {return s.createQuery("from User").list()
} finally {
s.close()}}} 执行n遍后依然停止响应。问题出在哪里呢?其实Spring的Session总是与某个线程绑定的,而这个线程往往就是承载Servlet或Jsp的那个线程,也就是说,它的生命周期scope是request的。在上面的例子中,我们利用getSession强制获得了Hibernate的Session,这个Session可能是当前事务中之前使用过的,或者可能是一个新的,并不在当前事务中,Spring只对当前事务中的Session进行关闭。
要解决这个问题,方法有很多。可以使用我们之前讲到过的getHibernateTemplate().find()。也可以设定HibernateTemplate的AllowCreate为True,并在finally中关闭Session。也可以将true作为参数传递到super.getSession(..)方法中取得Session。这里的true表示允许创建。
Spring Session 是Spring家族中的一个子项目,它提供一组API和实现,用于管理用户的session信息,它把servlet容器实现的httpSession替换为spring-session,专注于解决 session管理问题,Session信息存储在Redis中,可简单快速且无缝的集成到我们的应用中。
是指在一个浏览器访问多个 Web 服务时,服务端的 Session 数据需要共享。
通过对应用服务器的配置开启服务器的 Session 复制功能,在集群中的几台服务器之间同步 Session 对象,使得每台服务器上都保存所有的 Session 信息,这样任何一台宕机都不会导致 Session 的数据丢失,服务器使用 Session 时,直接从本地获取。这种方式的缺点也比较明显。因为 Session 需要时时同步,并且同步过程是有应用服务器来完成,由此对服务器的性能损耗也比较大。
利用 hash 算法,比如 nginx 的 ip_hash,使得同一个 Ip 的请求分发到同一台服务器上。 这种方式不符合对系统的高可用要求,因为一旦某台服务器宕机,那么该机器上的 Session 也就不复存在了,用户请求切换到其他机器后么有 Session,无法完成业务处理。
Session 记录在客户端,每次请求服务器的时候,将 Session 放在请求中发送给服务器, 服务器处理完请求后再将修改后的 Session 响应给客户端。这里的客户端就是 cookie。 利用 cookie 记录 Session 的也有缺点,比如受 cookie 大小的限制,能记录的信息有限, 安全性低,每次请求响应都需要传递 cookie,影响性能,如果用户关闭 cookie,访问就不正常。
Session 服务器可以解决上面的所有的问题,利用独立部署的 Session 服务器统一管理 Session,服务器每次读写 Session 时,都访问 Session 服务器。 对于 Session 服务器,我们可以使用 Redis 或者 MongoDB 等内存数据库来保存 Session 中的数据,以此替换掉服务中的 HttpSession。达到 Session 共享的效果。
本课程详细讲解Spring session如何解决集群模式/分布式/跨域环境下,实现session的同步共享问题,是构建大规模应用必须要考虑的一个问题。
SpringSession视频教程
https://www.bilibili.com/video/BV1iK411p7dZ
SpringSession资料下载
http://www.bjpowernode.com/?toutiao
•001.SpringSession: Session机制
•002.SpringSession: Session机制存放过程
•003.SpringSession: 集群后丢失Session原因
•004.SpringSession: Session共享方案介绍
•005.SpringSession: SpringSession介绍
•006.SpringSession: Session丢失演示
•007.SpringSession: 集成SpringSession实现Session共享
•008.SpringSession: Redis中的Session数据存放结构
•009.SpringSession: SpringSession使用场景
•010.SpringSession: 同域名下不同项目的Session共享
•011.SpringSession: 同根据域名不同二级子域名的Session共享
•012.SpringSession: 单点登录
•013.SpringSession: P2P项目Session共享
•014.SpringSession: SpringBoot集成SpringSession
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)