私は、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を使用して)継続的に要求に当たっています。
は毎回のように別の例外を取得: -org.springframework.orm.hibernate5.HibernateSystemException:HHH000479:コレクション[dao.domain.WebService.webServicePermissionMaps]フラッシュによって処理されませんでした()。これは、セッションの安全でない使用(例えば、複数のスレッドで同時に使用され、エンティティライフサイクルフックの間に更新されるなど)に起因すると考えられます。
内部サーバーエラー同じコレクションの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;
}
}
コードを[mcve]に短縮してみてください。 – LW001