Session与Cookie区别。
- cookie数据存放在客户的浏览器上,session数据放在服务器上.
Session是由应用服务器维持的一个服务器端的存储空间,用户在连接服务器时,会由服务器生成一个唯一的SessionID,用该SessionID 为标识符来存取服务器端的Session存储空间。而SessionID这一数据则是保存到客户端,用Cookie保存的,用户提交页面时,会将这一 SessionID提交到服务器端,来存取Session数据。这一过程,是不用开发人员干预的。所以一旦客户端禁用Cookie,那么Session也会失效。 - cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗考虑到安全应当使用session
- session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能考虑到减轻服务器性能方面,应当使用cookie
- 设置cookie时间可以使cookie过期。但是使用session-destory(),我们将会销毁会话。
- 设置cookie时间可以使cookie过期。但是使用session-destory(),我们将会销毁会话。
- 两者最大的区别在于生存周期,一个是IE启动到IE关闭.(浏览器页面一关
,session就消失了),一个是预先设置的生存周期,或永久的保存于本地的文件。(cookie) Session信息是存放在server端,但session id是存放在client cookie的,当然php的session存放方法是多样化的,这样就算禁用cookie一样可以跟踪
数据库的优化。
1. 优化数据库表结构的设计
- 字段的数据类型:不同的数据类型的存储和检索方式不同,对应的性能也不同,所以说要合理的选用字段的数据类型。比如人的年龄用无符号的unsigned
tinyint即可,没必要用integer - 数据类型的长度:数据库最终要写到磁盘上,所以字段的长度也会影响着磁盘的I/O操作,如果字段的长度很大,那么读取数据也需要更多的I/O,
所以合理的字段长度也能提升数据库的性能。比如用户的手机号11位长度,没必要用255个长度。 - MyISAM不支持事务,表级锁,但是查询速度快,InnoDB支持事务,行锁。
2.SQL优化 - MySQL性能优化的一个很重要的手段就是对SQL语句的优化。其中最重要的方式就是使用索引。
3. 分表 当一个表的数据量很大的时候,查询就变的很慢,所以减少表里的记录的数量是优化的一种方式,这种方式就是将一张表的数据拆分成多张表,这样每张表的数量就减少了,这样查询速度就相对来说就快了一些。 增加缓存层 减少数据库连接也是一种优化手段,有些查询可以不用访问数据库,可以通过使用缓存服务器如redis、memcache、elasticsearch等增加缓存,减少数据库的连接
Spring的Bean。
什么是Bean? Spring Bean是被实例的,组装的及被Spring 容器管理的Java对象。 Spring 容器会自动完成@bean对象的实例化。 创建应用对象之间的协作关系的行为称为:装配(wiring),这就是依赖注入的本质。 Spring 三种配置方案 1.在XML中进行显示配置 2.使用Java代码进行显示配置 3.隐式的bean发现机制和自动装配 一、自动化装配bean 1.组件扫描(component scanning):Spring 会自动发现应用上下文中所创建的bean。 2.自动装配(autowiring):Spring自动满足bean之间的依赖。 通过为bean添加注解实现自动装配 如果所有的对象都是独立的,彼此之间没有任何依赖,那么使用组件扫描就能自动化装配bean。 但是实际工作中,很多对象会依赖其他对象完成任务。这时候就需要能够将组件扫描得到的bean和他们依赖装配在一起。这就是自动装配(autowiring)
hashMap的扩容。
capacity 即容量,默认16。 loadFactor 加载因子,默认是0.75 threshold 阈值。阈值=容量*加载因子。默认12。当元素数量超过阈值时便会触发扩容。 每次扩容的容量都是之前容量的2倍。
serialVersionUID作用。
先序列化,产生文件存储,后续若需要进行反序列化的话,若serialVersionUID没有改变且对象的属性也没有增删的话,就不会产生任何异常。若serialVersionUID改变(且字段属性有增删)则直接抛出异常。若serialVersionUID不改变(且字段属性有增删),则不进行抛出异常,但是反序列化之后,会存在说缺少字段了 假设Person类序列化之后,从A端传输到B端,然后在B端进行反序列化。在序列化Person和反序列化Person的时候,A端和B端都需要存在一个相同的类。如果两处的serialVersionUID不一致,会产生什么错误呢? 【答案】 先执行测试类SerialTest,生成序列化文件,代表A端序列化后的文件,然后修改serialVersion值,再执行测试类DeserialTest,代表B端使用不同serialVersion的类去反序列化,结果报错: 假设两处serialVersionUID一致,如果A端增加一个字段,然后序列化,而B端不变,然后反序列化,会是什么情况呢? 【答案】 新增 public int age; 执行SerialTest,生成序列化文件,代表A端。删除 public int age,反序列化,代表B端,最后的结果为:执行序列化,反序列化正常,但是A端增加的字段丢失(被B端忽略)。 假设两处serialVersionUID一致,如果B端减少一个字段,A端不变,会是什么情况呢? 【答案】 序列化,反序列化正常,B端字段少于A端,A端多的字段值丢失(被B端忽略)。 假设两处serialVersionUID一致,如果B端增加一个字段,A端不变,会是什么情况呢? 【答案】 说明序列化,反序列化正常,B端新增加的int字段被赋予了默认值0。
前后端跨域的解决。
- 跨域问题的产生
前端向后台请求,但是后台与前台不是同一个域中(域名,端口,协议任一不同就不是同一个域),那么就会产生跨域问题。
2.跨域问题解决 2.1 传统的项目那么可以直接在Filter过滤器中设置响应的头部信息。
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
HttpServletResponse response = (HttpServletResponse) res;
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
response.setHeader("Access-Control-Max-Age", "1000");
response.addHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
chain.doFilter(req, res);
}
2.2 分布式微服务系统可以在网关中解决跨域问题
@Configuration
public class CorsConfig {
@Bean
public CorsFilter corsFilter() {
final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
final CorsConfiguration config = new CorsConfiguration();
config.setAllowCredentials(true);
config.addAllowedOrigin("*");
config.addAllowedHeader("*");
config.setMaxAge(18000L);
config.addAllowedMethod("OPTIONS");
config.addAllowedMethod("HEAD");
config.addAllowedMethod("GET");
config.addAllowedMethod("PUT");
config.addAllowedMethod("POST");
config.addAllowedMethod("DELETE");
config.addAllowedMethod("PATCH");
source.registerCorsConfiguration("/**", config);
return new CorsFilter(source);
}
}
Java多线程-----互斥与同步
synchronized实现同步 synchronized可用于修饰方法、静态方法和代码块 ReentrantLock实现同步
IO
public static void main(String[] args) {
Persion p = new Persion(1L, "陈俊生");
System.out.println("person Seria:" + p);
try {
FileOutputStream fos = new FileOutputStream("Persion.txt");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(p);
oos.flush();
oos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
Persion p;
try {
FileInputStream fis = new FileInputStream("Persion.txt");
ObjectInputStream ois = new ObjectInputStream(fis);
p = (Persion) ois.readObject();
ois.close();
System.out.println(p.toString());
System.out.println(p.userName);
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
SpringBoot的pom.xml之starter
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.3</version>
</dependency>
springBoot注解大全
@SpringBootApplication:包含了@ComponentScan、@Configuration和@EnableAutoConfiguration注解。其中@ComponentScan让spring Boot扫描到Configuration类并把它加入到程序上下文。
@Configuration 等同于spring的XML配置文件;使用Java代码可以检查类型安全。
@EnableAutoConfiguration 自动配置。
@ComponentScan 组件扫描,可自动发现和装配一些Bean。
@Component可配合CommandLineRunner使用,在程序启动后执行一些基础任务。
@RestController注解是@Controller和@ResponseBody的合集,表示这是个控制器bean,并且是将函数的返回值直 接填入HTTP响应体中,是REST风格的控制器。
@Autowired自动导入。
@PathVariable获取参数。
@JsonBackReference解决嵌套外链问题。
@RepositoryRestResourcepublic配合spring-boot-starter-data-rest使用。
JDK1.8的新特性
索引创建规则
- 频繁修改字段不建议建立索引。
- 类似重复值太多的不建议建立索引,若性别。
- 数据量太小不建立建立索引,会影响性能。
- 最左前缀匹配原则,组合索引非常重要的原则,mysql会一直向右匹配直到遇到范围查询(>、<、between、like)就停止匹配,比如a= 1 and b = 2 and c > 3 and d = 4 如果建立(a,b,c,d)顺序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引则都可以用到,a,b,d的顺序可以任意调整。
- 对于定义为text、image和bit的数据类型的列不要建立索引。
- 较频繁作为查询条件的字段才去创建索引
创建索引的三种方式,删除索引
第一种方式:在执行CREATE TABLE时创建索引
CREATE TABLE user_index2 ( id INT auto_increment PRIMARY KEY, first_name VARCHAR (16), last_name VARCHAR (16), id_card VARCHAR (18), information text, KEY name (first_name, last_name), FULLTEXT KEY (information), UNIQUE KEY (id_card) );
第二种方式:使用ALTER TABLE命令去增加索引
ALTER TABLE table_name ADD INDEX index_name (column_list);
· 1
ALTER TABLE用来创建普通索引、UNIQUE索引或PRIMARY KEY索引。
其中table_name是要增加索引的表名,column_list指出对哪些列进行索引,多列时各列之间用逗号分隔。
索引名index_name可自己命名,缺省时,MySQL将根据第一个索引列赋一个名称。另外,ALTER TABLE允许在单个语句中更改多个表,因此可以在同时创建多个索引。
第三种方式:使用CREATE INDEX命令创建
CREATE INDEX index_name ON table_name (column_list);
CREATE INDEX可对表增加普通索引或UNIQUE索引。(但是,不能创建PRIMARY KEY索引)
删除索引
根据索引名删除普通索引、唯一索引、全文索引:alter table 表名 drop KEY 索引名
alter table user_index drop KEY name; alter table user_index drop KEY id_card; alter table user_index drop KEY information;
索引算法有哪些?
索引算法有 BTree算法和Hash算法 BTree是最常用的mysql数据库索引算法,也是mysql默认的算法。 可以用于like操作符,只要它的查询条件是一个不以通配符开头的常量 Hash算法 Hash Hash索引只能用于对等比较,例如=,<=>(相当于=)操作符。由于是一次定位数据,不像BTree索引需要从根节点到枝节点,最后才能访问到页节点这样多次IO访问,所以检索效率远高于BTree索引。
索引有哪几种类型?
主键索引: 数据列不允许重复,不允许为NULL,一个表只能有一个主键。
唯一索引: 数据列不允许重复,允许为NULL值,一个表允许多个列创建唯一索引。 普通索引: 基本的索引类型,没有唯一性的限制,允许为NULL值。 可以通过ALTER TABLE table_name ADD INDEX index_name(column1, column2, column3);创建组合索引
索引使用场景
where,order by,join(对join语句匹配关系(on)涉及的字段建立索引能够提高效率) 不要想着为每个字段建立索引,因为优先使用索引的优势就在于其体积小。
索引查询失效
1、like 以%开头,索引无效;当like前缀没有%,后缀有%时,索引有效。 2、or语句前后没有同时使用索引。当or左右查询字段只有一个是索引,该索引失效,只有当or左右查询字段均为索引时,才会生效 3、or语句前后没有同时使用索引。当or左右查询字段只有一个是索引,该索引失效,只有当or左右查询字段均为索引时,才会生效 4、在索引字段上使用not,<>,!=。不等于操作符是永远不会用到索引的,因此对它的处理只会产生全表扫描。 优化方法: key<>0 改为 key>0 or key<0。 5、对索引字段进行计算操作、字段上使用函数。(索引为 emp(ename,empno,sal))
select * 比 select 字段慢为什么?
- 通配符,表示所有的 显然 MySQL 需要先查询表结构,组装好一个长长的字段名列表后,才能开始 SQL 指令的解释过程 由于你并不需要用到全部的内容,所以查询和传送所有字段的内容是一种浪费,内容越多,当然耗时也越多
|