网站运维之JAVA-SSH框架数据同步问题
一、环境
SSH环境,查询用的是基于Hibernate的配置文件构建了一个SessionFactory,主要代码如下
public class HibernateUtil {
    private static ThreadLocal<Session> threadLocal = new ThreadLocal<Session>();
    private static Configuration configuration = null;
    public static SessionFactory sessionFactory;
    static {
        try {
            configuration = new Configuration().configure("/hibernate.cfg.xml");
            sessionFactory = configuration.buildSessionFactory();
        } catch (HibernateException e) {
            System.out.println("解析xml和创建Session工厂error");
            e.printStackTrace();
        }
    }
    public static Session getSession() {
        Session session = threadLocal.get();
        if (session == null) {
            session = sessionFactory.openSession();
            threadLocal.set(session);
        }
        //Session session=sessionFactory.getCurrentSession();
        return session;
    }
    // ThreadLocal可以隔离多个线程的数据共享,因此不再需要对线程同步
        public static final ThreadLocal<Session> session
            = new ThreadLocal<Session>();
        //创建Session
        public static Session currentSession()
            throws HibernateException
        {
            //通过线程对象.get()方法安全创建Session
            Session s = session.get();
            // 如果该线程还没有Session,则创建一个新的Session
            if (s == null)
            {
                s = sessionFactory.openSession();
                // 将获得的Session变量存储在ThreadLocal变量session里
                session.set(s);
            }
            return s;
        }
        //关闭Session
        public static void closeSession()
            throws HibernateException
        {
            Session s = session.get();
            if (s != null)
                s.close();
            session.set(null);
        }
}
二、问题
之后在具体业务中对该工具类引用,代码如下
	public Map<String, List<UserTempDto>> packetStatistics(Map<String, String> params) {
		System.out.println("99999999999999999999999999");
		Map<String, List<UserTempDto>> map = new HashMap<String, List<UserTempDto>>();
		List<UserTempDto> userTypeList = new ArrayList<UserTempDto>();
		List<UserTempDto> provinceList = new ArrayList<UserTempDto>();
		String serachCondition = serachCondition(params);
		serachCondition=StringUtils.isBlank(serachCondition)? "":serachCondition;
		//��ȡsession
	    Session session=HibernateUtil.getSession();
	  //����ʡ�ݷ���hql
	    String groupByProvince = " group by province";
	    String hqlCountProvince = "select province,COUNT(user_code) FROM StatUserinfo where 1=1 ";
	    Query  countProvince = session.createQuery(hqlCountProvince+serachCondition+groupByProvince);
		@SuppressWarnings({ "unchecked", "unused" })
		List<Object[]> countProvinceList=(List<Object[]>)countProvince.list();
		//����רί�����hql
		String groupByUserType = " group by userType";
	    String hqlCountUserType = "select userType,COUNT(user_code)  FROM StatUserinfo where 1=1 ";
	    Query  countUserType = session.createQuery(hqlCountUserType+serachCondition+groupByUserType);
		List<Object[]> countUserTypeList=(List<Object[]>)countUserType.list();
	    HibernateUtil.closeSession();
	    UserTempDto userTempDto;
	    try {
	    	 for (Object[] objects : countUserTypeList) {//����רί�����ͳ��
	             String userType=(String) objects[0]==null? "未知":(String)objects[0];
	             Long cUserType=(Long) objects[1];
	             userTempDto=new UserTempDto();
	             userTempDto.setCountUserType(cUserType);
	             userTempDto.setUserType(userType);
	             userTypeList.add(userTempDto);
	         }
	 	    for (Object[] objects : countProvinceList) {//����רί�����ͳ��
	             String province=(String) objects[0]==null? "未知":(String)objects[0];
	             Long cProvince=(Long) objects[1];
	             userTempDto=new UserTempDto();
	             userTempDto.setProvince(province);
	             userTempDto.setCountProvince(cProvince);
	             provinceList.add(userTempDto);
	             System.out.println("省份:"+province+"&人数:"+cProvince);
	         }
		} catch (Exception e) {
			e.printStackTrace();
		}
	    map.put("userTypeList", userTypeList);
	    map.put("provinceList", provinceList);
	    return map;
	}
但是 每次tomcat启动后 第一次查询是正确的 ,然后做修改操作,第二次查询就不正确了,查询不到修改后的数据,必须重启tomcat,才可以查询到和数据库最新数据一样的数据
三、解决办法
想到了缓存,但是项目中hibernate.cfg.xml根本没有使用缓存,因为没有相关的配置。也更改了Session的获取类型,比如
session = sessionFactory.openSession();
替换为
Session session=sessionFactory.getCurrentSession();
都没有起到什么作用
关键的来了!
Session session=HibernateUtil.getSession();
        //by wxj
        Transaction tx=session.beginTransaction();
      //����ʡ�ݷ���hql
        String groupByProvince = " group by province";
        String hqlCountProvince = "select province,COUNT(user_code) FROM StatUserinfo where 1=1 ";
        Query  countProvince = session.createQuery(hqlCountProvince+serachCondition+groupByProvince); 
        @SuppressWarnings({ "unchecked", "unused" })
        List<Object[]> countProvinceList=(List<Object[]>)countProvince.list();
        //����רί�����hql
        String groupByUserType = " group by userType";
        String hqlCountUserType = "select userType,COUNT(user_code)  FROM StatUserinfo where 1=1 ";
        Query  countUserType = session.createQuery(hqlCountUserType+serachCondition+groupByUserType); 
        List<Object[]> countUserTypeList=(List<Object[]>)countUserType.list();
        //by wxj
        tx.commit();
在查询之前,还有查询结束之后分别增加了 开始事务和提交事务的操作,数据奇迹的发生了变化,tomcat启动后,查询数据台湾省有1个用户,接着修改一个用户的归属为台湾省
此时数据库中有两个用户是台湾省了,再次查询数据,台湾省的用户为2,即修改操作和查询操作数据同步了
需要注意的是 事务是hibernate的事务
import org.hibernate.Transaction;
网站运维之JAVA-SSH框架数据同步问题的更多相关文章
- 要成为linux网站运维工程师必须要掌握的技能
		
要成为linux网站运维工程师必须要掌握的技能 2015-07-27 发表 老男孩点评:感谢此文的作者,写的非常到位,值得入门的初学者认真看看 我是一名linux运维工程师,确切的说是网站运维工程师, ...
 - 网站运维之 使用IIS日志分析器1.03.exe进行IIS服务器日志分析
		
引言 对于网站运维是一个比较要细心有耐心的工作,当一个网站从开发到上线后,后期的维护也很关键,特别是对于引流的网站来说更是至关重要. 对于网站运维的内容大致可以分为: SEO流量监控方面:风险防控:访 ...
 - java SSH框架详解(面试和学习都是最好的收藏资料)
		
Java—SSH(MVC)1. 谈谈你mvc的理解MVC是Model—View—Controler的简称.即模型—视图—控制器.MVC是一种设计模式,它强制性的把应用程序的输入.处理和输出分开.MVC ...
 - Linux网站运维工程师基础大纲
		
第一阶段:Linux运维基础 第一章:Linux基础以及入门介绍 1.Linux硬件基础 2.Linux发展过程 3.创建虚拟机和系统安装 第二章:Linux系统目录结构介绍 1.Linux系统优化 ...
 - IIS日志-网站运维的好帮手
		
对于一个需要长期维护的网站来说,如何让网站长久稳定运行是件很有意义的事情. 有些在开发阶段没有暴露的问题很有可能就在运维阶段出现了,这也是很正常的. 还有些时候,我们希望不断地优化网站,让网站更快速的 ...
 - [Java] SSH框架笔记_框架分析+环境搭建+实例源码下载
		
首先,SSH不是一个框架,而是多个框架(struts+spring+hibernate)的集成,是目前较流行的一种Web应用程序开源集成框架,用于构建灵活.易于扩展的多层Web应用程序. 集成SSH框 ...
 - 网站运维工具使用iis日志分析工具分析iis日志(iis日志的配置)
		
我们只能通过各种系统日志来分析网站的运行状况,对于部署在IIS上的网站来说,IIS日志提供了最有价值的信息,我们可以通过它来分析网站的响应情况,来判断网站是否有性能问题,或者存在哪些需要改进的地方 对 ...
 - 【转】IIS日志-网站运维的好帮手
		
对于一个需要长期维护的网站来说,如何让网站长久稳定运行是件很有意义的事情. 有些在开发阶段没有暴露的问题很有可能就在运维阶段出现了,这也是很正常的. 还有些时候,我们希望不断地优化网站,让网站更快速的 ...
 - [Java] SSH框架笔记_框架整合示例(一)
		
本文描述的是框架SSH集成的示例,由于在这个过程中有一些小的细节容易被遗忘,特别撰写了一篇小的博文来记录这个过程,希望对自己以及后来者能够起到积极意义. 本文中使用的框架和版本号为: struts-2 ...
 - Java SSH框架系列:用户登录模块的设计与实现思路
		
1.简介用户登录模块,指的是根据用户输入的用户名和密码,对用户的身份进行验证等.如果用户没有登录,用户就无法访问其他的一些jsp页面,甚至是action都不能访问.二.简单设计及实现本程序是基于Jav ...
 
随机推荐
- STM32 TIMER REGISTER
 - 【Go命令教程】命令汇总
			
[Go命令教程]1. 标准命令详解 [Go命令教程]2. go build [Go命令教程]3. go install [Go命令教程]4. go get [Go命令教程]5. go clean [G ...
 - 大不列颠百科全书Encyclopaedia Britannica Ultimate 2014光盘镜像
			
大不列颠百科全书又名大英百科全书,是目前最古老的百科全书之一.大英百科全书每10余年出一个版本,如今已经推出到Encyclopaedia Britannica Ultimate 2014.此次推荐的是 ...
 - 委托、Lambda表达式、事件系列04,委托链是怎样形成的, 多播委托, 调用委托链方法,委托链异常处理
			
委托是多播委托,我们可以通过"+="把多个方法赋给委托变量,这样就形成了一个委托链.本篇的话题包括:委托链是怎样形成的,如何调用委托链方法,以及委托链异常处理. □ 调用返回类型为 ...
 - 分享一段ios数据库代码,包括对表的创建、升级、增删查改
			
分享一段ios数据库代码.包括创建.升级.增删查改. 里面的那些类不必细究,主要是数据库的代码100%可用. 数据库升级部分,使用switch,没有break,低版本一次向高版本修改. // DB.h ...
 - C#编程(七十三)----------浅析C#中内存管理
			
浅析C#中内存管理 前言:个人觉得C#吸收了各种语言的优点,可谓集大成者,但是不知但,这种集所有语言于一身的情况是好是坏.C#编程的一个优点就是程序员不需要关心具体的内存管理,尤其是垃圾收集器会处理所 ...
 - C#编程(六十二)---------LINQ标准的查询操作符
			
LINQ标准的查询操作符 首先我们来看一下LINQ的操作符,可根据查询操作符的操作”类型”进行分类,如把它们分成投影,限制,排序,联接,分组,串联,聚合,集合,生成,转换,元素,相等,量词,分割等. ...
 - 创建、修改、删除ORACLE表空间
			
//创建表空间 create tablespace MyFirstSpace datafile '/opt/oracle/app/oracle/product/9.2.0/dbs/MyFirstSpa ...
 - python测试开发django-18.admin后台中文版
			
前言 django的admin后台页面默认是英文的,不喜欢英文的话,可以改下setting.py里面的语言设置,改成中文版的显示 语言设置 打开setting.py,找到以下内容 # Internat ...
 - Unity3D 的大场景内存优化
			
我们公司的一个 MMORPG 项目最近在内存方面碰到了红线,昨天开会讨论了一下.我提出了一个改进方案,写篇 blog 记录一下. 问题是这样的.在当下的手机及平板硬件设备条件下,操作系统留给应用的可用 ...