一、环境

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框架数据同步问题的更多相关文章

  1. 要成为linux网站运维工程师必须要掌握的技能

    要成为linux网站运维工程师必须要掌握的技能 2015-07-27 发表 老男孩点评:感谢此文的作者,写的非常到位,值得入门的初学者认真看看 我是一名linux运维工程师,确切的说是网站运维工程师, ...

  2. 网站运维之 使用IIS日志分析器1.03.exe进行IIS服务器日志分析

    引言 对于网站运维是一个比较要细心有耐心的工作,当一个网站从开发到上线后,后期的维护也很关键,特别是对于引流的网站来说更是至关重要. 对于网站运维的内容大致可以分为: SEO流量监控方面:风险防控:访 ...

  3. java SSH框架详解(面试和学习都是最好的收藏资料)

    Java—SSH(MVC)1. 谈谈你mvc的理解MVC是Model—View—Controler的简称.即模型—视图—控制器.MVC是一种设计模式,它强制性的把应用程序的输入.处理和输出分开.MVC ...

  4. Linux网站运维工程师基础大纲

    第一阶段:Linux运维基础 第一章:Linux基础以及入门介绍 1.Linux硬件基础 2.Linux发展过程 3.创建虚拟机和系统安装 第二章:Linux系统目录结构介绍 1.Linux系统优化 ...

  5. IIS日志-网站运维的好帮手

    对于一个需要长期维护的网站来说,如何让网站长久稳定运行是件很有意义的事情. 有些在开发阶段没有暴露的问题很有可能就在运维阶段出现了,这也是很正常的. 还有些时候,我们希望不断地优化网站,让网站更快速的 ...

  6. [Java] SSH框架笔记_框架分析+环境搭建+实例源码下载

    首先,SSH不是一个框架,而是多个框架(struts+spring+hibernate)的集成,是目前较流行的一种Web应用程序开源集成框架,用于构建灵活.易于扩展的多层Web应用程序. 集成SSH框 ...

  7. 网站运维工具使用iis日志分析工具分析iis日志(iis日志的配置)

    我们只能通过各种系统日志来分析网站的运行状况,对于部署在IIS上的网站来说,IIS日志提供了最有价值的信息,我们可以通过它来分析网站的响应情况,来判断网站是否有性能问题,或者存在哪些需要改进的地方 对 ...

  8. 【转】IIS日志-网站运维的好帮手

    对于一个需要长期维护的网站来说,如何让网站长久稳定运行是件很有意义的事情. 有些在开发阶段没有暴露的问题很有可能就在运维阶段出现了,这也是很正常的. 还有些时候,我们希望不断地优化网站,让网站更快速的 ...

  9. [Java] SSH框架笔记_框架整合示例(一)

    本文描述的是框架SSH集成的示例,由于在这个过程中有一些小的细节容易被遗忘,特别撰写了一篇小的博文来记录这个过程,希望对自己以及后来者能够起到积极意义. 本文中使用的框架和版本号为: struts-2 ...

  10. Java SSH框架系列:用户登录模块的设计与实现思路

    1.简介用户登录模块,指的是根据用户输入的用户名和密码,对用户的身份进行验证等.如果用户没有登录,用户就无法访问其他的一些jsp页面,甚至是action都不能访问.二.简单设计及实现本程序是基于Jav ...

随机推荐

  1. The STM32F746G-DISCO discovery board -- MBED

    https://developer.mbed.org/platforms/ST-Discovery-F746NG/ Microcontroller features STM32F46NGH6 in T ...

  2. [Go] defer 语句

    Go 还有一些特有的流程控制语句,其中一个就是 defer 语句.该语句用于延迟调用指定的函数,它只能出现在函数的内部,由 defer 关键字以及针对某个函数的调用表达式组成.这里被调用的函数称为 延 ...

  3. LINUX 内核 API

    http://www.compsoc.man.ac.uk/~moz/kernelnewbies/documents/kdoc/kernel-api/linuxkernelapi.html

  4. Java Dictionary 类存储键值

    字典(Dictionary) 字典(Dictionary) 类是一个抽象类,它定义了键映射到值的数据结构. 当你想要通过特定的键而不是整数索引来访问数据的时候,这时候应该使用Dictionary. 当 ...

  5. How To Create A Local Repository For SUSE Linux

    原文地址:http://candon123.blog.51cto.com/704299/1009294/ As you know,you can use the yum command to inst ...

  6. 在im4java中使用GraphicsMagick

    1.定义操作和命令GMOperation op = new GMOperation();GraphicsMagickCmd cmd = new GraphicsMagickCmd("conv ...

  7. vs已停止工作

    第一步: 开始-->所有程序-->Microsoft Visual Studio 2012-->VisualStudio Tools-->VS2012 开发人员命令提示(以管理 ...

  8. Linux学习9-CentOS搭建nginx环境

    前言 之前我们搭建网站的时候,把war包放到tomcat下就能运行起来了,为什么部署上线的时候,又用到了nginx呢? nginx可以做多台服务器的负载均衡,当用户非常少的时候,可以用一台服务直接部署 ...

  9. 如何删除mac keeper

    如果不小心安装了mac keeper,基本是无法删除的,而且16年以前的方法都不管用.可以这样删除,我已经测试过了,下载https://data-cdn.mbamupdates.com/web/mba ...

  10. Mac环境下配置Tomcat+Eclipse

    下载Tomcat 首先在 Tomcat官方网站 找到自己合适的版本,下载 tar.gz 版本的,下载完成后解压缩到一个目录,进入这个目录下的 bin 执行 startup.sh,如果看到下面的界面,表 ...