关于缓存一些问题

1.新建一个工具类

2.编写代码

package cn.happy.day01.util;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

/**
 * Created by CY on 2017/12/23.
 */
public class HibernateUtil {
    private static ThreadLocal<Session> tl=new ThreadLocal<Session>();
    private static Configuration cfg;
    private static SessionFactory sessionFactory;
    static {
        cfg=new Configuration().configure();
        sessionFactory=cfg.buildSessionFactory();
    }
    public static  Session getSession(){
        Session session=tl.get();
        if(session==null){
             session = sessionFactory.openSession();
           tl.set(session);
        }
        return session;
    }
    public static void closeSession(){
        Session session = (Session) tl.get();
        tl.set(null);
        session.close();
    }
}

注意这里使用的是openSession();

3.大配置小配置:不用解了

<?xml version=‘1.0‘ encoding=‘utf-8‘?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <!---->
    <session-factory>
        <property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
        <property name="connection.url">jdbc:oracle:thin:@localhost:1521:orcl</property>
        <property name="connection.username">happy</property>
        <property name="connection.password">happy</property>
        <!--sql 方言-->
        <property name="dialect">org.hibernate.dialect.Oracle10gDialect</property>
        <!--连接池-->
        <!--<property name="connection.pool_size">1</property>-->
        <!--和当前线程绑定-->
        <property name="current_session_context_class">thread</property>
        <!--echo 打印控制台语句 shout-->
        <property name="show_sql">true</property>
        <!--格式化代码-->
        <property name="format_sql">true</property>
        <!--自动更新表结构 createe  先delete表结构 在创建  update直接更新表结构-->
        <property name="hbm2ddl.auto">update</property>
        <mapping resource="cn/happy/day01/entity/Dog.hbm.xml" />
        <mapping resource="cn/happy/day01/entity/Student.hbm.xml" />
    </session-factory>

</hibernate-configuration>
@Entity
public class Student {
    private  Integer sid;
    private  String sname;
    private  Integer sage;
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="cn.happy.day01.entity">
    <class name="Student" table="STUDENT" schema="happy">
        <id name="sid"  column="sid">
            <!-- native   数据库方言的可移植性 -->
            <generator class="native"/>
        </id>
        <property name="sname" column="sname" />
        <property name="sage"  column="sage"/>
    </class>
</hibernate-mapping>

4.数据库使用的是Oracle

/*
Navicat Oracle Data Transfer
Oracle Client Version : 11.2.0.1.0

Source Server         : happy
Source Server Version : 110200
Source Host           : localhost:1521
Source Schema         : HAPPY

Target Server Type    : ORACLE
Target Server Version : 110200
File Encoding         : 65001

Date: 2017-12-24 22:31:33
*/

-- ----------------------------
-- Table structure for STUDENT
-- ----------------------------
DROP TABLE "HAPPY"."STUDENT";
CREATE TABLE "HAPPY"."STUDENT" (
"SID" NUMBER(10) NOT NULL ,
"SNAME" VARCHAR2(255 CHAR) NULL ,
"SAGE" NUMBER(10) NULL
)
LOGGING
NOCOMPRESS
NOCACHE

;

-- ----------------------------
-- Records of STUDENT
-- ----------------------------
INSERT INTO "HAPPY"."STUDENT" VALUES (‘4‘, ‘小红‘, ‘12‘);

-- ----------------------------
-- Indexes structure for table STUDENT
-- ----------------------------

-- ----------------------------
-- Checks structure for table STUDENT
-- ----------------------------
ALTER TABLE "HAPPY"."STUDENT" ADD CHECK ("SID" IS NOT NULL);

-- ----------------------------
-- Primary Key structure for table STUDENT
-- ----------------------------
ALTER TABLE "HAPPY"."STUDENT" ADD PRIMARY KEY ("SID");

5.使用的jar包

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <parent>
        <artifactId>Y2166</artifactId>
        <groupId>cn.happy</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>hibernate</artifactId>
    <packaging>war</packaging>
    <name>hibernate Maven Webapp</name>
    <url>http://maven.apache.org</url>
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.3</version>
            <scope>test</scope>
        </dependency>
        <!--oracle jdbc-->
        <dependency>
            <groupId>com.oracle</groupId>
            <artifactId>ojdbc6</artifactId>
            <version>11.2.0.1.0</version>
        </dependency>
        <!--hibernate核心jar-->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>5.0.6.Final</version>
        </dependency>
        <!--oracle 事务-->
        <dependency>
            <groupId>javax.transaction</groupId>
            <artifactId>jta</artifactId>
            <version>1.1</version>
        </dependency>
        <!--mysql数据库驱动-->
        <dependency>
            <groupId>org.wisdom-framework</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.34_1</version>
        </dependency>

    </dependencies>
    <build>
        <resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.*</include>
                </includes>
            </resource>
        </resources>
    </build>
</project>

6.测试类

数据库修改前:

测试修改

package day02hql;

import cn.happy.day01.entity.Student;
import cn.happy.day01.util.HibernateUtil;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import java.util.List;

/**
 * 脏检查和缓存机制探讨
 */
public class mytest20171224_02 {
    Configuration cfg;
    SessionFactory factory;
    Session session;
    Transaction tx;
    @Before
    public void before(){
        cfg=new Configuration().configure();
        factory=cfg.buildSessionFactory();
        session=factory.getCurrentSession();
        tx=session.beginTransaction();
    }

    @Test
    public void t1(){
        //使用update更新数据
        Student student = session.load(Student.class, 4);
        student.setSname("小贱贱");
        session.update(student);
        tx.commit();
        //在数据同步情况下更新数据
        Student student1 = HibernateUtil.getSession().load(Student.class, 4);
        student1.setSname("小军");
        HibernateUtil.closeSession();
    }
}

数据库运行后

运行结果:

可以看到数据库确实是更新了

但是控制台却打印出来两条查询语句

E:\jdk\bin\java -ea -Didea.launcher.port=7535 "-Didea.launcher.bin.path=E:\ideat\IntelliJ IDEA 2016.3.2\bin" -Dfile.encoding=UTF-8 -classpath "E:\ideat\IntelliJ IDEA 2016.3.2\lib\idea_rt.jar;E:\ideat\IntelliJ IDEA 2016.3.2\plugins\junit\lib\junit-rt.jar;E:\jdk\jre\lib\charsets.jar;E:\jdk\jre\lib\deploy.jar;E:\jdk\jre\lib\ext\access-bridge-32.jar;E:\jdk\jre\lib\ext\cldrdata.jar;E:\jdk\jre\lib\ext\dnsns.jar;E:\jdk\jre\lib\ext\jaccess.jar;E:\jdk\jre\lib\ext\jfxrt.jar;E:\jdk\jre\lib\ext\localedata.jar;E:\jdk\jre\lib\ext\nashorn.jar;E:\jdk\jre\lib\ext\sunec.jar;E:\jdk\jre\lib\ext\sunjce_provider.jar;E:\jdk\jre\lib\ext\sunmscapi.jar;E:\jdk\jre\lib\ext\sunpkcs11.jar;E:\jdk\jre\lib\ext\zipfs.jar;E:\jdk\jre\lib\javaws.jar;E:\jdk\jre\lib\jce.jar;E:\jdk\jre\lib\jfr.jar;E:\jdk\jre\lib\jfxswt.jar;E:\jdk\jre\lib\jsse.jar;E:\jdk\jre\lib\management-agent.jar;E:\jdk\jre\lib\plugin.jar;E:\jdk\jre\lib\resources.jar;E:\jdk\jre\lib\rt.jar;E:\Y2166\hibernate\target\test-classes;E:\Y2166\hibernate\target\classes;E:\mavon\repository\junit\junit\4.3\junit-4.3.jar;E:\mavon\repository\com\oracle\ojdbc6\11.2.0.1.0\ojdbc6-11.2.0.1.0.jar;E:\mavon\repository\org\hibernate\hibernate-core\5.0.6.Final\hibernate-core-5.0.6.Final.jar;E:\mavon\repository\org\jboss\logging\jboss-logging\3.3.0.Final\jboss-logging-3.3.0.Final.jar;E:\mavon\repository\org\hibernate\javax\persistence\hibernate-jpa-2.1-api\1.0.0.Final\hibernate-jpa-2.1-api-1.0.0.Final.jar;E:\mavon\repository\org\javassist\javassist\3.18.1-GA\javassist-3.18.1-GA.jar;E:\mavon\repository\antlr\antlr\2.7.7\antlr-2.7.7.jar;E:\mavon\repository\org\jboss\jandex\2.0.0.Final\jandex-2.0.0.Final.jar;E:\mavon\repository\dom4j\dom4j\1.6.1\dom4j-1.6.1.jar;E:\mavon\repository\xml-apis\xml-apis\1.0.b2\xml-apis-1.0.b2.jar;E:\mavon\repository\org\hibernate\common\hibernate-commons-annotations\5.0.1.Final\hibernate-commons-annotations-5.0.1.Final.jar;E:\mavon\repository\javax\transaction\jta\1.1\jta-1.1.jar;E:\mavon\repository\org\wisdom-framework\mysql-connector-java\5.1.34_1\mysql-connector-java-5.1.34_1.jar;E:\mavon\repository\org\apache\felix\org.apache.felix.ipojo.annotations\1.12.1\org.apache.felix.ipojo.annotations-1.12.1.jar;E:\mavon\repository\org\wisdom-framework\abstract-jdbc-driver\0.5\abstract-jdbc-driver-0.5.jar" com.intellij.rt.execution.application.AppMain com.intellij.rt.execution.junit.JUnitStarter -ideVersion5 day02hql.mytest20171224_02,t1
十二月 24, 2017 10:36:14 下午 org.hibernate.Version logVersion
INFO: HHH000412: Hibernate Core {5.0.6.Final}
十二月 24, 2017 10:36:14 下午 org.hibernate.cfg.Environment <clinit>
INFO: HHH000206: hibernate.properties not found
十二月 24, 2017 10:36:14 下午 org.hibernate.cfg.Environment buildBytecodeProvider
INFO: HHH000021: Bytecode provider name : javassist
十二月 24, 2017 10:36:14 下午 org.hibernate.annotations.common.reflection.java.JavaReflectionManager <clinit>
INFO: HCANN000001: Hibernate Commons Annotations {5.0.1.Final}
十二月 24, 2017 10:36:15 下午 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure
WARN: HHH10001002: Using Hibernate built-in connection pool (not for production use!)
十二月 24, 2017 10:36:15 下午 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH10001005: using driver [oracle.jdbc.driver.OracleDriver] at URL [jdbc:oracle:thin:@localhost:1521:orcl]
十二月 24, 2017 10:36:15 下午 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH10001001: Connection properties: {user=happy, password=****}
十二月 24, 2017 10:36:15 下午 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH10001003: Autocommit mode: false
十二月 24, 2017 10:36:15 下午 org.hibernate.engine.jdbc.connections.internal.PooledConnections <init>
INFO: HHH000115: Hibernate connection pool size: 20 (min=1)
十二月 24, 2017 10:36:16 下午 org.hibernate.dialect.Dialect <init>
INFO: HHH000400: Using dialect: org.hibernate.dialect.Oracle10gDialect
十二月 24, 2017 10:36:16 下午 org.hibernate.id.UUIDHexGenerator <init>
WARN: HHH000409: Using org.hibernate.id.UUIDHexGenerator which does not generate IETF RFC 4122 compliant UUID values; consider using org.hibernate.id.UUIDGenerator instead
十二月 24, 2017 10:36:17 下午 org.hibernate.tool.hbm2ddl.SchemaUpdate execute
INFO: HHH000228: Running hbm2ddl schema update
Hibernate:
    select
        student0_.sid as sid1_1_0_,
        student0_.sname as sname2_1_0_,
        student0_.sage as sage3_1_0_
    from
        happy.STUDENT student0_
    where
        student0_.sid=?
十二月 24, 2017 10:36:18 下午 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure
WARN: HHH10001002: Using Hibernate built-in connection pool (not for production use!)
十二月 24, 2017 10:36:18 下午 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH10001005: using driver [oracle.jdbc.driver.OracleDriver] at URL [jdbc:oracle:thin:@localhost:1521:orcl]
十二月 24, 2017 10:36:18 下午 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH10001001: Connection properties: {user=happy, password=****}
十二月 24, 2017 10:36:18 下午 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH10001003: Autocommit mode: false
十二月 24, 2017 10:36:18 下午 org.hibernate.engine.jdbc.connections.internal.PooledConnections <init>
INFO: HHH000115: Hibernate connection pool size: 20 (min=1)
十二月 24, 2017 10:36:18 下午 org.hibernate.dialect.Dialect <init>
INFO: HHH000400: Using dialect: org.hibernate.dialect.Oracle10gDialect
十二月 24, 2017 10:36:18 下午 org.hibernate.tool.hbm2ddl.SchemaUpdate execute
INFO: HHH000228: Running hbm2ddl schema update
Hibernate:
    select
        student0_.sid as sid1_1_0_,
        student0_.sname as sname2_1_0_,
        student0_.sage as sage3_1_0_
    from
        happy.STUDENT student0_
    where
        student0_.sid=?

Process finished with exit code 0

?待讨论

时间: 2024-10-14 07:47:39

关于缓存一些问题的相关文章

Apache Ignite——新一代数据库缓存系统

Apache Ignite是一个通用的数据库缓存系统,它不仅支持所有的底层数据库系统,比如RDBMS.NoSQL和HDFS,还支持Write-Through和Read-Through.Write-Behind Caching等可选功能. Apache Ignite是一个聚焦分布式内存计算的开源项目,它在内存中储存数据,并分布在多个节点上以提供快速数据访问.此外,可选地将数据同步到缓存层同样是一大优势.最后,可以支持任何底层数据库存储同样让 Ignite成为数据库缓存的首先.

数据字典实现缓存

数据字典的好处很多比如: 1.可以减少使用表,来专门记录类型. 2.类型使用key检索,或者报表统计分析,在一定程度上相比汉字来讲,效率好得多. 3.使用缓存的数据字典.也可以减少不少的io操作. 等等.... 首先,库表设计就智者见智了.不多说.爱怎么设计就怎么设计. 完整的数据字典设计 ,需要 1.生成select 自定义标签. 2.list页面,或者get页面, 一个key转 value的标签 使用自定义标签,搭配上缓存的数据字典是最方便.最完美的解决办法, 接下来,就直接贴代码了. 一.

4.缓存控制技术

动态网站的数据都是从数据库获取而来的.所以网站的瓶颈往往就是反复连接数据库和大量的SQL语句查询的执行.由于HTTP协议是无状态性的,所以每次对页面请求都会执行相同的操作.我们可以让页面内容本身变化不大但是偶尔还是要变化的页面(例如新闻网站)缓存起来作为静态的页面,下一次再访问的时候直接访问静态的HTML页面即可. ① Smarty里面控制缓存 需要做3步工作:开启缓存,指定缓存目录,定义缓存的生命周期

Shiro缓存(十三)

使用缓存,可以解决每次访问请求都查数据库的问题.第一次授权后存入缓存. 缓存流程 shiro中提供了对认证信息和授权信息的缓存.shiro默认是关闭认证信息缓存的,对于授权信息的缓存shiro默认开启的.主要研究授权信息缓存,因为授权的数据量大. 用户认证通过. 该 用户第一次授权:调用realm查询数据库 该 用户第二次授权:不调用realm查询数据库,直接从缓存中取出授权信息(权限标识符). -------------------------------------使用ehcache缓存框架

Hibernate session缓存

一级缓存(执行代码时查看console台上的sql语句)  清空缓存 @Test public void demo03(){ //清空缓存 Session session=factory.openSession(); session.beginTransaction(); //1.查询 User user = (User)session.get(User.class, 1); System.out.println(user); //session.evitc(user) //将执行对象从一级缓存

nginx三 之缓存模块

友情提示: 缓存模块是在动静分离的环境基础上搭建,动静分离可以参考http://www.cnblogs.com/dahuandan/p/6759212.html 介绍 提高网站响应速度是web应用不容忽视的目标,在之前动静分离的基础上,我们已经降低了后端服务器压力,提高了处理请求的性能,但是用户请求的静态资源是从硬盘读取,相比内存的性能还有很大的提高: Nginx自带的缓存模块可以把静态资源缓存到内存中,提高了用户请求静态资源的速度,并且nginx自带缓存模块配置简单,使用灵活,搭配第三方插件可

一个缓存容灾写的样例

背景 有时我们能够使用缓存进行容灾的处理.场景例如以下:我们当前有一个专门提供各种数据的应用DataCore,该应用开放多个RFC方法供其它应用使用.      我们平时在读写数据时,会在Cache备份一份(为平时DataCore提高响应速度.减少DB.CPU压力所用),当DB挂掉的时候.Cache还能够用来容灾.使用缓存容灾的优点是:性能足够好,坏处是缓存可比数据库成本高多了. 让我们想象得更猛烈些,当DataCore整个挂掉的时候,A.B.C.D方怎么才干安然的执行下去? 我们能够在A.B.

浏览器缓存机制浅析

非HTTP协议定义的缓存机制 浏览器缓存机制,其实主要就是HTTP协议定义的缓存机制(如: Expires: Cache-control等).但是也有非HTTP协议定义的缓存机制,如使用HTML Meta 标签,Web开发者可以在HTML页面的<head>节点中加入<meta>标签,代码如下: <META HTTP-EQUIV="Pragma" CONTENT="no-cache"> 上述代码的作用是告诉浏览器当前页面不被缓存,每

缓存与数据库的一致性思考

时隔两年,重新启动这个博客.熟悉又有点陌生,这两年我的技术方向有了很大改变,但由于一直在使用为知笔记,因此这些改变没有提现在本博客上.之所以重启这个博客,主要是因为博客是一个开放的东西,可以带来一些交流,而笔记则是个人的东西,缺少思维碰撞.闲话少叙,这就开始. 问题:怎么保持缓存与数据库一致? 要解答这个问题,我们首先来看不一致的几种情况.我将不一致分为三种情况: 1. 数据库有数据,缓存没有数据: 2. 数据库有数据,缓存也有数据,数据不相等: 3. 数据库没有数据,缓存有数据. 在讨论这三种

构建高效可申缩的结果缓存

摘自<<JAVA并发编程实战>> public interface Computable<A, V> { V comput(A arg); } import java.util.concurrent.*; /** * 构建高效可申缩的结果缓存 * <p> * author: shiruiqiang * time: 31/01/2017 23:11 **/ public class Memoizer<A, V> implements Computa