文档章节

【待解决】SpringMVC+Hibernate4的Session问题

 海岸Thirty
发布于 2017/04/09 17:40
字数 921
阅读 20
收藏 0
点赞 0
评论 0

写在前面的话:莫名奇妙的问题好了,但是没有按照我的想法来,测试了下最终生效的是

@EnableTransactionManagement。

先看看代码吧,以后有什么突破再更新!或者最好有大神帮我看看吧。

(两次搭项目都这样,哎。。。已经不是人品问题了我觉得)

 

OpenSessionInViewFilter,这个具好用,配置上HTTP就不报下面这个错了

Could not obtain transaction-synchronized Session for current thread

这里给份注解配置吧

/**
 * 所有实现了WebApplicationInitializer接口的类都会在容器启动时自动被加载运行,用@Order注解设定加载顺序
 * 这是servlet3.0+后加入的特性,web.xml中可以不需要配置内容,都硬编码到WebApplicationInitializer的实现类中
  * <ul>
 *  <li>处理URL上下文</li>
 *  <li>定义ServletMapping映射:.do,.json,.jsonp</li>
 *  <li>加载配置文件,相当于引入applicationContext.xml</li>
 * </ul>
 * @author lanxb
 * @create 2016年5月24日
 *
 */
@Order(2)
public class WebInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
	
	/*****  省略无关的内容   *********/
 
    /*
	  * 注册过滤器,映射路径与DispatcherServlet一致,路径不一致的过滤器需要注册到另外的WebApplicationInitializer中
	  */
    @Override
    protected Filter[] getServletFilters() {
        // 请求编码转换
    	CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
        characterEncodingFilter.setEncoding("UTF-8");
        characterEncodingFilter.setForceEncoding(true);
        
        // OpenSession
        OpenSessionInViewFilter hibernateSessionInViewFilter = new OpenSessionInViewFilter();
        return new Filter[] {characterEncodingFilter,hibernateSessionInViewFilter};
    }
  
  


}

 

因为有一个启动时到数据库加载配置的过程,由于不经过上面的filter,所以一直报错。

    @OpenSession
	@Transactional(readOnly=true)
	@Override
	public void afterPropertiesSet() throws Exception {
		List<AppConf> list = iwxMsgCryptDao.getListByHQL("from AppConf");
		logger.info("refres app configs begin : {}",mapConfig.size());
		if(list==null || list.isEmpty()){
			synchronized (mapConfig) {
				mapConfig.clear();
			}
		}else{
			Map<String,AppConf> mapConfig = new HashMap<>(); 
			for(AppConf conf:list){
				logger.info("\t add app config:{}",conf.getAppId());
				// 生成下keyData
				conf.setAesKey(conf.getAesKey());
				mapConfig.put(conf.getAppId(), conf);
			}
			this.mapConfig = mapConfig;
		}
		logger.info("refres app configs end : {}",mapConfig.size());
	}

于是查了查增加了下面的配置OpenSessionInterceptor:

想通过AspectJ代理带有@OpenSession注解的方法,在执行的时候获取HibernateSession

主要是:

openSessionPointcut()、openSessionInterceptor()然后openSessionAdvisor()、proxyConfig()


@Configuration
@EnableTransactionManagement
public class DBConfig implements TransactionManagementConfigurer{

	final static Logger logger = LoggerFactory.getLogger(DBConfig.class);
	
	@Value("${hibernate.dialect:org.hibernate.dialect.MySQL5Dialect}")
	String hibernate_dialect;
	
	@Value("${jdbc.driver}")  
    String driverClass;  
    @Value("${jdbc.url}")  
    String url;  
    @Value("${jdbc.username}")  
    String userName;  
    @Value("${jdbc.password}")  
    String passWord;
    
    @Value("${jdbc.initialSize:1}") 
    int initialSize=1; 
	//#定义最大连接数  
    @Value("${jdbc.maxActive:20}") 
	int maxActive=20;
	//#定义最大空闲  
    @Value("${jdbc.maxIdle:20}") 
	int maxIdle=20;
	//#定义最小空闲  
    @Value("${jdbc.minIdle:1}") 
	int minIdle=1;
	//#定义最长等待时间  
    @Value("${jdbc.maxWait:60000}") 
	int maxWait=60000;
	
    
    @Bean(name = "dataSource")  
    public DataSource dataSource() {
    	logger.info("初始化数据源开始……\n{}",url);
    	BasicDataSource dataSource = new BasicDataSource();
        dataSource.setDriverClassName(driverClass);  
        dataSource.setUrl(url);  
        dataSource.setUsername(userName);  
        dataSource.setPassword(passWord);  
        dataSource.setInitialSize(initialSize);
        dataSource.setMaxActive(maxActive);
        dataSource.setMaxIdle(maxIdle);
        dataSource.setMinIdle(minIdle);
        dataSource.setMaxActive(maxActive);
        logger.info("初始化数据源结束");
        return dataSource; 
    } 
    
    
    @Bean(name = "sessionFactory")
	public LocalSessionFactoryBean localSessionFactoryBean()  {
		logger.info("sessionFactory");
		LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
		sessionFactory.setDataSource(dataSource());
		String[] packagesToScan = new String[] { "pub.thirty.tbk.module.**.domain" };
		sessionFactory.setPackagesToScan(packagesToScan);
		Properties hibernateProperties = new Properties();
		hibernateProperties.setProperty("hibernate.dialect", hibernate_dialect);
		hibernateProperties.setProperty("connection.autocommit", "false");
		
		hibernateProperties.setProperty(
				"hibernate.current_session_context_class",
				"org.springframework.orm.hibernate4.SpringSessionContext"
		);

		sessionFactory.setHibernateProperties(hibernateProperties);
		return sessionFactory;

	}
    
    @Bean(name = "transactionManager")
	public HibernateTransactionManager hibernateTransactionManager() {
		logger.info("transactionManager");
		HibernateTransactionManager hibernateTransactionManager = new HibernateTransactionManager();
		hibernateTransactionManager.setSessionFactory(localSessionFactoryBean().getObject());
		hibernateTransactionManager.setNestedTransactionAllowed(true);
		return hibernateTransactionManager;
	}

    
    @Bean
    public Pointcut openSessionPointcut(){
    	AspectJExpressionPointcut bean = new AspectJExpressionPointcut(); 
    	bean.setExpression("@annotation(pub.thirty.tbk.config.annotation.OpenSession)");
    	return bean;
    }
    
    @Bean
    public OpenSessionInterceptor openSessionInterceptor(){
    	OpenSessionInterceptor oi = new OpenSessionInterceptor();
    	oi.setSessionFactory(localSessionFactoryBean().getObject());
    	return oi;
    }
    
    @Bean
    public DefaultPointcutAdvisor openSessionAdvisor(){
    	DefaultPointcutAdvisor bean = new DefaultPointcutAdvisor();
    	bean.setAdvice(openSessionInterceptor());
    	bean.setPointcut(openSessionPointcut());
    	return bean;
    }
    @Bean 
   public ProxyConfig proxyConfig(){
	   AnnotationAwareAspectJAutoProxyCreator bean = new AnnotationAwareAspectJAutoProxyCreator();
	   bean.setProxyTargetClass(true);
	   return bean;
   }
    
	@Override
	public PlatformTransactionManager annotationDrivenTransactionManager() {
		return hibernateTransactionManager();
	}
   
}

 

1、目前生效的应该是:

@EnableTransactionManagement

(我的主Config应该时另一个类,这个注解似乎不用写在主Config里,虽然网上有人这么说)

2、OpenSessionInterceptor的想法是通过新建一个针对@OpenSession 切面,

  当调用带有@OpenSession的方法时,openSession或者getCurrentSession();

    bean.setProxyTargetClass(true); 这句时为了指定CGLIB代理,因为方法的接口是InitializingBean,感觉可能代理不到,不知道是不是必须。

PS:奇怪的是上周我加了@EnableTransactionManagement也不起作用,这周写完其他模块,回来重新放开启动模块居然发现神奇的好了,不知道什么鬼!!

     

 

© 著作权归作者所有

共有 人打赏支持
粉丝 3
博文 11
码字总数 4670
作品 0
浦东
高级程序员
java,spring,hibernate,oracle

昨天自己搭了一个springmvc+hibernate4的框架,全注解。之前连接mysql的时候是没有任何问题的,但是连oracle这块就有问题了。现在用gecgetcurrentsession的时候数据保存不到数据库了,用get...

魔夜C
2016/09/01
106
0
springmvc+hibernate4 怎么实现数据层的多租户?

springmvc+hibernate4 怎么实现数据层的多租户?

owenG
2015/05/11
718
4
Hibernate Validator bean-validator-3.0-JBoss-4.0.2

springMVC+hibernate4,配置框架时,用Junit测试时,会出现Hibernate Validator bean-validator-3.0-JBoss-4.0.2, Caused by: org.hibernate.HibernateException: Error applying BeanVali......

阿斯兰
2013/07/16
0
0
PHP中Session可能会引起并发问题

在进行Web应用程序开发的时候,人们经常会用Session存储数据。但可能有人不知道,在PHP中,Session使用不当可能会引起并发问题。印度医疗行业软件解决方案提供商Plus91 Technologies高级工程...

蜗牛奔跑
2015/06/29
0
0
大型网站之分布式会话管理

随着网站的功能和用户越来越多,单机器服务部署的Web应用已经不能再支持了。这时候就需要优化或调整目前的架构,具体怎么优化,或先优化哪部分,这取决于网站的具体情况, 并非总是一个套路。...

十二缸帕萨特
2015/10/07
694
0
PHP沉思录-第五篇-Session有效期问题-左轻侯-《程序员》2008年10月号

创建时间:2008-11-09 01:12:09 最后修改时间:2008-11-09 01:12:09 本文发表在《程序员》杂志第10期 PHP沉思录之五:Session有效期问题 左轻侯 2008.9.07    Session处理是所有的Web应用都...

一配
2015/10/16
9
0
服务器断电导致php的session丢失

公司的服务器由于断电导致重启,原本以为不会导致什么问题,可还是莫名的出现了问题。进入网站后台,需要输入验证码,可怎么输入都提示不正确。于是就开始断点调试,最终调试的结果,验证码的...

sharephper
2013/01/05
0
0
独立实现一个分布式session

对于一个独立应用来说,单机部署不需要考虑分布式问题,默认的session实现就行了,一旦多机部署,首先我们需要修改session方案,分布式session解决的是多机session状态同步的问题,一般情况下...

星仔小号
2015/06/12
0
4
解决ecshop登陆自动退出的莫名现象

  最近在做ecshop的二次开发,程序发布后测试出现一个莫名的问题。点击几次页面后出现session丢失,需要重复登陆;本地怎么测试也都无法重现问题。一开始以为是修改程序的问题,可是怎么找...

无声胜有声
2015/07/26
0
0
使用postman调试接口时发现的session问题

今天在使用postman调试写好的接口的时候,突然发现一个问题,具体表现为:用户在登录后存的session值,在其他方法中获取不到。 经过不断的调试,最终发现,用户登录后存的session和我在其他方...

lurenjiapp
04/19
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

CVE-2013-0077 堆溢出分析

找了很久才发现这个环境比较容易搭建分析... 环境: 系统---Win XP SP3 漏洞程序:QQPlayer 3.7.892.400 出错DLL:quartz.dll 6.5.2600.5512 调试工具:x32db+gflag.exe 过程: 首先gflag设置...

Explorer0
12分钟前
5
0
python上传文件

//注意 <form action="/login/" method="post" enctype="multipart/form-data"> f=request.FILES.get('fafa') ff=open(f.name,mode='wb') for i in f.chunks(): ff.write(i) ff.close()......

南桥北木
25分钟前
0
0
CISCO VPN Client Reason 442 WIN8/10错误解决方案

http://jdkleo.iteye.com/blog/2163493 引用 http://my.oschina.net/cloudcoder/blog/220391?p={{currentPage 1}} 在使用cisco VPN 客户端登录时,产生Reason 442:Failedto enable Virtual......

chenfj_fer
28分钟前
0
0
信号量有没有容量限制?

之前一直误以为信号量初始化的时候那个初始化的值是信号量的“容量”,昨天同事指出了我的错误,最初我是不相信的,经过以下代码实践,证明了我的错误: Java版: import java.util.concurr...

锟斤拷烫烫烫
32分钟前
0
0
【RocketMQ】Message存储笔记

概述 消息中间件存储分为三种,一是保存在内存中,速度快但会因为系统宕机等因素造成消息丢失;二是保存在内存中,同时定时将消息写入DB中,好处是持久化消息,如何读写DB是MQ的瓶颈;三是内...

SaintTinyBoy
43分钟前
0
0
Android应用Context详解及源码解析

Android应用Context详解及源码解析 本文定位:优质文章收集 本文转载 1 背景 今天突然想起之前在上家公司(做TV与BOX盒子)时有好几个人问过我关于Android的Context到底是啥的问题,所以就马...

lichuangnk
今天
0
0
PostgreSQL的昨天今天和明天

PostgreSQL 是一种非常复杂的对象-关系型数据库管理系统(ORDBMS), 也是目前功能最强大,特性最丰富和最复杂的自由软件数据库系统。有些特性甚至连商业数据库都不具备。 这个起源于伯克利(...

闻术苑
今天
1
0
Mysql对自增主键ID进行重新排序

1,删除原有主键: ALTER TABLE `table_name` DROP `id`; 2,添加新主键字段: ALTER TABLE `table_name` ADD `id` MEDIUMINT( 8 ) NOT NULL FIRST; 3,设置新主键: ALTER TABLE `table_nam......

niithub
今天
0
0
福利篇:免费csdn vip账号分享

分享一个发布免费csdn vip账号的网站:啰嗦vip www.lostvip.com , 各种软件开发类的视频教程:慕课网、动脑学院、黑马各大培训机构VIP视频教程,非常不错!

在水一方发盐人
今天
1
0
Nginx+Tomcat搭建高性能负载均衡集群

一、 工具   nginx-1.8.0   apache-tomcat-6.0.33 二、 目标   实现高性能负载均衡的Tomcat集群:    三、 步骤   1、首先下载Nginx,要下载稳定版:      2、然后解压两个Tom...

码代码的小司机
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部