- 博客(65)
- 收藏
- 关注
转载 springboot mybatis_plus 集成日志配置文件
笔者使用的mybatisplus的版本3.4.3.3,对应的mybatis的版本为3.5.7。在以前的项目中对于日志打印没发现对性能有多大影响,近期实现了一个大的数据量导出到Excel中(行数几十万,列数上百级别),发现每次打印出来的额sql语句返回的结果集太多了,几乎是刷屏状态,完全不能做分析使用。固对日志输出这块儿稍微看了一下,这里做下简单的分析:配置mybatisplus日志输出分为很多种:第一种,全量日志输出,包括查询语句、参数、返回结果集、总条数:#控制台打印sqlmybatis-p
2022-04-29 15:32:43
1651
原创 get和post 请求乱码问题
post: 在web.xml中加入:<filter> <filter-name>CharacterEncodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>enco...
2020-10-10 17:05:39
211
转载 六大Web负载均衡原理与实现
六大Web负载均衡原理与实现一、http重定向[协议层] http重定向协议实现负载均衡原理:根据用户的http请求计算出一个真实的web服务器地址,并将该web服务器地址写入http重定向响应中返回给浏览器,由浏览器重新进行访问。优点:比较简单缺点:(1) 浏览器需要每次请求服务器才能完成一次访问,性能较差。http重定向服务器自身的处理能力可能成为瓶颈。使用http302响应重定向,有可能使搜索引擎判断为SEO作弊,降低搜索排名。当http代理(比如浏览器)向we
2020-10-10 17:02:05
1099
原创 Session共享、SpringSession
通过LVS或者Nginx等进行负载均衡(一般使用Nginx+Tomcat实现负载均衡) 如果我们采用的spring集成shiro,其实可以将缓存管理器交由spring管理,相当于由spring统一管理缓存。shiro的session创建时机是在登录认证之前,而不是第一次调用getSession()时。Session会话共享方案● 第一种是使用容器扩展插件来实现,比如基于Tomcat的tomcat-redis-session-manager插件,基于Jetty的jetty-session-r
2020-09-30 16:59:44
392
原创 套接字
套接字的引入为了更方便地开发网络应用程序,美国住克利大学在UNIX上推出了一种应用程序访问通信协议的操作系统调用接字(Socket)。 Socket的出现,使得程序员可以很方便地访问 TCPIIP,从而开发各种网络应用程序。后来套接字被引进到 Windows等操作系统,成为开发网络应用程序的有效工具 [3] 。套接字存在于通信区域,通信区域也被称为地址族,主要用于将通过套接字通信的进程的公有特性综合在一起。套接字通常只与同一区域的套接字交换数据。Windows Socket只支持一个通信区域——AF
2020-09-29 18:53:09
205
原创 跨域问题
同源策略很多人对跨域有一种误解,以为这是前端的事,和后端没关系,其实不是这样的,说到跨域,就不得不说说浏览器的同源策略。同源策略是由Netscape提出的一个著名的安全策略,它是浏览器最核心也最基本的安全功能,现在所有支持JavaScript的浏览器都会使用这个策略。所谓同源是指协议、域名以及端口要相同。同源策略是基于安全方面的考虑提出来的,这个策略本身没问题,但是我们在实际开发中,由于各种原因又经常有跨域的需求,传统的跨域方案是JSONP,JSONP虽然能解决跨域但是有一个很大的局限性,那就是只支
2020-09-29 18:41:06
357
原创 SQL 优化的一般步骤
SQL 优化的一般步骤是什么,怎么看执行计划,如何理解其中各个字段的含义。 查看慢日志(show [session|gobal] status ),定位慢查询,查看慢查询执行计划 根据执行计划确认优化方案 Explain sql select_type:表示select类型。常见的取值有SIMPLE(简单表,即不使用连接或者子查询)、PRIMARY(主查询,即外层的查询)、UNION(union中的第二个或者后面的查询语句)、SUBQUERY(子查询中的第一个SELECT)等。talbe:输出结果集的表
2020-09-28 17:40:17
556
原创 表字段为什么建议不存null值?
null值会占用更多的字节,且会在程序中造成很多与预期不符的情况。在 where 子句中对字段进行 null 值判断,将导致引擎放弃使用索引而进行全表扫描
2020-09-28 17:17:36
268
原创 基于MySql的InnoDB引擎,可以使用以下方法来实现加锁
基于MySql的InnoDB引擎,可以使用以下方法来实现加锁操作:表结构:CREATE TABLE `methodLock` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键', `method_name` varchar(64) NOT NULL DEFAULT '' COMMENT '锁定的方法名', `desc` varchar(1024) NOT NULL DEFAULT '备注信息', `update_time` tim
2020-09-28 17:06:17
180
原创 视图
为什么要使用视图?什么是视图?为了提高复杂SQL语句的复用性和表操作的安全性,MySQL数据库管理系统提供了视图特性。所谓视图,本质上是一种虚拟表,在物理上是不存在的,其内容与真实的表相似,包含一系列带有名称的列和行数据。但是,视图并不在数据库中以储存的数据值形式存在。行和列数据来自定义视图的查询所引用基本表,并且在具体引用视图时动态生成。视图使开发者只关心感兴趣的某些特定数据和所负责的特定任务,只能看到视图中所定义的数据,而不是视图所引用表中的数据,从而提高了数据库中数据的安全性。视图的特点如
2020-09-28 17:01:36
150
原创 事务
在数据库操作中,一项事务(Transaction)是由一条或多条操作数据库的 SQL 语句组成的一个不可分割的工作单元,这些操作要么都完成,要么都取消。接下来将围绕事务的特性、并发问题以及隔离级别进行讲解。事务的特性事务的定义很严格,它必须同时满足四个特性,即原子性、一致性、隔离性和持久性,也就是人们俗称的 ACID 特性,具体如下。1)原子性(Atomic)表示将事务中所进行的操作捆绑成一个不可分割的单元,即对事务所进行的数据修改等操作,要么全部执行,要么全都不执行。2)一致性(Con
2020-09-27 19:12:29
297
原创 三大范式
一、第一范式1NF是对属性的原子性,要求属性具有原子性,不可再分解;二、第二范式2NF是对记录的惟一性,要求记录有惟一标识,即实体的惟一性,即不存在部分依赖;三、第三范式3NF是对字段的冗余性,要求任何字段不能由其他字段派生出来,它要求字段没有冗余,即不存在传递依赖;第一范式是最基本的范式。如果数据库表中的所有字段值都是不可分解的原子值,就说明该数据库表满足了第一范式。数据库表的每一列都是不可分割的原子数据项,而不能是集合,数组,记录等非原子数据项。简而言之,第一范式就是无重复的域。
2020-09-27 19:03:00
277
原创 prepareStatement语句
JDBC中的——PreparedStatement 预编译原理prepareStatement语句有三大好处:Statement.executeUpdate("INSERT INTO tb1_students (name,age,sex,address) VALUES('"+var1+"','"+var2+"',"+var3+",'"+var4+"')"); prepareStatement= connection.prepareStatement("INSERT INTO tb1_stud
2020-09-27 17:37:57
361
原创 MySQL 索引、存储引擎、锁
存储引擎存储引擎Storage engine:MySQL中的数据、索引以及其他对象是如何存储的,是一套文件系统的实现。MySQL中的数据用各种不同的技术存储在文件(或者内存)中。这些技术中的每一种技术都使用不同的存储机制、索引技巧、锁定水平并且最终提供广泛的不同的功能和能力。通过选择不同的技术,你能够获得额外的速度或者功能,从而改善你的应用的整体功能。这些不同的技术以及配套的相关功能在MySQL中被称作存储引擎(也称作表类型)。MySQL默认配置了许多不同的存储引擎,可以预先设置或者在MySQL
2020-09-27 17:29:53
365
原创 mysql in和exists差别
mysql中的in语句是把外表和内表作hash 连接,而exists语句是对外表作loop循环,每次loop循环再对内表进行查询。一直大家都认为exists比in语句的效率要高,这种说法其实是不准确的。这个是要区分环境的。 如果查询的两个表大小相当,那么用in和exists差别不大。 如果两个表中一个较小,一个是大表,则子查询表大的用exists,子查询表小的用in: not in 和not exists如果查询语句使用了not ...
2020-09-23 19:08:49
142
原创 DBLink构建
DBLink构建database link是建立一个数据库到另一个数据库的路径的对象,通过database link可以允许查询远程表,我理解可以算作一种分布式数据库的用法。database link是单向连接,既然它是一种对象,那自然可以在xxx_objects表中查询到相关的信息。建立database link前需要明确几个事情:1、确认从建立方的server可以访问远程数据库。 2、需要在建立方的tnsnames中配置远程数据库连接串。 3、只有在服务端配置的连接才能在dblink中.
2020-09-23 19:07:28
243
原创 命令模式
命令模式(Command Pattern)是一种数据驱动的设计模式,它属于行为型模式。请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。前面把 Tomcat 中两个核心组件 Connector 和 Container,比作一对夫妻。男的将接受过来的请求以命令的方式交给女主人。对应到 Connector 和 Container,Connector 也是通过命令模式调用 Container 的。命令模式的原理命令模式主要作
2020-09-22 19:07:55
117
原创 观察者模式
当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知它的依赖对象。观察者模式属于行为型模式。观察者模式:定义对象键一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知被制动更新,如Spring中listener的实现--ApplicationListener。观察者模式的原理观察者模式原理也很简单,就是你在做事的时候旁边总有一个人在盯着你,当你做的事情是它感兴趣的时候,它就会跟着做另外一些事情。但是盯着
2020-09-22 16:21:11
131
原创 工厂模式
工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。Spring中的BeanFactory就是简单工厂模式的体现,用来创建对象的实例...
2020-09-22 16:02:43
83
原创 迭代器模式
迭代器模式(Iterator Pattern)是 Java 和 .Net 编程环境中非常常用的设计模式。这种模式用于顺序访问集合对象的元素,不需要知道集合对象的底层表示。迭代器模式属于行为型模式。
2020-09-22 16:01:12
119
原创 单例模式
单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。注意: 1、单例类只能有一个实例。 2、单例类必须自己创建自己的唯一实例。 3、单例类必须给所有其他对象提供这一实例。 ...
2020-09-22 15:49:19
228
原创 代理模式
在代理模式(Proxy Pattern)中,一个类代表另一个类的功能。这种类型的设计模式属于结构型模式。在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口。Spring的AOP功能用到了JDK的动态代理和CGLIB字节码生成技术;...
2020-09-22 15:44:57
57
原创 策略模式
策略模式在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法。策略模式实际就是一堆算法族的封装Spring中策略模式的应用当bean需要访问资源配置文件时,Spring有两种方式 代码中获取Rescource实例 依赖注入 第一种方式需要获取rescource资源
2020-09-22 15:42:55
84
原创 MVC 模式
MVC 模式MVC 模式代表 Model-View-Controller(模型-视图-控制器) 模式。这种模式用于应用程序的分层开发。 Model(模型) - 模型代表一个存取数据的对象或 JAVA POJO。它也可以带有逻辑,在数据变化时更新控制器。 View(视图) - 视图代表模型包含的数据的可视化。 Controller(控制器) - 控制器作用于模型和视图上。它控制数据流向模型对象,并在数据变化时更新视图。它使视图与模型分离开。 ...
2020-09-22 15:37:18
235
原创 Tomcat体系架构
Tomcat体系架构 Server: A Server element represents the entire Catalina servlet container. (Singleton),一个Server包括多个Service。 server组件是管理tomcat实例的组件,可以监听一个端口,从此端口上可以远程向该实例发送shutdown关闭命令。 Service: 它由一个或者多个Connector组成,以及一个Engine,负责处理所有Connector所获得的客户请
2020-09-22 15:16:35
303
原创 Tomcat类加载、组件生命周期
Tomcat基本遵守了JVM的委派模型,但也在自定义的类加载器中做了细微的调整,以适应Tomcat自身的要求。下面是Tomcat类加载器WebappClassLoader的核心方法loadClass()的源码。它覆盖了父类URLClassLoader中的方法,改变了默认的类加载顺序。Tomcat6的加载顺序所以在Tomcat 6中默认情况下,不是完全按照先Tomcat的lib再Web应用的lib这种顺序去加载类。 Jar包的加载顺序是: 1)JRE中的Java基础包 2)Web应用WEB-INF\l
2020-09-22 10:00:28
161
原创 Ehcache
EhCache 是一个纯Java的进程内缓存框架,具有快速、精干等特点,是Hibernate中默认CacheProvider。Ehcache是一种广泛使用的开源Java分布式缓存。缓存数据有两级:内存和磁盘,因此无需担心容量问题,缓存数据会在虚拟机重启的过程中写入磁盘。可以单独使用,一般在第三方库中被用到的比较多(如mybatis、shiro等)ehcache 对分布式支持不够好,多个节点不能同步,通常和redis一块使用。Ehcache的类层次模型主要为三层,最上层的是CacheManager,他
2020-09-21 19:04:10
137
原创 Redis
RedisRedis采用的是基于内存的采用的是单进程单线程模型的KV数据库Key-value进行存储Value类型较多:String、list、set、zset(有序列表)、HASH(可以理解为Map,PS:HASH类型定义:1、由field和关联的value组成的键值对; 2、field和value是字符串类型; 3、一个hash中最多包含2^32-1个键值对)redis相对关系型数据库支持存过期redis持久化 RDB持久化 和 AOF持久化 RDB持久化:将redis服务的键值对保
2020-09-21 18:51:00
125
原创 Shiro
跟着大宇学Shiro--------目录帖三个核心组件:Subject, SecurityManager 和 Realms. Subject:即“当前操作用户”。但是,在Shiro中,Subject这一概念并不仅仅指人,也可以是第三方进程、后台帐户(Daemon Account)或其他类似事物。它仅仅意味着“当前跟软件交互的东西”。 Subject代表了当前用户的安全操作,SecurityManager则管理所有用户的安全操作。 SecurityManager:它是Shiro框架的核心,典型的F
2020-09-21 16:05:20
96
原创 框架与设计模式
框架、设计模式这两个概念总容易被混淆,其实它们之间还是有区别的。框架通常是代码重用,而设计模式是设计重用,架构则介于两者之间,部分代码重用,部分设计重用,有时分析也可重用。在软件生产中有三种级别的重用:内部重用,即在同一应用中能公共使用的抽象块;代码重用,即将通用模块组合成库或工具集,以便在多个应用和领域都能使用;应用框架的重用,即为专用领域提供通用的或现成的基础结构,以获得最高级别的重用性。框架与设计模式虽然相似,但却有着根本的不同。设计模式是对在某种环境中反复出现的问题以及解决该问题的方案的描述,它
2020-09-21 11:25:53
255
原创 MVC概念
MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范。MVC 是一种使用 MVC(Model View Controller 模型-视图-控制器)设计创建 Web 应用程序的模式: [1] • Model(模型)表示应用程序核心(比如数据库记录列表)。 • View(视图)显示数据(数据库记录)。 • Controller(控制器)处理输入(写入数据库记录)。 MVC 模式同时提供了对 HTML、CSS 和
2020-09-21 11:13:18
271
原创 Filter
FilterFilter是拦截Request请求的对象,在用户的请求访问的资源前处理ServletRequest以及ServletResponse。可通过xml和注解进行配置,当某个资源被多个Filter所使用到,只能通过xml来配置,触发顺序。当Servlet容器每次处理Filter相关的资源时,都会调用该Filter实例的doFilter方法:Void doFilter(ServletRequest request, ServletResponse response, FilterChai
2020-09-21 11:01:37
79
原创 spring项目中的classpath
classpath首先一个项目要编译好之后才能部署到Tomcat中运行。 Tomcat运行时如何找编译好的.class文件呢,其实Tomcat下的web项目有两个预置的classpath(就是能找到.class文件的入口), 这两个预置的classpath是WEB-INF/classes与WEF-INF/lib, 其中我们src下的源文件经过了编译之后放在WEB-INF/classes目录下,1、src不是classpath, WEB-INF/classes和lib才是classpath,WEB-I
2020-09-21 10:49:31
623
原创 springMVC中的Controller
Controller在SpringMVC 中,控制器Controller 负责处理由DispatcherServlet 分发的请求,它把用户请求的数据经过业务处理层处理之后封装成一个Model ,然后再把该Model 返回给对应的View 进行展示。在SpringMVC 中提供了一个非常简便的定义Controller 的方法,你无需继承特定的类或实现特定的接口,只需使用@Controller 标记一个类是Controller ,然后使用@RequestMapping 和@RequestParam 等一些
2020-09-16 11:22:21
295
原创 SpringMVC 中的Interceptor 拦截器
SpringMVC 中的Interceptor 拦截器SpringMVC 中的Interceptor 拦截器也是相当重要和相当有用的,它的主要作用是拦截用户的请求并进行相应的处理。比如通过它来进行权限验证,或者是来判断用户是否登陆,或者是像12306 那样子判断当前时间是否是购票时间。实现方法实现HandlerInterceptor 接口SpringMVC 中的Interceptor 拦截请求是通过HandlerInterceptor 来实现的。在SpringMVC 中定义一个Interce
2020-09-16 11:08:27
131
原创 构造方法注入和setter注入之间的区别吗?
构造方法注入和setter注入之间的区别吗?有以下几点明显的差异: 在Setter注入,可以将依赖项部分注入,构造方法注入不能部分注入,因为调用构造方法如果传入所有的参数就会报错。 如果我们为同一属性提供Setter和构造方法注入,Setter注入将覆盖构造方法注入。但是构造方法注入不能覆盖setter注入值。显然,构造方法注入被称为创建实例的第一选项。 使用setter注入你不能保证所有的依赖都被注入,这意味着你可以有一个对象依赖没有被注入。在另一方面构造方法注入直到你所有的
2020-09-16 10:44:52
7062
原创 浅谈sleep、wait、yield、join区别
sleep sleep 方法是属于 Thread 类中的,sleep 过程中线程不会释放锁,只会阻塞线程,让出cpu给其他线程,但是他的监控状态依然保持着,当指定的时间到了又会自动恢复运行状态,可中断,sleep 给其他线程运行机会时不考虑线程的优先级,因此会给低优先级的线程以运行的机会wait wait 方法是属于 Object 类中的,wait 过程中线程会释放对象锁,只有当其他线程调用 notify 才能唤醒此线程。wait 使用时必须先获取对象锁,即必须在 synchronized 修饰的代码块
2020-09-14 18:47:40
208
原创 ThreadLocal
并发容器之ThreadLocal详解 ThreadLocal 是什么?有哪些使用场景? ThreadLocal 是一个本地线程副本变量工具类,在每个线程中都创建了一个 ThreadLocalMap 对象,简单说 ThreadLocal 就是一种以空间换时间的做法,每个线程可以访问自己内部 ThreadLocalMap 对象内的 value。通过这种方式,避免资源在多线程间共享。原理:线程局部变量是局限于线程内部的变量,属于线程自身所有,不在多个线程间共享。Java提供ThreadLocal类来支持线程局
2020-09-14 18:44:56
87
原创 Java8新特性
Java8新特性https://www.jianshu.com/p/0bf8fe0f153b 函数式接口 : 有且仅有一个抽象方法,但是可以有多个非抽象方法(静态方法、default方法)的接口,函数式接口可以被隐式转换为lambda表达式。 可以通过在接口上加上@FunctionalInterface 来显示声明这是个函数式接口,这样你多写一个抽象方法的时候,会在编写的时候就开始报错 而当接口中重写了object中的方法,但没有写实现,这个抽象方法不算入有且仅有一个抽象方法里面,比如: @F
2020-09-14 18:37:29
70
原创 CopyOnWriteArrayList
并发容器之CopyOnWriteArrayList详解 CopyOnWriteArrayList 是什么,可以用于什么应用场景?有哪些优缺点? CopyOnWriteArrayList 是一个并发容器。有很多人称它是线程安全的,我认为这句话不严谨,缺少一个前提条件,那就是非复合场景下操作它是线程安全的。CopyOnWriteArrayList(免锁容器)的好处之一是当多个迭代器同时遍历和修改这个列表时,不会抛出 ConcurrentModificationException。在CopyOnWriteAr
2020-09-14 18:23:20
202
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人