精华内容
下载资源
问答
  • 1:第一次获得该对象的时候用get而不用load,因get不支持懒加载,在get该对象的同时会想数据库发出sql语句,取出该对象的相应信息放入缓存中,下次即使session已经关闭,因缓存中有相应的数据,查找该对象时会首先从...

    session关闭以后,如果还想用相关的对象,比如在页面中进行输出,但又不至于出现session已关闭的错误而导致无法获取对象的信息,本文提供三种解决方式:

    1:第一次获得该对象的时候用get而不用load,因get不支持懒加载,在get该对象的同时会想数据库发出sql语句,取出该对象的相应信息放入缓存中,下次即使session已经关闭,因缓存中有相应的数据,查找该对象时会首先从缓存中查询,直接拿来用就ok了

    2:可以把相应对象的lazy设为false,这样在load该对象的同时就会发sql语句取出该对象放到缓存中,以后再用可以直接从缓存中取,从而也避免了该异常

    3:采用openSessionInView 该方式是通过延长session的时间方式来解决的,可以写一个filter或者inteceptor,下面以filter为例




     private SessionFactory sf;
    //filter   -- > 
     public void doFilter(ServletRequest request, ServletResponse response,
       FilterChain chain) throws IOException, ServletException {
      try {
       // sf.getCurrentSession();//获得和当前线程绑定的session
       sf.getCurrentSession().beginTransaction();
       chain.doFilter(request, response);
       sf.getCurrentSession().getTransaction().commit();
      } catch (StaleObjectStateException staleEx) {
       throw staleEx;
      } catch (Throwable ex) {
       ex.printStackTrace();
       try {
        if (sf.getCurrentSession().getTransaction().isActive()) {
         sf.getCurrentSession().getTransaction().rollback();
        }
       } catch (Throwable rbEx) {
       }
       throw new ServletException(ex);
      }
     }
     public void init(FilterConfig filterConfig) throws ServletException {
      sf = HibernateSessionFactory.getSessionFactory();
     }
     public void destroy() {
     }

    展开全文
  • session关闭往后,如果还想用相关的方针,...在get该方针的一同会想数据库宣告sql语句,取出该方针的相应信息放入缓存中,下次即使session关闭,因缓存中有相应的数据,查找该方针时会首要从缓存中查询,直接拿...
    session关闭往后,如果还想用相关的方针,比如在页面中进行输出,但又不至于出现session已关闭的差错而致使无法获取方针的信息,本文供应三种处置办法: 1:第一次获得该方针的时分用get而不用load,因get不支持懒加载,在get该方针的一同会想数据库宣告sql语句,取出该方针的相应信息放入缓存中,下次即使session现已关闭,因缓存中有相应的数据,查找该方针时会首要从缓存中查询,直接拿 http://www.goodk123.info 来用就ok了 2:可以把相应方针的lazy设为false,这样在load该方针的一同就会发sql语句取出该方针放到缓存中,往后再用可以直接从缓存中取,然后也避免了该失常 3:选用openSessionInView 该办法是通过延伸session的时辰办法来处置的,可以写一个filter或许inteceptor,下面以filter为例  private SessionFactory sf;
    //filter   -- > 
     public void doFilter(ServletRequest request, ServletResponse response,
       FilterChain chain) throws IOException, ServletException {
      try {
       // sf.getCurrentSession();//获得和其时线程绑定的session
       sf.getCurrentSession().beginTransaction();
       chain.doFilter(request, response);
       sf.getCurrentSession().getTransaction().commit();
      } catch (StaleObjectStateException staleEx) {
       throw staleEx;
      } catch (Throwable ex) {
       ex.printStackTrace();
       try {
        if (sf.getCurrentSession().getTransaction().isActive()) {
         sf.getCurrentSession().getTransaction().rollback();
        }
       } catch (Throwable rbEx) {
       }
       throw new ServletException(ex);
      }
     }
     public void init(FilterConfig filterConfig) throws ServletException {
      sf = HibernateSessionFactory.getSessionFactory();
     }
     public void destroy() {
     } http://www.gookp11.com 

    转载于:https://www.cnblogs.com/fpqqchao/archive/2013/04/10/3011597.html

    展开全文
  • 最近一段时间做项目的时候,自已在修改一个功能点,要更改已获取的数据列表的某行记录内容,并将更改保存到数据库写好了所有业务代码,在调用DAO层Hibernate方法执行数据库更新时,发现一个有意思的问题,...
      最近一段时间做项目的时候,自已在修改一个功能点,要更改已获取的数据列表中的某行记录内容,并将更改保存到数据库中,已写好了所有业务代码,在调用DAO层Hibernate方法执行数据库更新时,发现一个有意思的问题,程序执行数据库更新操作无任何异常,但是在刷新列表时,却发现该行数据根本没有更改。
      经过分析与查找,确认是hibernate缓存问题,导制数据库操作无法真正的执行。具体原因是如何导制的,我没有正确答案,但可以肯定跟缓存有关。
    具体代码如下:

         /**
    * 修改指定流程下的节点内容
    * @param lcbh
    * @param lcmc
    * @param oldJdbh
    * @param oldJdmc
    * @param newJdbh
    * @param newJdmc
    * @return
    * @throws Exception
    */
    public boolean updateLcjdDb(String lcbh,String lcmc,String oldJdbh,String oldJdmc,String newJdbh,String newJdmc) throws Exception {
    Session session = this.getSession();
    Transaction tx =null;
    String hql="update BFsYwbd set jdph=?,jdmc=? where lcph=? and lcmc=? and jdph=? and jdmc=?";
    int count=0;
    try{
    tx = session.beginTransaction();
    Query query=this.getSession().createQuery(hql);
    query.setString(0, newJdbh);
    query.setString(1, newJdmc);
    query.setString(2, lcbh);
    query.setString(3, lcmc);
    query.setString(4, oldJdbh);
    query.setString(5, oldJdmc);
    count=query.executeUpdate();
    tx.commit();
    session.flush();
    }catch(Exception e){
    tx.rollback();
    throw e;
    }
    return count>=1?true:false;
    }



    上面一段代码从运行角度来看无任何问题,但是就是无法将更新操作应用到数据库层面。

    推测,可能是在执行数据库操作时由hibernate获取了缓存中的已有的数据列表,并对该列表中的指定对象进行了操作,但没有将该对象的操作执行到数据库中(注:所查询出的列表是经过数据库去掉重复项之后的集合,可能hibernate对缓存中的数据列表行进行了更新之后,却无法将该更改后的列表行缓存对象匹配到数据库中指定的记录行,导制无法真实的修改数据库中的记录,因为缓存中的对象已在数据库中找不到记录行或唯一行),hibernate的缓存策略是每个对应数据库表的缓存记录都具有会话ID,它保存了数据库中的记录与缓存中的对象一致,一但缓存中的记录发生更新操作,hibernate就会通过缓存机制找到对应数据库中表的数据,将其更改。代码中的是通过getSession()获取Session对象,在通过开启事务进行更新操作,最后提交事务,刷新缓存。 我们了解到通过getSession()所获取的Session对象,都是重新创建的一个新的会话对象,而我的功能中所获取的数据列表是通过getHibernateTemplate().find()执行得到的。getHibernateTemplate()方法是由spring通过在控制反转代理管理数据库连接sessionFactory所得到的,也就是说getHibernateTemplate方法中得到的会话对象是从sessionFactory会话工厂中得到,而sessionFactory会话工厂中会保持一个有用的Session会话,而不是每次通过调用getHibernateTemplate()方法都会创建的,这与getSession()正好相反。因此推测到,在通过getSession()所生成的会话对象更改数据库时,会从hibernate的所有缓存中找到数据列表,但该会话对象只对该数据列表中的数据进行更新之后,并提交了事务刷新了会话对象,实际上就是清空了该Session会话,而该操作之对当前从getSession()中所获取会话缓存数据有效,实际上并没有更新Spring控制反转代理数据库连接所产生的sessionFactory会话工厂中的缓存数据。其最后结果就是更新了getSession()方法生成的会话对象中的数据缓存,而getSession()所产生的Session会话对象不被Spring所代理管理,而是将一个原始的最新的会话,就导制了原有的通过getHibernateTemplate()所生成的Spring代理的sessionFactory会话工厂的数据表列记录不能修改,sessionFactory会话工厂中所缓存的数据列表记录不能修改,其对应的数据库表记录也就不会有更新操作。

    经过以上推测和分析之后,就大致明白了些。不过只是个人的见解,不一定是正确的方向。

    经过修改后的代码如下:


     /**
    * 修改指定流程下的节点内容
    * @param lcbh
    * @param lcmc
    * @param oldJdbh
    * @param oldJdmc
    * @param newJdbh
    * @param newJdmc
    * @return
    * @throws Exception
    */
    public boolean updateLcjdDb(String lcbh,String lcmc,String oldJdbh,String oldJdmc,String newJdbh,String newJdmc) throws Exception {
    Session session = this.getHibernateTemplate().getSessionFactory().openSession();
    Transaction tx =null;
    String hql="update BFsYwbd set jdph=?,jdmc=? where lcph=? and lcmc=? and jdph=? and jdmc=?";
    int count=0;
    try{
    tx = session.beginTransaction();
    Query query=this.getSession().createQuery(hql);
    query.setString(0, newJdbh);
    query.setString(1, newJdmc);
    query.setString(2, lcbh);
    query.setString(3, lcmc);
    query.setString(4, oldJdbh);
    query.setString(5, oldJdmc);
    count=query.executeUpdate();
    tx.commit();
    session.flush();
    }catch(Exception e){
    tx.rollback();
    throw e;
    }
    return count>=1?true:false;
    }



    从上面的代码中可以看出,其实就是将getSession()方法获取Session会话对象,改为通过this.getHibernateTemplate().getSessionFactory().openSession()获取Spring所代码管理的会话对象。
    展开全文
  • * 我们平常用的获取上一个请求方式,在Session不一致情况下是获取不到 * String url = (String) request.getAttribute(WebUtils.FORWARD_REQUEST_URI_ATTRIBUTE); */ 三、删除了配置文件中的cookie写入域...
  • 用户新登录时需要填写验证码,验证码图片由后台Python生成并缓存到Redis,图片显示于前端,登录时前端数据与数据库数据校正 现有特性 * 用户密码两次加密,前后端各加密一次 * 利用flask_mail多线程发送邮箱 * 邮箱...
  • 通用又简单的的办法是从服务器端获取令牌,将其存到缓存中,调用接口时,根据获取令牌,判断是否属于重复提交,缓存最后使用redis分布式缓存,防止如果应用是分布式部署,两次提交提向了两个不同节点,导致无法判断...

    一个简单快速的办法
    通用又简单的的办法是从服务器端获取令牌,将其存到缓存中,调用接口时,根据获取令牌,判断是否属于重复提交,缓存最后使用redis分布式缓存,防止如果应用是分布式部署,两次提交提向了两个不同的节点,导致无法判断重复

    实现代码
    使用jedis.setNx方法,返回true则表示首次提交,再处理逻辑,否则提示已提交过,需要重新刷新页面,再次提交。

    在struts里也有这样的方法,是利用的session令牌做的,用户刷新页面,session会存一个令牌,页面有个hidden标签存放这个令牌,提交的时候,会带上,如果相同则处理逻辑,不同表示已提交过,这种方法也可以实现。

    展开全文
  • 此参数在 8.1.3 版中已废弃。 值范围: TRUE | FALSE 默认值: FALSE mts_servers: 说明 : 指定在启动例程后, 要为共享服务器环境创建服务器进程数量。 值范围: 根据操作系统而定。 默认值 : 1 mts_service: ...
  • Session会话 —— 专业的数据缓存中心 踢人下线 —— 将违规用户立刻清退下线 账号封禁 —— 封禁指定账号,使其无法登陆,还可指定解封时间 持久层扩展 —— 可集成Redis、Memcached等专业缓存中间件,重启数据...
  • 5、因视频认证无法使用,去掉用户个人空间 - 个人资料页:“视频认证:未认证”。 6、修复 版块页未判断是否可发帖就显示验证码问题 7、修复UC后台文件里目录路径获取方式,方便站长更换入口名称 8、优化 ...
  • 5、因视频认证无法使用,去掉用户个人空间 - 个人资料页:“视频认证:未认证”。 6、修复 版块页未判断是否可发帖就显示验证码问题 7、修复UC后台文件里目录路径获取方式,方便站长更换入口名称 8、优化 ...
  • 7、修复UC后台文件里目录路径获取方式,方便站长更换入口名称 8、优化 语音验证码通过HTML5播放,放弃Flash 9、修复 系统内存在部分小Typo 10、修复 小黑屋页面“更多”按钮行为异常问题 11、修复主题发布...
  • 更改目标服务器列表列出服务器端口 139 在不使用 HTTPS 情况下通过端口 443 运行 SSL Relay 139 配置 SSL Relay 允许密码集 139 配置 SSL Relay 使用密码集 139 使用 Secure Gateway 140 使用 Secure ...
  • 门户单点登录接入子应用优化 ... 引入redis集群:作为缓存存储session数据,以及一些其他缓存数据,如用户和机构 门户和子应用通过token值(登陆后生成)传递和验证,验证通过后子应用才能获取到...
  • 是用的hibernate的事时没用spring,但是插入的数据量比较大,是不停的向数据库里插入数据 不知道为什么会死锁,理论上用过的之后的Connection在close之后会放回连接池,而且我插入sql语句时又是单线程的,不...
  • ZendFramework中文文档

    2011-03-22 10:11:12
    导入定制的数据源 13.2.1.3. Dumping feed 内容 13.3. 从网页上获得Feed 13.4. RSS Feed的使用 13.5. Atom Feed的使用 13.6. 单个Atom条目的处理 13.7. 修改Feed和条目结构 13.8. 自定义Feed和条目类 14. ...
  • C#与.NET3.5高级程序设计(第4版) 中文6

    热门讨论 2009-12-22 09:53:19
    33.9 sessionState元素作用 1001 33.10 ASP.NET用户配置API 1003 33.11 小结 1008 附录A COM与.NET互操作性 1010 A.1 NET互操作研究范围 1010 A.2 NET调用COM互操作简单示例 1011 A.3 NET互...
  • 如果该Session空闲时间超过设置值,该方法被触发,可以通过session.getIdleCount(status)来获取sessionIdle被触发次数。 @Override public void sessionIdle(IoSession session, IdleStatus status) throws ...
  • 105页的数据结构和算法 142页的Spring 58页的过滤器和监听器 30页的HTTP xxxx页的Redis:待更新...(最新首发公众号,导航更新可能有延迟) Hibernate AJAX ...... :coffee:Java基础 初学者学Java常遇到的问题,我...
  • PHP5中文参考手册

    热门讨论 2011-11-30 23:15:53
    用户提交的数据 魔术引号 隐藏 PHP 保持更新 特点 用 PHP 进行 HTTP 认证 Cookie 会话 处理 XForms 文件上传处理 使用远程文件 连接处理 数据库永久连接 安全模式 PHP 的命令行模式 函数参考 .NET — .NET 函数 ...
  • 用户提交的数据 魔术引号 隐藏 PHP 保持更新 特点 用 PHP 进行 HTTP 认证 Cookie 会话 处理 XForms 文件上传处理 使用远程文件 连接处理 数据库永久连接 安全模式 PHP 的命令行模式 函数参考 .NET — .NET 函数 ...
  • 实例193 快速将DataGrid控件中的数据显示在 文本框 351 实例194 在DataGrid控件实现下拉列表框 353 实例195 使用代码格式化DataGrid控件的 数据 354 实例196 根据数据字段类型自动格式化DataGrid 表格...
  • 实例193 快速将DataGrid控件中的数据显示在 文本框 351 实例194 在DataGrid控件实现下拉列表框 353 实例195 使用代码格式化DataGrid控件的 数据 354 实例196 根据数据字段类型自动格式化DataGrid 表格...
  • 主要就是通过用sessionid请求微信服务器生成临时二维码,客户扫码后微信服务器会将对应数据发给本地服务器,本地根据openid在关联关系表找出userid,取出用户信息,放入缓存中,即为登录成功。我使用是微信测试...
  • php网络开发完全手册

    热门讨论 2009-03-02 13:17:26
    15.4.5 获取的数据类型 257 15.4.6 获取列的长度 257 15.4.7 获取列的标志 257 15.4.8 一个完整的查看表各列属性 15.4.8 的实例 258 15.5 常见问题与解决方案 259 15.6 小结 261 第16章 数据库的程序逻辑 262 ...
  • ASP.NET.4揭秘 卷2

    2012-06-08 16:34:22
    n435 创建用户控件缓存的文件依赖 n436 缓存动态载入的用户控件 n44 使用数据源缓存 n441 使用绝对缓存过期策略 n442 使用弹性缓存过期策略 n443 使用ObjectDataSource控件缓存 n444 使用XmlDataSource控件缓存 n445...
  • asp.net知识库

    2015-06-18 08:45:45
    如何获取MSSQLServer,Oracel,Access中的数据字典信息 C#利用GetOleDbSchemaTable获取数据库内表信息[原创] 如何解决ACCESSSELECT TOP语句竟然返回多条记录的问题? Asp.net 利用OleDb的GetOLEDBSchemaTable方法...

空空如也

空空如也

1 2 3 4
收藏数 71
精华内容 28
关键字:

获取session中已缓存的数据