当前位置: 首页 > 面试题库 >

Struts2 +完整的Hibernate插件->会话关闭了吗?

萧远
2023-03-14
问题内容

与此问题相关(答案并没有真正指向重点):

使用Struts2hibernate-使用完整的hibernate插件或其他方法关闭会话?

我有相同的设置:Struts 2.2.3和struts2-fullhibernatecore-plugin-2.2.2-GA。我没有为Struts2和插件更改任何默认设置。我正在使用MySQL,没有其他连接池,也没有任何花哨的地方。

我在动作中使用以下代码:

FeedGroup persistent = null;
List<FeedGroup> list = objectList = (List<FeedGroup>) session.createCriteria(FeedGroup.class)
        .setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY)
        .list();
if (feedgroup.getId() != 0) // a new one
{
    persistent = (FeedGroup) session.get(FeedGroup.class, id);
}
if (persistent != null)
{
    persistent.copyValuesFromOther(feedgroup);
    session.update(persistent);
}
else
    session.save(feedgroup);

return list;

仅在大约每10种情况下 为我提供以下异常,这在我的代码中不会发生,但是很可能在插件提交事务之后发生。

org.hibernate.SessionException: Session is closed!

org.hibernate.impl.AbstractSessionImpl.errorIfClosed(AbstractSessionImpl.java:72)
org.hibernate.impl.SessionImpl.beginTransaction(SessionImpl.java:1346)
abelssoft.newspaper.actions.ActionHelper.prepare(ActionHelper.java:65)
com.opensymphony.xwork2.interceptor.PrepareInterceptor.doIntercept(PrepareInterceptor.java:167)
com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
org.apache.struts2.interceptor.ServletConfigInterceptor.intercept(ServletConfigInterceptor.java:164)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
com.opensymphony.xwork2.interceptor.AliasInterceptor.intercept(AliasInterceptor.java:190)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor.intercept(ExceptionMappingInterceptor.java:187)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:52)
org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:498)
org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77)
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:91)
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240)
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:164)
org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:462)
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:563)
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:399)
org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:317)
org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:204)
org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:311)
java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
java.lang.Thread.run(Thread.java:619)

这是我的代码逻辑上的问题还是与插件有关的问题?如果是后者,配置更改可以提供帮助吗?我想按原样使用该插件,我只是担心它不能可靠运行,或者我对数据库的理解太原始了,我的代码需要重写;-)。


问题答案:

好的,因为没有人得到答案,所以我再次调查了问题和代码,然后在谷歌上搜索了一下。

  • 事实1:该插件仅在Struts 2.1.6之前受支持,此外,我正在使用新的Tomcat 7,因此我猜想某些问题可能不适用于该插件。

  • 事实2:某个Hibernate论坛中的某人指出,如果您尝试访问该会话而不是 打开一个新 会话,则会出现此问题:Hibernate Forum:Session is Closed!(底部附近的解决方案)

似乎事实1导致注释的出现@session@transaction无法正常工作,或者我在错误地使用它们,因为它们在我的prepare方法中经常为null,此类方法是此类,并且我所有的struts2动作都源自该注释:

public abstract class ActionHelper extends ActionSupport implements Preparable, ...

在本课程中,我使用了以下注释,这些注释到目前为止通常在所有其他项目(Struts 2.1.6和Tomcat 6)中都有效:

@SessionTarget
Session db;
@TransactionTarget
Transaction transaction;
private FeedGroupDAO _feedGroupDao;

在prepare方法中,我具有防御性的编程代码,该代码检查会话是否为null,然后将其替换为当前的hibernate会话。问题是,本次会议经常关闭,如果您问if (!session.isOpen())

因此,现在在ActionHelper类的prepare方法中使用以下代码:

    public void prepare() throws Exception {
    // initialize DAO Objects with Session and Transaction

    if (session == null)
    {
        session = com.googlecode.s2hibernate.struts2.plugin.util.HibernateSessionFactory.getNewSession();
        if (!session.isOpen())
            throw new NullPointerException("Fix the code: session's not here");

        transaction = session.beginTransaction();
    }
    _feedGroupDao = new FeedGroupDAO(session,transaction); // init more DAOs with the same session/transaction

getNewSession()插件的方法似乎在openSession()内部使用了Hibernate
,因此这似乎是Hibernate论坛的有效解决方案。另外,由于struts2-fullhibernate-
plugin管理从静态getNewSession()方法获得的会话和事务,因此它仍支持OpenSessionInView模式。作为附带说明,我尝试从防御性编程转移到尽快抛出异常;-)

希望这可以对您有所帮助。



 类似资料:
  • 问题内容: 我正在使用Struts 2.2.1.1和Hibernate 3.6.2.Final。我还将C3P0用于在Tomcat 7.0.11上运行的连接池。 我遇到的问题是无法关闭我的Hibernate会话,并且我很快超过了“ hibernate.c3p0.max_size”属性中配置的最大打开连接数。 我认为这是因为我的hibernate会话已打开但从未关闭。我正在从存储在ServletCon

  • 问题内容: 我正在开始一个项目,愿意使用Struts2和Hibernate。 我应该使用 struts2-full-hibernate 插件,还是以其他方式集成它们? 在Internet上搜索使我感到困惑:这是整合它们的标准方法吗?如果没有,这是标准方法? 问题答案: 简而言之: 为前端选择一个框架(通常是MVC,然后是 Struts2 , JSF2 , Spring MVC 等等),您已经选择了

  • 问题内容: 我最近开始在应用程序中使用hibernate和c3p0作为ORM。但是,当我关闭会话工厂时,连接池不会自行关闭!这是我的应用程序中 唯一 可以进行会话操作的地方。 这是我的配置文件 请注意,空闲连接非常短的原因是它是我尚未通过集成测试的唯一方法。他们经常打开和关闭会话工厂,因此我总是用尽所有连接。正如我们在项目开始时一样,从长远来看,我认为这不是一个非常可持续的策略。 需要注意的“有趣

  • 大家好,正在使用Spring+JPA/Hibernate+Maven并尝试从DB获取记录。所以当我朗姆酒时,我的应用程序会出现如下错误 这是一段代码

  • 问题内容: 我已经“继承”了一个项目,该项目使用Spring批注来管理Hibernate的事务/会话。或至少是注定的。当前,Hibernate会话永远不会被刷新(它们设置为FLUSH_MODE_NEVER),并且DAO需要手动刷新才能将任何数据写入数据库。 同样,所有DTO对象都驻留在hibernate的内存中,最终导致OutOfMemory错误。 我相信我需要告诉Spring / Hiberna

  • 我们使用Hibernate(JPA)和Hibernate Envers来保存对象的历史。Web应用程序运行许多线程,其中一些是通过从其他应用程序调用RMI方法创建的,其中一些是由应用程序本身创建的,其中一些是为了处理超文本传输协议请求而创建的(它们生成视图)。 我们还使用视图中的开放会话模式来管理会话,因此我们的web。xml包含: 数据库是使用DAO访问的,它们都有由Spring注入的实体管理器