我正在使用Struts 2.2.1.1和Hibernate 3.6.2.Final。我还将C3P0用于在Tomcat 7.0.11上运行的连接池。
我遇到的问题是无法关闭我的Hibernate会话,并且我很快超过了“ hibernate.c3p0.max_size”属性中配置的最大打开连接数。
我认为这是因为我的hibernate会话已打开但从未关闭。我正在从存储在ServletContext中的SessionFactory打开Sessions。我尝试在Action类的finally
{}块中关闭会话,但这会引发org.hibernate.LazyInitializationException异常。
我进行了一些研究,发现了“ 完全hibernate插件”方法以及“
视图中开放会话”方法。
我假设这是一个普遍的问题,我想对最常用的解决方案有所了解。
我注意到的另一件事是Full Hibernate Plugin支持Struts
2.0.9+至2.1.6,但是我使用的是2.2.1.1。不知道这是一个问题还是网站没有更新以列出较新的版本。
非常感谢任何输入。
我从未使用过hibernate插件,但我鼓励您采用 View中 的 Open Session 模式。您肯定要关闭会话。
解决此问题的最常用方法之一是在请求开始时创建会话,将其存储在本地线程中,然后在请求结束时关闭会话。这可以通过Struts拦截器或Servlet过滤器完成。基本上:
public class HibernateSessionInterceptor extends AbstractInterceptor {
@Override
public String intercept(final ActionInvocation invocation) throws Exception {
try {
// create the session and place it in the ThreadLocal
return invocation.invoke();
} finally {
// close the session and remove it from the ThreadLocal
}
}
}
如果您使用Google Guice,则有一个基于JPA的持久性插件(guice-persist)。它使用相同的方法,但带有servlet过滤器。
问题内容: 当我按如下方式调用session.begin事务方法时: 然后我得到以下异常消息 造成此错误的原因是什么? 问题答案: 更新: 我想调用并不能保证该会话实际上是打开的。第一次,您应该使用 代替。该建议实际上与您找到的页面一致。 之前: 根据到目前为止的可用信息,我们可以得出结论,错误的原因是会话未打开;-)
问题内容: 下面的函数是我在Web应用程序中具有的按钮的actionListener,我正在从数据库中的表中删除旧选择的行,并将新行插入数据库中。 我一直在例外:会话关闭!有人可以解释一下如何在hibernate状态下关闭会话(自动吗?)以及如何使用它们。 这是该异常的详细堆栈跟踪: 谢谢, 问题答案: 在Hibernate会话显然配置为基于请求的情况下,您在会话范围内的受管Bean中使用了延迟获
问题内容: 我有一个Spring和Hibernate3在生产中运行良好的应用程序。以下是Spring的applicationContext.xml中会话工厂的配置 生产正常。 现在,对于另一个项目,我们正在迁移到Hibernate4。我们使用org.springframework.orm.hibernate4。*包中的Hibernate 4的SessionFactory,TransacionMan
问题内容: 我正在寻找展示如何将MongoDB与Hibernate集成的资源(最好是在Spring内),以便我可以在RDBMS和NoSql替代品之间进行切换:有人有这样做的经验吗? 问题答案: 您不能轻易做到这一点。Hibernate的重点是将Java对象映射到关系数据库。尽管Hibernate提取了许多细节,但您仍然需要了解关系数据库如何与诸如外键和主键之类的东西一起工作,以及运行查询对性能的影
问题内容: 我有一个胖客户端,带有25个表和约15个JInternalFrames(表的数据输入表单)的架构的java swing应用程序。我需要为DBMS交互选择直接的JDBC或ORM(在这种情况下为Spring框架hibernate)的设计选择。应用程序的构建将在将来发生。 对于这样规模的项目,hibernate会过大吗?对于是或否答案的解释将不胜感激(如果需要,甚至可以采用其他方法)。 TI
问题内容: 任何使用条件/ hql / sql告诉我查询的人。要求是用户输入电子邮件或用户名查询从表user返回用户的密码。 问题答案: 如果您正在做的只是获取一个字段,那么您可能只想执行hql(或者可能是sql)。 如果您符合条件,我相信您将撤回整个对象,只是为了最终使用一个字段。 编辑: 这是一个非常广泛的问题。这是一个教程