hibernate详解

Hibernate原理与应用

主要内容

1、引入

2、安装配置

3、基本概念和CURD

4HQLCriteria

5、关联映射

6、继承映射

7、集合映射

8、懒加载

9、缓存

10、事务

11、其他

12Hibernate不适合的场景

13、与JPA的集成(annotation方式)

14、最佳实践

1、引入

模型不匹配(阻抗不匹配)

       Java面向对象语言,对象模型,其主要概念有:继承、关联、多态等;数据库是关系模型,其主要概念有:表、主键、外键等。

解决办法

       1使用JDBC手工转换。

       2使用ORM(Object Relation Mapping对象关系映射)框架来解决,主流的ORM框架有HibernateTopLinkOJB

安装配置

下载地址http://www.hibernate.org

将下载目录/hibernate3.jar/lib下的hibernate运行时必须的包加入classpath中:

       antlr.jar,cglib.jar,asm.jar,commons-collections.jar,commons-logging.jar,jta.jar,dom4j.jar

 

配置文件hibernate.cfg.xmlhibernate.propertiesXMLproperties两种,这两个文件的作用一样,提供一个即可,推荐XML格式,下载目录/etc下是示例配置文件。

       可以在配置文件指定:

       数据库的URL、用户名、密码、JDBC驱动类、方言等。

       启动时Hibernate会在CLASSPATH里找这个配置文件。

映射文件(hbm.xml,对象模型和关系模型的映射)。在/eg目录下有完整的hibernate示例。

快速开始小例子

基本概念和CURD

开发流程

       1Domain object -> mapping->db(官方推荐)

       2DB开始,用工具生成mappingDomain object(使用较多)

       3由映射文件开始。

基本概念和CURD

Domain Object限制

       1.默认的构造方法(必须的)

       2有无意义的标示符id(主键)(可选)

       3final的,对懒加载有影响(可选)

       Domain Java Object(User)

public class User {

       private int id;

       private String name;

       private Date birthDay;

 

       //getter setter…

}

 

1.hbm.xml

<?xml version="1.0"?>

<hibernate-mapping package=“cn.itcast.domain">

<class name="User" table="user">

       <id name="id">

              <generator class="native"/>

       </id>

       <property name="name"/>

       <property name="birthday”/>

</class>

</hibernate-mapping>

 

Java代码

       1.初始化代码(只做一次)

        Configuration cfg = new Configuration();

        cfg.configure(“config.cfg.xml”);

        也可以通过cfg.setProperty设置属性。

        SessionFactory sessionFactory = cfg.buildSessionFactory();   

       2.模板代码

Session session = null;Transaction tx = null;

try{

       session = sessionFactory.openSession();

       tx = session.beginTransaction();

       //…你的代码save,delete,update,get

       tx.commit();

}catch(Exception e){

       if(tx !=null)tx.rollback();throw e;

}finally{

       if(session != null)session.close();

}

 

Session的几个主要方法

       1.save,persist保存数据,persist在事务外不会产生insert语句。

       2.delete,删除对象

       3.update,更新对象,如果数据库中没有记录,会出现异常。

       4.get,根据ID查,会立刻访问数据库。

       5.Load,根据ID查,(返回的是代理,不会立即访问数据库)

       6.saveOrUpdate,merge(根据IDversion的值来确定是saveupdate),调用merge你的对象还是托管的。

       7.lock(把对象变成持久对象,但不会同步对象的状态)

对象状态

瞬时(transient):数据库中没有数据与之对应,超过作用域会被JVM垃圾回收器回收,一般是new出来且与session没有关联的对象。

持久(persistent):数据库中有数据与之对应,当前与session有关联,并且相关联的session没有关闭,事务没有提交;持久对象状态发生改变,在事务提交时会影响到数据库(hibernate能检测到)

脱管(detached):数据库中有数据与之对应,但当前没有session与之关联;托管对象状态发生改变,hibernate不能检测到。

 

HQLCriteria

HQL(Hibernate Query Language)

       面向对象的查询语言,与SQL不同,HQL中的对象名是区分大小写的(除了JAVA类和属性其他部分不区分大小写);HQL中查的是对象而不是和表,并且支持多态;HQL主要通过Query来操作,Query的创建方式:

       Query q = session.createQuery(hql);

from Person

from User user where user.name=:name

from User user where user.name=:name and user.birthday < :birthday

Criteria

       Criteria是一种比HQL更面向对象的查询方式;Criteria的创建方式:

       Criteria crit = session.createCriteria(DomainClass.class);

       简单属性条件如:criteria.add(Restrictions.eq(propertyName, value)),

       criteria.add(Restrictions.eqProperty(propertyName,otherPropertyName))

 

基本功能练习

实现UserDao

       public interface UserDao {

       public void saveUser(User user);

       public User findUserById(int id);

       public User findUserByName(String name);

       public void updateUser(User user);

       public void remove(User user);

       }

 

实验步骤:

1.设计domain对象User

2.设计UserDao接口。

3.加入hibernate.jar和其依赖的包。

4.编写User.hbm.xml映射文件,可以基于hibernate/eg目录下的org/hibernate/auction/User.hbm.xml修改。

5.编写hibernate.cfg.xml配置文件,可以基于hibernate/etc/hibernate.cfg.xml修改;必须提供的几个参数:

       connection.driver_classconnection.urlconnection.usernameconnection.passworddialecthbm2ddl.auto

6.编写HibernateUtils类,主要用来完成Hibnerate初始化和提供一个获得Session的方法;这步可选。

7.实现UserDao接口。

关联映射

多对一(Employee - Department)

一对多(Department-Employee)

一对一(room - door)

多对多(teacher - student)

组件映射(User-Name)

集合映射(set, list, map, bag)

inversecascade(Employee Department)

 

多对一(Employee - Department)

映射文件<many-to-one name=depart column=depart_id/>

ER

 

关联映射

一对多(Department-Employee)

<set name=”employees”>

              <key column=”depart_id”/>

              <one-to-many class=”Employee”/>

</set>

 

一对一(Person - IdCard)

1)基于主键的one-to-one(person的映射文件)

<id name=”id”>

       <generator class=”foreign”><param name=”property”>idCard</param></generator>

<id>

<one-to-one name=”idCard” constrained=”true”/>

一对一(Person - IdCard)

2)基于外健的one-to-one,可以描述为多对一,加unique=true”约束

<one-to-one name=”idCard” property-ref=“person”/>

             property-ref用于指定关联类的一个属性,这个属性将会和本外键相对应

<many-to-one name=”person” column=”person_id” unique=”true” not-null=”true”/>

 <!-唯一的多对一,其实就便成了一对一了-->

关联映射

多对多(teacher - student)

在操作和性能方面都不太理想,所以多对多的映射使用较少,实际使用中最好转换成一对多的对象模型;Hibernate会为我们创建中间关联表,转换成两个一对多。

<set name="teacher" table="teacher_student">

              <key column="teacher_id"/>

              <many-to-many class="Student" column="student_id"/>

</set>

关联映射

组件映射(User-Name)

关联的属性是个复杂类型的持久化类,但不是实体即:数据库中没有表与该属性对应,但该类的属性要之久保存的。

<component name=”name” class=”com.test.hibernate.domain.Name”>

              <property name=”initial”/>

              <property name=”first”/>

              <property name=”last”/>

</component>

当组件的属性不能和表中的字段简单对应的时候可以选择实现:

org.hibernate.usertype. UserType

org.hibernate.usertype. CompositeUserType

对于一些不是复杂的实体类我们可以在数据库中没有表与之相对应

这时可选用Component组件

继承映射

对象模型(Java类结构)

 

继承映射

一个类继承体系一张表(subclass)(表结构)

继承映射

一个类继承体系一张表(subclass)(映射文件)

<class name="Employee" table="employee" discriminator-value="0">

              <id name="id">

                     <generator class="native"/>

              </id>

              <discriminator column="type" type="int"/>

              <property name="name"/>

              <many-to-one name=”depart” column=”depart_id”/>

              <subclass name="Skiller" discriminator-value="1">

                     <property name=”skill”/>

              </subclass>

              <subclass name="Sales" discriminator-value="2">

                     <property name="sell"/>

              </subclass>

</class>

一张表映射出一个继承树 操作就是一张表查询的效率高

缺点:对于新增加某一个类型时就要修改表结构信息且有的字段必须可以为NULL

继承映射

每个子类一张表(joined-subclass) (表结构)

多态查询效率会很低要将所有的表来查询一遍

每个子类都存储为一张表

这是当每个子类的属性差别都很大时会用该种方式来处理

继承映射

每个子类一张表(joined-subclass) (映射文件)

<class name="Employee" table="employee">

              <id name="id">

                     <generator class="native"/>

              </id>

              <property name="name"/>

              <joined-subclass name="Skiller" table="skiller">

                     <key column="employee_id"/>

                     <property name="skill"/>

</joined-subclass>

<joined-subclass name="Sales" table="sales">

       <key column="employee_id"/>

       <property name="sell"/>

</joined-subclass>

</class>

继承映射

混合使用“一个类继承体系一张表”和“每个子类一张表” (表结构)

继承映射

混合使用“一个类继承体系一张表”和“每个子类一张表” (映射文件)

<class name="Employee" table="employee">

              <id name="id">

                     <generator class="native"/>

              </id>

              <discriminator column="type"/>

              <property name="name"/>

              <subclass name="Skiller">

                     <property name="net"/>

              </subclass>

              <subclass name=”Sales”">

                     <join table="sales">

                            <key column="employee_id"/>

                            <property name="sell"/>

                     </join>

              </subclass>

</class>

继承映射

每个具体类一张表(union-subclass) (表结构)

根据主键来查询

要求三张表的id都是不同的如果用这种结构来实现()

增删改都是直接对单表进行操作

进行查询时有可能对三张表来进行查询(但hibernate会进行子查询连接查询)

继承映射

每个具体类一张表(union-subclass) (映射文件)

<class name="Employee" abstract="true">

              <id name="id">

                     <generator class="hilo"/>

              </id>

              <property name="name"/>

              <union-subclass name="Skiller" table="skiller">

                     <property name="skill"/>

              </union-subclass>

              <union-subclass name="Sales" table="sales">

                     <property name="sell"/>

              </union-subclass>        

       </class>

主健不能是identity类型,如果父类是abstract=true”就不会有表与之对应。

隐式多态,映射文件没有联系,限制比较多很少使用。

集合映射

集合映射(set, list, array,bag, map)

<set name=”employees” >

              <key column=”depart_id”/>

              <one-to-many class=”Employee”/>

              <!-- <element type="string" column="name"/> -->

              <!--

                     <composite-element class=”YourClass”>

                            <property name=”prop1”/>

                            <property name=”prop2”/>

                     </composite>

              -->

</set>

 

集合映射(set, list, array,bag, map)

<list name=”employees” >

              <key column=”depart_id”/>

              <!—表中有单独的整型列表示list-index 

              <list-index column=”order_column”/>

              <one-to-many class=”Employee”/>

</list>

<array name=”employees” >

              <key column=”depart_id”/>

              <!—表中有单独的整型列表示list-index 

              <list-index column=”order_column”/>

              <one-to-many class=”Employee”/>

</array>

 

集合映射(set, list, array,bag, map)

<bag name="employees " order-by="id desc">

              <key column=”depart_id”/>                

              <one-to-many class=”Employee”/>

</bag>

<map name="employees ">

              <key column=”depart_id”/>

              <map-key type="string" column="name"/>

              <one-to-many class=”Employee”/>

</map>

 

集合映射(set, list, array,bag, map)

这些集合类都是Hibernate实现的类和JAVA中的集合类不完全一样,set,list,map分别和JAVA中的Set,List,Map接口对应,bag映射成JAVAList;这些集合的使用和JAVA集合中对应的接口基本一致;在JAVA的实体类中集合只能定义成接口不能定义成具体类,因为集合会在运行时被替换成Hibernate的实现。

集合的简单使用原则:大部分情况下用set,需要保证集合中的顺序用list,想用java.util.List又不需要保证顺序用bag

集合映射

cascadeinverse (Employee Department)

Casade用来说明当对主对象进行某种操作时是否对其关联的从对象也作类似的操作,常用的cascade:

       none,all,save-update ,delete, lock,refresh,evict,replicate,persist,

       merge,delete-orphan(one-to-many)。一般对many-to-one,many-to-many不设置级联,在<one-to-one><one-to-many>中设置级联。

inverse表“是否放弃维护关联关系”(Java里两个对象产生关联时,对数据库表的影响),在one-to-manymany-to-many的集合定义中使用,inverse=true”表示该对象不维护关联关系;该属性的值一般在使用有序集合时设置成false(注意hibernate的缺省值是false)。

       one-to-many维护关联关系就是更新外键。many-to-many维护关联关系就是在中间表增减记录。

       :配置成one-to-one的对象不维护关联关系

 

懒加载

通过asmcglib二个包实现;Domain是非final的。

1.session.load懒加载。

2.one-to-one(元素)懒加载:

       必需同时满足下面三个条件时才能实现懒加载

       (主表不能有constrained=true,所以主表没有懒加载)

       lazy!=false 2)constrained=true 3)fetch=select

3.one-to-many (元素)懒加载:1)lazy!=false 2)fetch=select

4.many-to-one (元素)1)lazy!=false 2)fetch=select

5.many-to-many (元素)1)lazy!=false 2)fetch=select

6.能够懒加载的对象都是被改写过的代理对象,当相关联的session没有关闭时,访问这些懒加载对象(代理对象)的属性(getIdgetClass除外)hibernate会初始化这些代理,或用Hibernate.initialize(proxy)来初始化代理对象;当相关联的session关闭后,再访问懒加载的对象将出现异常。

初始时就创建了一个对象

如果你不需要那么它就不会去访问数据库

只有要真正需要数据时则需在session未关闭时去访问下数据库

对于一对一的情况下 主表的查询没有懒加载会从数据库中将从表查询出来                      从表默认是不会加载而是返回代理形式会有懒加载的形式

对于一对多缺省是懒加载的如果不是就会当我们例如查询部门时会将所有的员工信息都查出来

对于getID()   getClass() 这都是不需要访问数据库的 不会初始化代理对象

对于相应映射关系时存在懒加载的机制

缓存

缓存的作用主要用来提高性能,可以简单的理解成一个Map;使用缓存涉及到三个操作:把数据放入缓存、从缓存中获取数据、删除缓存中的无效数据。

一级缓存,Session级共享。

       save,update,saveOrUpdate,load,get,list,iterate,lock这些方法都会将对象放在一级缓存中,一级缓存不能控制缓存的数量,所以要注意大批量操作数据时可能造成内存溢出;可以用evict,clear方法清除缓存中的内容。

缓存

二级缓存,SessionFactory级共享。

实现为可插拔,通过修改cache.provider_class参数来改变;

       hibernate内置了对EhCache,OSCache,TreeCache,SwarmCache的支持,可以通过实现CacheProviderCache接口来加入Hibernate不支持的缓存实现。

hibernate.cfg.xml中加入:

       <class-cache class="className" usage="read-only"/>

       或在映射文件的class元素加入子元素:

       <cache usage="read-write"/>

       其中usage:read-only,read-write,nonstrict-read-write,transactional

Session:save(这个方法不适合native生成方式的主键),

       update,saveOrUpdate,list,iterator,get,load,以及Query,Criteria都会填充二级缓存,但只有(没打开查询缓存时)Sessioniterator,get,load会从二级缓存中取数据(iterator可能存在N+1次查询)

Query,Criteria(查询缓存)由于命中率较低,所以hibernate缺省是关闭;修改cache.use_query_cachetrue打开对查询的缓存,并且调用query.setCacheable(true)criteria.setCacheable(true)

SessionFactory中提供了evictXXX()方法用来清除缓存中的内容。

统计信息打开generate_statistics,用sessionFactory.getSatistics()获取统计信息。

缓存

分布式缓存和中央缓存。

使用缓存的条件

1.读取大于修改。

2.数据量不能超过内存容量。

3.对数据要有独享的控制。

4.可以容忍出现无效数据。

事务

JDBCTransaction

       单个数据库(一个SesisonFactory对应一个数据库),由JDBC实现。

       Session session = null;

       Transaction tx =null;

       try {

              session = sessionFactory.openSession();

              tx = session.beginTransaction();

              //process

              tx.commit();

       } catch(HibernateException e){

              if(tx != null)tx.rollback();throw e;

       }finally {

              if (session != null)session.close();

       }

       connection.setAutoCommit(false);

       connection.commit();conn.rollback();

 

JTATransaction

       可以简单的理解成跨数据库的事物,由应用JTA容器实现;使用JTATransaction需要配置hibernate.transaction.factory_class参数,该参数缺省值是org.hibernate.transaction. JDBCTransactionFactory,当使用JTATransaction时需要将该参数改成org.hibernate.transaction.JTATransactionFactory,并配置jta.UserTransaction参数JNDI(Hibernate在启动JTATransaction时要用该值到JNDI的上下文Context中去找javax.transaction.UserTransaction)

javax.transaction.UserTransactin tx = context.lookup(“jndiName”);

try{

       tx.begin();

       //多个数据库的session操作;

       //session1….

       //session2….

       tx.commit();

}catch(Exception e){

       tx.rollback(); throw e;

}

 

session context和事务边界

       current_session_context_class属性来定义context(用sessionFactory.getCurrentSession()来获得session),其值为:

1.threadThreadLocal来管理Session实现多个操作共享一个Session,避免反复获取Session,并控制事务边界,此时session不能调用closecommitrollback的时候session会自动关闭(connection.release_mode:after_transaction)

              Open session in view:在生成(渲染)页面时保持  session打开。

2.jta:由JTA事务管理器来管理事务(connection.release_mode:after_statement)

悲观锁和乐观锁

       悲观锁由数据库来实现;乐观锁hibernateversiontimestamp来实现

事务边界 开启提交 回滚

如想在业务逻辑层控制事务  但业务逻辑层不会与数据访问层有相当大的耦合

Transaction因为是业务逻辑层的对象

悲观锁我读取到信息时会对信息进行加锁操作等数据修改完后对数据锁进行释放其他才能修改(不可取)

看数据库的版本号与提交的版本号哪个更加新如果数据库的新则不允许提交的

其他问题

hibernate.cfg.xmlhbm.xml内容解释

数据类型

        1.<property name=“name” type=“java.lang.String”/>

         type可以是hibernatejava类型或者你自己的类型(需要实现hibernate的一个接口)

       2.基本类型一般不需要在映射文件(hbm.xml)中说明,只有在一个JAVA类型和多个数据库数据类型相对应时并且你想要的和hibernate缺省映射不一致时,需要在映射文件中指明类型(:java.util.Date,数据库DATE,TIME,DATATIME,TIMESTAMPhibernate缺省会把java.util.Date映射成DATATIME型,而如果你想映射成TIME,则你必须在映射文件中指定类型)

       3.数据类型的对应关系见参考文档5.2.2

Session是非线程安全的,生命周期较短,代表一个和数据库的连接,在B/S系统中一般不会超过一个请求;内部维护一级缓存和数据库连接,如果session长时间打开,会长时间占用内存和数据库连接。

SessionFactory是线程安全的,一个数据库对应一个SessionFactory,生命周期长,一般在整个系统生命周期内有效;SessionFactory保存着和数据库连接的相关信息(userpasswordurl)和映射信息,以及Hibernate运行时要用到的一些信息。

session内部封装了connection连接

对于session尽量晚的获得尽量早的释放

 

对于主键为自动增长类型因为要从数据库中获取才能进行插入所以会直接进入数据库

而不像其他类型先进入缓存等提交时才与数据库交互

其他问题

flush时将一级缓存与数据库同步

大批处理

       大量操作数据时可能造成内存溢出,解决办法如下:

       1.清除session中的数据

       for(int i=0;i<100000;i++)session.save(obj);

       for(int i=0;i<100000;i++){

              session.save(obj);

              if(i% 50 == 0){session.flush();     session.clear();}

       }

       2.StatelessSession接口:它不和一级缓存、二级缓存交互,也不触发任何事件、监听器、拦截器,通过该接口的操作会立刻发送给数据库,与JDBC的功能一样。

       StatelessSession s = sessionFactory.openStatelessSession();该接口的方法与Session类似。

       3.Query.executeUpdate()执行批量更新,会清除相关联的类二级缓存(sessionFactory.evict(class)),也可能会造成级联,和乐观锁定出现问题

 

其他问题

HQL

       1查询多个对象select art, user from Article art, User user where art.author.id=user.id and art.id=:id这种方式返回的是Object[]Object[0]:article,Object[1]:user

       2分页query.setFirstResult,query.setMaxResults.

         查询记录总数query.iterate(select count(*) from Person).next()

       3批量更新query.executeUpdate()可能造成二级缓存有实效数据。

Criteria

       1排序Criteria.addOrder(Order.desc(propertyName));

       2关联查询criteria.setFetchMode(propertyName, FetchMode.SELECT)与映射文件中关联关系的fetch作用一致。

       3投影Projections.rowCount(),max(propertyName), avg, groupProperty

       4分页Projections.rowCount(),criteria.setFirstResult(),criteria.setMaxResults()

       5DetachedCriteria可在session外创建(在其他层创建比如在Service中创建)然后用getExecutableCriteria(session)方法创建Criteria对象来完成查询。

       6Example查询,Example.create(obj);criteria.add(example)

查询表达式是不会利用缓存来进行查询的(默认情况下)

离线查询实现动态查询DetachedCriteria 他构造时不需要session

Cruteria构造时需要

其他问题

N+1次查询和懒加载

       1.Query.iterator可能会有N+1次查询。

       2.懒加载时获取关联对象。

       3.如果打开对查询的缓存即使用list也可能有N+1次查询。

拦截器与事件

       拦截器与事件都是hibernate的扩展机制,Interceptor接口是老的实现机制,现在改成事件监听机制;他们都是hibernate的回调接口,hibernatesave,delete,update…等会回调这些类。

SQL和命名查询

Map代替Domain对象;将对象转化为XML

 

命名查询是将查询语句集中起来到配置文件中更方便的修改

Hibernate不适合的场景

不适合OLAP(On-Line Analytical Processing联机分析处理),以查询分析数据为主的系统;适合OLTPon-line transaction processing联机事务处理)。

对于些关系模型设计不合理的老系统,也不能发挥hibernate优势。

数据量巨大,性能要求苛刻的系统,hibernate也很难达到要求,批量操作数据的效率也不高。

JPA的集成(annotation方式)

需要添加的包ejb3-persistence.jar, hibernate-entitymanager.jar, hibernate-annotations.jar, hibernate-commons-annotations.jar, jboss-archive-browsing.jar, javassist.jar

 配置文件%CLASSPATH%/META-INF/persistence.xml

JAVA代码:

       EntityManagerFactory emf = Persistence.createEntityManagerFactory(name);

       //(Name:persistence.xml中指定。)

       EntityManager em = emf.createEntityManager();

       EntityTransaction tx = em.getTransaction();

       Tx.begin();

       Em.persist(entity);//remove,merge,find

       Tx.commit();

       Em.close();

       Emf.close();

最佳实践

hibernate参考文档

 

 

转载于:https://www.cnblogs.com/james1207/p/3323080.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/277351.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android Studio 环境搭建参考,jdk10javac命令提示不是内部或外部命令

https://blog.csdn.net/qq_33658730/article/details/78547789 win10下Android Studio和SDK下载、安装和环境变量配置 http://yanmin99.com/ android-0基础从入门到精通 环境变量ANDROID_HOMEE:\Program Files (x86)\Android\SdkJAVA_HOMEE:\Program Files\Java\jdk1.8.0_161TO…

报表引擎 - 数据模型

介绍 本文档是报表模型的数据模型部分&#xff0c;说明平台报表中涉及的报表数据相关 术语 名称 说明 数据源 数据源是与数据存储的连接。支持数据源适配 数据集 定义报表数据来源的一个二维表 参数 报表往往有参数&#xff0c;例如&#xff0c;日报表&#xff0c;当…

分层架构web容器的配置安全

转自&#xff1a;http://hi.baidu.com/shineo__o/item/7520d54c24d234c71081da82 /ps:本以为这是一个偶然配置失误造成的问题&#xff0c;但最近几天无聊时测试发现&#xff0c;有此类似问题的站点就有上百个&#xff0c;所以在这里粗糙总结一下&#xff01; 通常我们会碰到这样…

Jenkins-Gitlab配置方法

1&#xff09;本机首先安装好git软件2&#xff09;然后安装gitlab插件,在可选插件中查找gitlab,点击直接安装3&#xff09;然后进入系统管理-系统设置 首先进入Gitlab中复制需要的 token 值在 Profile Settings - Account把复制的值&#xff0c;复制到新增页面中转载于:https:…

高速缓冲存储器的功能、结构与工作原理

2.3 高速缓冲存储器&#xff08;Cache&#xff09; 2.3.1 高速缓冲存储器的功能、结构与工作原理   高速缓冲存储器是存在于主存与CPU之间的一级存储器&#xff0c; 由静态存储芯片(SRAM)组成&#xff0c;容量比较小但速度比主存高得多&#xff0c; 接近于CPU的速度。 Cache…

spring集成RabbitMQ配置文件详解(生产者和消费者)

1&#xff0c;首先引入配置文件org.springframework.amqp&#xff0c;如下&#xff1a; <dependency><groupId>org.springframework.amqp</groupId><artifactId>spring-rabbit</artifactId><version>1.7.1.RELEASE</version></de…

Multiverse: Revolutionary Backend for Alembic // Multiverse: 下一代Alembic后端

J CUBE&#xff0c;日本最大的动画公司Polygon Picture&#xff08;以下简称PPI&#xff09;公司成立的专职R&D公司隆重推出Multiverse&#xff0c;下一代Alembic存储后端。 我们还开发了针对Autodesk Maya的工具&#xff0c;运用Multiverse在流程中。 "multiverse&qu…

近半年能力没进步原因分析与求助

2019独角兽企业重金招聘Python工程师标准>>> 20180907 思维方式有缺陷&#xff0c;想到的解决方法经常不是最有效率的。导致工作时间内基本没自由学习的时间。 业余时间不够专注&#xff0c;学习方向经常变&#xff0c;没能坚持搞透一个点就换书看&#xff0c;没有总…

windows下安装Redis并部署成服务

文章来源&#xff1a;https://www.cnblogs.com/weiqinl/p/6490372.html windows下安装Redis并部署成服务 Redis 是一个开源&#xff08;BSD许可&#xff09;的&#xff0c;内存中的数据结构存储系统&#xff0c;它可以用作数据库、缓存和消息中间件。 一&#xff1a;下载 下载地…

.net core高性能通讯开源组件BeetleX

BeetleX beetleX是基于dotnet core实现的轻量级高性能的TCP通讯组件&#xff0c;使用方便、性能高效和安全可靠是组件设计的出发点&#xff01;开发人员可以在Beetlx组件的支持下快带地构建高性能的TCP通讯服务程序&#xff0c;在安全通讯方面只需要简单地设置一下SSL信息即可实…

按组排名

rank() over,dense_rank() over,row_number() over的区别 1.rank() over&#xff1a;查出指定条件后的进行排名。特点是&#xff0c;加入是对学生排名&#xff0c;使用这个函数&#xff0c;成绩相同的两名是并列&#xff0c;下一位同学空出所占的名次。 select name,subject,sc…

[FxCop.设计规则]13. 定义自定义属性参数的访问属性

13. 定义自定义属性参数的访问属性 翻译概述&#xff1a; 一个比较无聊的规则&#xff0c;实在看不出在什么情况下&#xff0c;一个开发者会做出违反这条规则的设计。没有别的内容&#xff0c;只是说应该为自定义特性的构造函数中的参数提供一个相关的属性去读取它们的值。…

centos7安装Cloudera Manager

第一部分&#xff1a;准备工作一&#xff0c;修改hostname $vim /etc/sysconfig/network $source /etc/sysconfig/network例如&#xff1a; NETWORKINGyes HOSTNAMEspark01reboot重启服务器 二&#xff0c;关闭selinux查看SELinux状态1&#xff0c;/usr/sbin/sestatus -v #如果…

Grove——.NET中的ORM实现

Grove——.NET中的ORM实现 发布日期&#xff1a; 6/30/2005| 更新日期&#xff1a; 6/30/2005作者&#xff1a;林学鹏 ORM的全称是Object Relational Mapping&#xff0c;即对象关系映射。它的实质就是将关系数据&#xff08;库&#xff09;中的业务数据用对象的形式表示出来&a…

[book]道法自然

前不久读了王咏刚的〈凌波微步〉和〈凌波微步II〉&#xff0c;感觉不错。今天把他老人家的《道法自然》也买了下来。在dearbook看到关于这本书的长篇大评&#xff0c;也一块copy了下来&#xff1a;http://www.dearbook.com.cn/book/viewbook.aspx?pnoTS0023954认真的作者&…

列表嵌套字典,根据字典某一key排序

在返回列表嵌套字典时候&#xff0c;往往需要对数据进行一定的处理&#xff1a;按照字典中某一个key排序 In [87]: a [{"name": "牛郎", "age": 23},{"name":"许仙", "age": 20},{"name":"董永&q…

写出C语言中5种数据类型的名称及其关键字,求C语言中的32个关键字及其意思?...

关键字如下&#xff1a;一、数据类型关键字(12个)&#xff1a;(1) char &#xff1a;声明字符型变量或函数(2) double &#xff1a;声明双精度变量或函数(3) enum &#xff1a;声明枚举类型(4) float&#xff1a;声明浮点型变量或函数(5) int&#xff1a; 声明整型变量或函数(6…

想要设计自己的微服务?看这篇文章就对了

欢迎大家前往腾讯云社区&#xff0c;获取更多腾讯海量技术实践干货哦~ 本文由我就静静地看 发表于云社区专栏 本文通过使用Spring Boot&#xff0c;Spring Cloud和Docker构建的概念验证应用程序的示例&#xff0c;为了解常见的微服务架构模式提供了一个起点。 该代码在Github上…

mysql 开发进阶篇系列 41 mysql日志之慢查询日志

一.概述 慢查询日志记录了所有的超过sql语句( 超时参数long_query_time单位 秒&#xff09;&#xff0c;获得表锁定的时间不算作执行时间。慢日志默认写入到参数datadir(数据目录)指定的路径下。默认文件名是[hostname]_slow.log&#xff0c;默认超时是10秒&#xff0c;默认不开…

分数相同名次排名规则C语言,如何给数据排名(相同分数相同名次)-excel篇

使用Rank函数来做数据排名该函数是返回一个数值在一个数字列表中的排名。语法&#xff1a;RANK(number,ref,order)RANK(对象,范围,参数)number(必填参数):是特定单位格中的数据&#xff0c;需要在整个数字列表中排名的单个对象。ref(必填参数):是指需要排名的整体数列。即范围&…