2017-11-15 6 views
0

私は、Spring 4.3、Hibernate 5、およびMySQL 5.6を使用してWebアプリケーションを作成しました。セッションの休止の例外の原因となる継続的なサーバ要求

春から私は - を使用しています。1.Springハンドラインターセプタ - 各リクエストをフィルタリングします。

2.Spring MVC - REST Webリソースを管理します。

3.Spring AOP - ORMとセッション接続管理 - 宣言的アプローチ(@Transactional)

4.Hibernateとトランザクションマネージャとして。

アプリケーションはサーバーに正常にデプロイされており、ログインできます。

これで今私の問題について話すことができます: - 私はアプリケーションにログインし、hibernate DAOレイヤーから例外がスローされた後に(f5を使用して)継続的に要求に当たっています。

は毎回のように別の例外を取得: -

  1. org.springframework.orm.hibernate5.HibernateSystemException:HHH000479:コレクション[dao.domain.WebService.webServicePermissionMaps]フラッシュによって処理されませんでした()。これは、セッションの安全でない使用(例えば、複数のスレッドで同時に使用され、エンティティライフサイクルフックの間に更新されるなど)に起因すると考えられます。

  2. 内部サーバーエラー同じコレクションの2つの表現が見つかりました: dao.domain.WebService.webServicePermissionMaps; 。

3 $ {PATTERN} $ {PATTERN} java.lang.NullPointerExceptionが:ヌル org.hibernate.event.internal.AbstractFlushingEventListener.prepareCollectionFlushes(AbstractFlushingEventListener.java:178)で〜[休止状態、コア - 5.2.7.Final.jar:5.2.7.Final]

4. $ {PATTERN} $ {PATTERN} org.springframework.orm.hibernate5.HibernateSystemException:コレクションへの共有参照が見つかりました:dao.domain.WebService .webServicePermissionMaps;ネストされた例外はorg.hibernate.HibernateExceptionです:コレクションへの共有参照が見つかりました:dao.domain.WebService.webServicePermissionMaps。

5.原因:java.sql.SQLException:ステートメントが閉じられた後に操作が許可されません。 at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:998)〜[mysql-connector-java-5.1.36.jar:5.1。36]以下

は私のコードである: -

@Configuration 
@EnableWebMvc 
@Import({DbConfiguration.class}) 
@ComponentScan(basePackages = "com") 
@PropertySource("classpath:application.properties") 
public class RestConfig extends WebMvcConfigurerAdapter { 
    @Override 
    public void addInterceptors(InterceptorRegistry registry) { 
     registry.addInterceptor(authenticationInterceptor()).excludePathPatterns("/security/authenticate").excludePathPatterns("/security/ssoAuthenticate"); 
     registry.addInterceptor(authorizationInterceptor()).excludePathPatterns("/security/authenticate").excludePathPatterns("/security/ssoAuthenticate"); 
    } 

    @Bean 
    public AuthorizationInterceptor authorizationInterceptor() { 
     return new AuthorizationInterceptor(); 
    } 
} 

DBコンフィグクラス -

@Configuration 

    @EnableTransactionManagement 

    public class DbConfiguration { 

    @Bean 
    public DataSource dataSource() throws NamingException { 
      return (DataSource) new JndiTemplate().lookup(env.getRequiredProperty("jdbc.url")); 
     } 

@Bean 
@Autowired 
public LocalSessionFactoryBean sessionFactory() throws NamingException { 
    LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean(); 
    sessionFactory.setDataSource(dataSource()); 
    sessionFactory.setPackagesToScan(new String[]{"com.dao"}); 
    sessionFactory.setHibernateProperties(hibProperties()); 
    return sessionFactory; 
} 

@Bean 
@Autowired 
public HibernateTransactionManager transactionManager(SessionFactory sessionFactory) { 
    HibernateTransactionManager tm = new HibernateTransactionManager(); 
    tm.setSessionFactory(sessionFactory); 
    return tm; 
} 

private Properties hibProperties() { 
    Properties properties = new Properties(); 
    properties.put(PROPERTY_NAME_HIBERNATE_DIALECT, env.getRequiredProperty(PROPERTY_NAME_HIBERNATE_DIALECT)); 
    properties.put(PROPERTY_NAME_HIBERNATE_SHOW_SQL, "false"); 
    return properties; 
} 

}

スプリングInterceptor-

を設定しました -

}

-utilクラス(@Transactionalを持っていけない要求scope.ThisクラスにこのクラスのBeanをしたい)

@Service("webServiceUtil") 
@Scope(proxyMode = ScopedProxyMode.TARGET_CLASS, value = "request") 
public class WebServiceUtil { 

@Autowired 
private AuthorizationService authorizationService; 

public boolean isWebServiceAccessbile(Set<String> roles, String basePath, String methodType) 
      throws SysException { 

     try { 
      List<WebService> webservices = authorizationService.getWebService(roles, methodType); 

      List<String> webserviceUrl = new ArrayList<String>(); 
      for (WebService webService : webservices) { 
       webserviceUrl.add(webService.getUrl()); 
      } 

      return webserviceUrl.contains(basePath); 
     } catch (SysException e) { 
      throw e; 
     } 
    } 
} 

- サービスクラス

@Service("authorizationService") 
public class AuthorizationServiceImpl implements AuthorizationService { 

@Autowired 
private WebServiceDAO webServiceDAO; 

@Override 
    @Transactional 
    public List<WebService> getWebService(Set<String> roles, String method) throws DataAccessException { 
      return webServiceDAO.getWebServices(roles, method); 
    } 

} 

@Repository パブリッククラスWebServiceDAOImplは、WebServiceDAOを実装するBaseDAOImplを拡張します。{

private static Logger log = LoggerFactory.getLogger(WebServiceDAOImpl.class); 

@Override 
public List<WebService> getWebServices(Set<String> roles, String methodType) throws DataAccessException { 

    TypedQuery<WebService> query = null; 
    try { 
     Session session = getSessionFromSessionFactory(getSessionFactory()); 

     StringBuilder sqlString = new StringBuilder("select ws.* from WEB_SERVICE_PERMISSION_MAP wpm "+ 
       "join WEB_SERVICE ws on ws.ID = wpm.WEB_SERVICE_ID "+ 
       "join WEB_SERVICE_METHOD wsm on wsm.ID = wpm.WEB_SERVICE_METHOD_ID "+ 
       "where wpm.PERMISSION_ID in "+ 
       "(select pe.id from ROLE_PERMISSION rope "+ 
       "inner join Permission pe on rope.PERMISSIONID = pe.id "+ 
       "inner join Role ro on rope.ROLEID = ro.ID "+ 
       "where ro.name in (:roles)) and "+ 
       "wsm.NAME in (:method)"); 

     query = session.createNativeQuery(sqlString.toString(), WebService.class); 
     query.setParameter("roles", roles); 
     query.setParameter("method", methodType); 

    } catch (Exception e) { 
     log.error("Error occured in WebServiceDAOImpl.getWebServices method while getting web services for roles : "+roles+" and request method type : "+methodType, e); 
     throw new DataAccessException("Error occured in WebServiceDAOImpl.getWebServices method while getting web services for roles : "+roles+" and request method type : "+methodType, e); 
    } 
    return query.getResultList(); 
} 

}

-Base DAO 

public class BaseDAOImpl<T> implements BaseDAO<T> { 

    @Autowired 
    private SessionFactory sessionFactory; 
    private Session session; 
    private Class<T> domainClass; 

    public Session getSessionFromSessionFactory(SessionFactory sessionFactory) { 
     try { 
      session = sessionFactory.getCurrentSession(); 
     } catch (HibernateException he) { 
      log.error("Error in getSessionFromSessionFactory :" + he.getStackTrace()); 
     } 
     return session; 

    } 

    public SessionFactory getSessionFactory() { 
     return sessionFactory; 
    } 

    public void setSessionFactory(SessionFactory sessionFactory) { 
     this.sessionFactory = sessionFactory; 
    } 

    public Session getSession() { 
     return session; 
    } 

    public void setSession(Session session) { 
     this.session = session; 
    } 

} 
+0

コードを[mcve]に短縮してみてください。 – LW001

答えて

0

問題が解決されます。私がクラスレベルでセッションオブジェクトを作成したので、それは私の悪かったです。セッションオブジェクトはスレッド間で共有されます。

関連する問題