知识随笔

来源:互联网 发布:java json解析框架 编辑:程序博客网 时间:2024/06/05 03:33
一.索引 


   根据数据库的功能,可以在数据库设计器中创建索引:唯一索引、主键索引和聚集索引。 尽管唯一索引有助于定位信息,但为获得最佳性能结果,建议改用主键或唯一约束。  
   唯一索引:   UNIQUE     例如:create unique index stusno on student(sno);

   表明此索引的每一个索引值只对应唯一的数据记录,对于单列惟一性索引,这保证单列不包含重复的值。对于多列惟一性索引,保证多个值的组合不重复。

   主键索引:   primary key

   数据库表经常有一列或列组合,其值唯一标识表中的每一行。该列称为表的主键。   
   在数据库关系图中为表定义主键将自动创建主键索引,主键索引是唯一索引的特定类型。
   该索引要求主键中的每个值都唯一。当在查询中使用主键索引时,它还允许对数据的快速访问。 
   
二.MySQL行级锁、表级锁、页级锁详细介绍


   页级:引擎 BDB      速度快,但是冲突多
   表级:引擎 MYiSAM   理解为锁住整个表,读可以,写不行
   行级:引擎 INNODB   理解为锁住一行数据,可以对其他行的数据进行操作。
   
   
三.关于数据库的事务


   事务是由一组SQL语句组成的逻辑处理单元,它包含了四个属性:
   
   1.原子性 :对于一组数据的操作,要么全部执行,要么全部不执行
   
   2.一致性 : 在事务开始和完成时,数据都必须保持一致状态
   
   3.隔离性 :数据库系统提供一定的隔离机制,保持事务不受外部影响,独立执行
   
   4.持久性 :对数据的操作保持持久性
   
   
四.理解HashCode和equals方法:


   1.在编写类的时候,HashCode和equals 都是需要被重写的;如果重写了equals 方法,那么HashCode方法则必须被重写。
   
   2.如果两个对象用equals方法比较的时候 返回的结果为true,那么这两个对象的hashCode方法返回的int值也必须是相等的。
   
   讲诉一个例子以便于理解HashCode方法:
   
   JAVA 中有两个集合,分别是List和Set。List 有序,可以重复 ;  Set 无序  不能重复


   问题在于,如果数据不允许重复的时候,就可以使用equals来比较,将重复的数据剔除掉,但是如果数据量比较大的时候,每个数据都用equals比较
   
   会大大的降低效率,所以就用hashCode方法。比如一个位置上如果有人,就不能再添加数据了。极大的提高了效率   
   
   
五.request域的范围


   学习Servlet的时候,有一个SrvletContext域,这个域的应用范围是在整个web应用的;而Request的域的范围就会小很多,指的是当一个用户发送请求的时候
   
   开始创建,当请求关闭的时候 Request就会消亡。
   
   
六.关于单例模式和多例模式


   1.什么是单例模式和多例模式:
    
 单例就是指所有的请求都用一个对象,比如Service层和Dao层;  而多例模式就是指每一次请求都用一个新的对象来处理  比如Action
 
   2.为什么用单例模式和多例模式:
   
      用单例模式是因为不用每一次请求都创建一个对象,浪费CPU和内存
 
 用多例模式是为了防止并发问题
 
 标准:  当对象在实际应用中状态会改变,则用多例模式,否则就用单例模式
 
 
   3.单例模式的关键有两点:
   
      用private修饰,不允许外部随意调用
 
      get的方法是static的,由类名直接调用

   SpringMvc中的Controller 默认是单例模式的,也就是说若有一个私有变量user,则这个user是共用的,也就是说如果有一个请求对这个user进行了修改,
   
   别的请求也能够读取到这个修改的内容。
   
   如果想将其改为多例模式,只需要将@Controller之前增加 @Scope(prototype)
   
   单例模式的缺点:
      
 访问量多的时候需要一个一个的等待,影响用户体验
 
 
七,关于懒加载


    单例模式有三种形式:分别是懒汉式  饿汉式  双重锁的形式

懒加载其实就是懒汉式

        指的是当第一次使用到这个属性的时候,才会给这个属性进行初始化,如果程序还没有运行到这个位置的时候 就不进行创建和初始化,

这样有利于节约资源,提高性能。

尤其是数据量比较大或者是图片比较多的时候,一下子把全部的数据都加载出来,服务器会承受相当大的压力

当采取树形结构则不同,点击父节点会显示出对应的子节点,当点击具体的子节点的时候,才会加载并显示出详细的信息。


八.关于JAVA的反射机制


    1.反射机制的作用:

  a. .class -->  .java
  
  b. 通过java的反射机制 访问java的属性,方法,以及构造方法。
  
  
2.sun公司提供的反射机制的类

  a.  java.lang.Class
  
  b.  java.lang.reflect.Constructor
  
  c.  java.lang.reflect.Method
  
  d.  java.lang.reflect.Medifier
  
  e.  java.lang.reflect.Field
  
  
3.具体功能的实现


       第一种方式:  Class.forName(Employee)
  
  第二种方式:  Employee.class

  第三种方式:  Employee  ee = new Employee ()
     
            ee.getClass()
 
 
 
九.堆内存和栈内存


    1.栈内存:   栈内存的存取速度比较快  /  另外数据可以共享   /  缺点 :生命周期确定


    2.堆内存:   堆内存可以动态分配内存  /  数据不可以共享     /  缺点:由于要动态分配内存,所以存取速度比较慢  /  


            存放所有  new() 出来的对象   /   并且分配出的内存是由 java 垃圾回收机制进行回收的。

十. 垃圾回收机制  


       System.gc()方法   /  不管JVM 请求的是哪一种垃圾回收的算法,都可以请求java的垃圾回收

但这个方法发起的请求仅仅是一个建议  / JVM 接收到这个请求以后并不是立即进行垃圾回收,而是对几个垃圾回收算法做了加权   /  

使垃圾回收操作容易发生  /  或者提早发生   /   或者回收较多。


十一. 数据库设计的三大范式:


    第一范式:  简单的说就是  原子性,自断不能再分割

   1.每一列的属性都是不可再分的属性值,确保每一列的原子性

2.两列的属性相近或则一样的时候,尽量合并,确保不会产生冗余数据;


    第二范式: 简单的说就是  完全依赖  不能部分依赖

   1.确保每一行数据都只是做一件事情。   比如一个人订多个房间的时候就会产生多个订单编号的问题


第三范式:  简单的说就是  没有传递依赖

   1.数据库的属性值不能存在传递关系,即每个属性和主键之间都存在直接关系而不是间接关系。


十二. Hibernate缓存分类:


    一. Session缓存(也叫做事物缓存),它是Hibernate内置的缓存,不能卸载。

   缓存范围:缓存只能被当前Session所调用,生命周期依赖Session的生命周期,当Session被关闭后,缓存也就结束其生命周期。


    二. SessionFactory缓存(应用缓存) 使用第三方插件,可以卸载。

   可以跨越Session存在,也可以被多个Session所共享。

           缓存范围: 依赖于应用的生命周期,应用结束时,缓存也就结束了生命周期。    


十四. ApplicationContext 和 BeanFoctroy


       spring 提供了两种不同的容器: 一种是基本的BeanFactory  另外一种就是ApplicationContext
  
  A. 二者的区别:
  
     BeanFactory           负责加载Bean 实例化、 对Bean的管理、 Bean之间的维护、 以及对Bean生命周期的管理。
  
     ApplicationContext    除了上述的功能以外,还提供了更完整的框架功能。
 
       B. 二者在Bean的初始化方面也有很大的区别:
  
     BeanFactory           在读取配置信息,创建Bean实例的时候,如果读取的配置信息正确,即便其他的配置信息存在错误,也不会影响程序的运行
 
     ApplicationContext    则是要读取所有的xml文件,当配置信息没有错误的时候,就创建所有的Bean。因此当配置的bean比较多的时候,程序启动的

                                                    速度就会比较的慢


十五.设计模式

      代理设计模式   是为了将代理业务和核心业务区分开
 
      工厂模式       是为了解耦合
   
十六.Cookie 和 Session


        1.Cookie数据存放在客户端上,Session数据存放在服务器上。
 
2.Cookie存放不是很安全,别人可以通过分析你在本地的Cookie,进行Cookie欺骗。考虑到安全性能应该用Session
 
3.Session存放在服务器上,当Session太多的时候,会降低你的服务器性能。考虑到性能方面,应该考虑使用Cookie
 
4.单个Cookie保存的数据不能超过4K。很多浏览器设置的都是一个站点最多保存20个Cookie
 
5.登陆的信息保存在Session中,其他信息如果需要保留,可以放在Cookie中
   
spring中bean的生命周期
 
 
十七.关于事务你知道多少?
 
1.事务分为声明式事务(spring 的aop方式)和编程式事务
 
2.如果对数据库进行多次操作,那么每一次执行都是一次事务,如果在操作在某一步没有在执行,或者出现异常而导致事务失败,
 
  那么所有的事务都会被回滚。
  
3.java使用事务处理,首先要求数据库支持事务,如果是MySql数据库,就必要要保证表的类型为Innodb才会支持事务。
 
4.在api里面,可以设置事务自动提交的方式。setAutoCommit(false) 禁止自动提交事务。
 

十八.声明式事务和编程式事务

        1.Spring支持声明式事务管理和编程式事务管理两种方式。
 
2.编程式事务: 采用的是TransactionTemplate 或者使用底层的PlatformTransactionManager,前者是Spring推荐使用的方式
 
3.声明式事务: 是建立在AOP方式之上的,是对方法进行的拦截,在目标方法执行之前,创建或者加入一个事务,根据方法执行的
 
              情况来决定是提交或者回滚事务。
  
优点:是Spring提倡的非侵入式的开发方式,最大的优点就是不需要通过编码的方式进行事务的管理,不需要再业务逻辑中掺杂事务管理的代码。

    是通过tx和aop名字空间的xml方式或者@Transactional注解的方式。
 
   缺点:就是没有编程式事务管理方式那样可以细化到代码块级别,生命式事务管理方式只能作用到方法级别。
 
十九.事务隔离级别

     Spring的所有事务管理策略类都继承自org.springframework.transaction.PlatformTransactionManager。
 
      其中TransactionDefinition接口定义了一下特性:
 
TransactionDefinition.isolation_default :默认级别


TransactionDefinition.isolation_read_uncommited :会出现脏读,不可重复读,很少使用

TransactionDefinition.isolation_read_commited :防止脏读,推荐使用

TransactionDefinition.isolation_repeatable_read :防止脏读,不可重复读

       TransactionDefinition.isolation_serializable :防止脏读,不可重复读和幻读,但是会严重影响数据库性能。不推荐使用


二十.事务传播行为


     Spring的所有事务管理策略类都继承自org.springframework.transaction.PlatformTransactionManager。
 
      其中TransactionDefinition接口定义了一下特性:
 
TransactionDefinition.propagation_required :如果存在当前事务就加入,如果不存在,则创建一个新的事务。

TransactionDefinition.propagation_required_new :

TransactionDefinition.propagation_required_supports :

TransactionDefinition.propagation_required_not_support :


二十一.事务超时

        TransactionDefinition定义的事务超时就是在规定的时间内,事务没有完成操作就执行回滚的动作,超时时间用int值来表示,
 
默认是秒,如果底层数据事务没有设置超时时间,就是none。

二十二.乐观锁和悲观锁


        1.乐观锁和悲观锁都是并发控制的主要技术手段
 
2.悲观锁是利用数据库自身的锁机制来实现的,因为只有数据库层提供的锁机制才能真正实现排他性。
 
3.悲观锁是在数据处理过程中,将数据处于锁定状态,比如for update语句
 
4.select for update 是基于行级锁的,就比如MySql INNODB默认的就是行级锁,
 
  行级锁都是基于索引来实现的,但是如果一条sql语句用不到索引,就会表级锁把整张表锁住。
 
5.乐观锁一般是利用版本号来控制的,比如svn版本控制器。
 
优点与不足:
 
         1.悲观锁是先取锁再访问,保证了数据处理的安全性,但是容易产生死锁,并且容易给数据库带来较大的负担。
 
2.乐观锁不能防范脏数据。
   
二十三.脏读、不可重复读、幻读

       1.脏读: 是指一个事务正在访问数据,并且对数据进行了修改,但是还没有提交到数据库,此时另外一个事务也使用了这条数据。

2.不可重复读: 是指一个事务对同一条数据进行多次访问,在第一次访问以后,另外一条数据对这条数据进行了修改提交,

               那么当第一个事务对这条数据进行第二次读取的时候,会出现和第一次数据读取结果不同的情况。
 
3.幻读:是指事务不是独立执行时发生的一种现象。一个事务正在对数据库表中的全部数据行进行修改操作,此时,另外一个事务
   
                       对此表进行了插入操作,这时第一个事务就会发现出现了原来没有发现的数据行,也就是记录数不一样了。

二十四.Zookeeper

        一.背景:

            网站架构逐渐从集中式转变为分布式。在这个转变过程中产生了分布式系统中数据一致性的问题。

        二.概述:
   
            是一个开放源码的分布式服务协调组件,是Google Chubby 的开源实现。是一个高性能的分布式数据一致性的解决方案。

        三.工作过程:
 
            在Zookeeper整个集群开始启动的时候,会选出一个leader,其他的则成为follower,并且和leader建立长连接,用于数据同步和转发请求。

            当follower接收到client发送的请求的时候,将请求转发给leader,由leader处理该请求、并把数据同步给所有的follower。

0 0
原创粉丝点击