在用hibernate3的过程中
(先说明下,项目中没有用到Spring),出现过1次由于Oracle数据库无法分发连接造成项目不能正常运行的错误。但当时数据库的设置的可连接数是500,而且当时我用plus查询v$session时数量只有93个。之后查看日志文件及分析项目组各人当时手头的工作时,发现有可能是因为有人在拉报表时,造成数据库瞬间摒死。
由于平时数据库的连接一直很稳定,对于关闭session的问题也是凭以往的经验而行。但这次我们的疏忽造成了不良影响,因此,我自己总结了下对关闭session问题的想法和疑惑,有不对的地方和疑点,希望有心人多多指教,不盛感激!
我的理解,线程绑定是对Hibernate中线程进行有效管理的一种方式。由SessionFactory的多线程性,若想实现多线程共享一个Session实例是不行的。而解决办法可以为每个线程放一个Session的副本,并由每个线程自己维护这个Session,包括获得、使用、销毁。这样,可以实现Session的线程内共享。
在我看来,Session的线程内共享,是指,Session做为一种持久化的工具,可以用来将其中的各种对象与数据库之间进行交互。所以,直到未被销毁前,Session可以用来做各种各样的操作,如查询、保存、修改、删除等。但任何数据库都有最大连接限制,所以,当完成对数据库的操作后,必须断开与数据库的连接。然而,session只要不销毁,它与数据库的连接将一直存在,并随着用户操作的增加,连接数将不断增加。
因此,这里有个矛盾:既要实现session的共享,也即只用一个session来完成不同的操作,又要尽量使每个操作在完成后断开连接,也即关闭session。
对此,很多人在编程时可能都是这样做的:
1.每完成一个操作,都关闭当前线程中的Session,当再次需要时,由线程再次从SessionFactory中去获取。这样,可以保证所有的连接都能被释放,不会造成数据库连接次数的爆满。但这样做的话,线程内的Session一获得,一个操作后就销毁了,下一个操作还要到SessionFactory中去取,线程内共享Session还有什么意义?。
2.所有操作均不关闭Session,而是在每个请求结束后统一关闭。这样,很好地实现了线程内Session的共享。但这样的话,每个用户占用的连接数将大大增加,用户数量很多的话,很可能在某个时刻连接数没有得到及时释放,造成数据库连接爆了。打个比方,有个循环,内中有个未关闭Session的方法。如果想在这个循环内共享Session,在循环后再关闭这个Session,就很可能造成连接数在瞬间爆增(尤其在循环很大的情况下)。
有些人可能这样想:我在一个请求(jsp页面或servlet)的最后一个方法中关闭Session不就行了吗?然而,在当前页面中,这个方法可能是最后用到的,但到了另外一个页面中,说不定是第一个用到的。假如每个页面都在最后一个使用的方法上关闭Session,也许在XX个页面之后,所有的方法都关闭Session了。
分享到:
相关推荐
本篇将详细探讨如何在JSP(Java Server Pages)环境中利用session对象来存储与用户相关数据。 首先,我们需要理解什么是Session。在Web应用中,每当用户打开一个网站并进行交互时,服务器都会为这个用户创建一个...
在前端开发中,Session是用于跟踪用户状态的一种技术,尤其在多页面应用和单页面应用程序(SPA)中显得尤为重要。JavaScript Session,顾名思义,就是利用JavaScript来管理用户会话的数据存储。它允许开发者在用户...
SSH(struts+spring+hibernate)的jar包 SSH 通常指的是 Struts2 做前端控制器,Spring 管理各层的组件,Hibernate 负责持久化层。 一个请求在Struts2框架中的处理大概分为以下几个步骤: 1、客户端初始化一个指向...
代码为国外网站上的案例,创建了Eclipse项目后,测试跑通了。通过Hibernate内部的sesssion访问SQL数据库,插入记录,删除记录(内加代码测试),查询数据展现。数据库为SQL Server,看下xml内部的配置即明白
同时,可以通过Session ID来标识用户的会话,当用户登录时,可以关联其Session,确保购物车信息与用户账号绑定。 6. **安全性与优化**:尽管Session提供了一种安全的用户状态管理方式,但过度依赖服务器存储可能...
### Session页面之间传值 #### 知识点一:Session的概念与作用 Session是一种服务器端技术,用于在用户的会话期间存储用户特定的信息。当用户访问网站时,服务器可能会为该用户创建一个Session对象来存储关于该...
用asp.net中sesssion实现购物车功能
本项目"todo-with-user-session-builtio"提供了一个示例,展示了如何利用Built.io作为后端服务,实现一个带有用户会话功能的待办事项(Todo)应用。这个应用主要使用JavaScript编写,旨在帮助开发者了解如何整合...
然后使用QueryCore.sesssion(session)分配给Core转换。 将转换注册为querycore 。 QueryCore . session ( session ) ;transforms [ "querycore" ] = QueryCore ; 这是一个完整的例子。 import "@mapd/connector/...
内容包括 1、用户访问sesssion的实时分析和根据不同条件进行过滤 2、根据用户的点击次数,下单次数,支付次数进行二次排序 3、将结果实现存入数据库,并用echart进行展示
对等身份 安装 npm install peer-identity 用法 const PeerIdentity = require ( 'peer-identity' ) ; const peerIdentity = new PeerIdentity ( ) ; Webpack 在构建浏览器时,请使用... 存储在this.sesssion.publicK
配置MATLAB环境并下载测试数据集 % within a MATLAB sesssion type: cd cmapM setup 文档 软件需求 Matlab R2014b 及以上 统计工具箱 并行处理工具箱 [可选] 引文 如果您发现 cmapM 在您的研究中有用,请引用: ...
(6)**训练模型**:使用`tf.train.Sesssion`创建会话,通过`sess.run`执行训练操作,包括前向传播和反向传播。 (7)**监控训练过程**:记录训练过程中的损失和准确率,可以使用`tf.summary`和`tf.summary....
语言:English 这是最惊人的Salesforce Chrome扩展程序 Enrico Murru在DF17会议上制作的示例Chrome扩展程序(构建自己的令人叹为观止的Salesforce Chrome...参见https://github.com/enreeco/sf-df17-chrome-ext-sesssion
CEH:欧盟理事会认证的道德黑客312-50的考试准备