1.减少数据访问: 设置合理的字段类型,启用压缩,通过索引访问等减少磁盘IO
2.返回更少的数据: 只返回需要的字段和数据分页处理 减少磁盘io及网络io
3.减少交互次数: 批量DML操作,函数存储等减少数据连接次数
4.减少服务器CPU开销: 尽量减少数据库排序操作以及全表查询,减少cpu 内存占用
5.利用更多资源: 使用表分区,可以增加并行操作,更大限度利用cpu资源
答:
如过时yml配置中的属性,@ConfigurationProperties注解设置与yml配置文件中对应的属性名,吧文件中的值通过自动注入,获取值。
配置类:我们需要进行手动创建一个类,然后在这个类中使用@Configuration注解:指定当前的类是配置类,配置类就相当于配置文件。
@Bean注解将一些类或对象交由Spring容器管理
@Value注入配置文件的属性值
答:
看过Spring自动配置的相关源码,
1.在spring-boot-autoconfigure包下保存大量的自动配置类。
2.类名都保存 META-INFO/spring.factotiries文件下
3.自动配置类生效需要一定条件,如@ConditionalOnClass,引入某些类时(导入了对应的框架依赖)
Spring Boot应用的启动入口是@SpringBootApplication注解标注类中的main()方法,在@SpringBootApplication 中有三个重要的注解.
@SpringBootConfiguration表明该类为配置类。
@EnableAutoConfiguration表示自动配置功能。
@ComponentScan 包的扫描
@EnableAutoConfiguration --> AutoConfigurationImportSelector --> loadFactoryNames —> classLoader.getResources(“META-INF/spring.factories”)
其中classLoader.getResources通过反射的机制可以帮我们找到相关的配置类。
答:
我做过一个泡泡在线教育系统,,该项目是一个基于Springcloud-Alibaba的分布式体系的。用户可以根据自己的需要在网站上搜索自己想要学习的课程,其中部分课程是收费课程,用户需要通过vx支付后才可以观看课程视频。
其中我负责的模块是一个用户的多条件搜索模块和一个单点登录的模块。
在多条件搜索服务中我选择使用Elasticsearch来实现搜索功能。因为商品数量庞大,并且搜索条件十分的灵活多变,因此传统的数据库搜索的方式会显得不太合适,并且es是基于倒排索引的方式来搜索数据,就是在查询数据的时候,通过分词器将查询的数据分词处理,然后通过分词来查找索引的value,然后通过value找到key。这样搜索数据更快,不需要对整个数据库进行全文搜索。
在单点登录模块中,我选择的是使用JWT来对我们用户的登录信息进行加密生成token,其中我们还使用了RSA的非对称加密算法来作为JWT的密钥。其中我们使用公钥对登录信息进行加密,使用私钥对登录信息进行解密。其中登录我们使用的是SpringSecurity,当我们的用户登录成功后,会跳转到我们登录成功的逻辑中,我们会接受到用户的登录信息然后将用户信息进行jwt加密,封装到一个对象中。返回前台。然后前台将此对象添加到请求头中。每次进行数据访问的时候,都将携带请求头,我们在网关中会实现一个全局的过滤器对用户的请求进行鉴权处理,获取每次请求的请求头,然后解析出请求头中的加密信息,如果解析成功则放行,如果解析失败则进行拦截。
redis是一个高性能的内存数据库,以key-value方式存储数据,可以作为缓存使用。它性能高,支持多种存储类型,支持持久化,单线程。
其中数据类型有:
字符串:简单的key-value数据,适合保存单个数据,如:用户数量、库存数、商品数
hash 哈希(适合保存复杂类型数据,如:用户对象)
list 列表(链表结构,适合保存有序的、可重复的数据,如:商品列表、评论列表)
set 无序集合(适合保存无序的,不可重复的数据)
zset 有序集合(适合保存有序的,不可重复的数据)
在项目中我们的广告模块使用了redis,因为用户每次进入页面都会请求广告的模块数据,因此我们将广告模块的数据存入redis缓存中,每次用户进入页面的时候都请求我们redis缓存的数据,来减轻Mysql的压力。
想了解一下贵公司的最近的项目是什么,运用的什么技术栈。
INT(M),M默认为11;M表示最大显示宽度, 建表若设置了zerofill(0填充), 会在数字前面补充0.int(1)和int(2)从本身长度还是存储方式上都是一样的。mysql里,int(1)和int(2)的区别就是显示的长度,但是要设置一个参数:如果列制定了zerofill 就会用0填充显示,如2 int(3)指定后就会显示为002
在Mybatis中#是以占位符的形式拼接sql中的参数,$是以字符串拼接的方式拼接sql中的参数,可能产生sql注入问题。
1) 用户发送请求
2)前端控制器获得用户请求的URL,发送URL给处理器映射
3)处理器映射将Handler(包装方法信息)返回给前端控制器
4)前端控制器发送Handler给处理器适配器,适配器执行Handler方法
5)执行Handler方法后,返回ModelAndView(逻辑视图)给前端控制器
6)前端控制器将ModelAndView发送给视图解析器,解析出物理视图返回给前端控制器
7)前端控制器渲染视图,发送视图给用户
ioc是spring的一个重要组件,名为控制反转。它是一种程序的设计思想。控制是控制javaBean对象的创建和管理。反转是一般情况下对象的创建和管理由开发者控制,反转是把对象的创建和管理交给容器完成,然后再交给开发者。 ioc的主要作用是解耦,解耦,是降低程序耦合度,也就是减少程序代码之间的依赖性,如果代码之间的依赖性很高,修改一处代码会影响很多其他的代码,这就给项目的稳定性带来的问题,不利于代码的扩展和维护。没有IOC的程序中,我们使用new来完成对象的创建,如果需要的对象的类型发生改变,就需要手动修改代码。有了IOC后,对象的创建由第三方(Spring容器)完成,由Spring来管理应用中所有对象的生命周期,开发者只需要关注自己的业务逻辑,代码更利于扩展和维护。ioc是通过反射机制+工厂模式实现。
类.class
对象.getClass()
Class.forName(“类的全路径名”)
ArrayList的结构是动态数组,Linklist的结构是链表。ArrayList查询快,因为可以通过下标索引查询。Linklist增删快,因为是链表结构所以增删不需要移动数据。
Arraylist一次扩容1.5倍,默认初始大小为10。ArrayList 的内部实现,其实是用一个对象数组进行存放具体的值,然后用一种扩容的机制,进行数组的动态增长。其扩容机制可以理解为,如果元素的个数,大于其容量,则把其容量扩展为原来容量的1.5倍。
加上了synchronized关键字修饰(this对象锁,锁住整个容器对象)。
1.在执行速度方面的比较:StringBuilder > StringBuffer
2.StringBuffer与StringBuilder,他们是字符串变量,是可改变的对象,每当我们用它们对字符串做操作时,实际上是在一个对象上操作的,不像String一样创建一些对象进行操作,所以速度就快了。
3.StringBuilder:线程非安全的
StringBuffer:线程安全的
当我们在字符串缓冲去被多个线程使用是,JVM不能保证StringBuilder的操作是安全的,虽然他的速度最快,但是可以保证StringBuffer是可以正确操作的。当然大多数情况下就是我们是在单线程下进行的操作,所以大多数情况下是建议用StringBuilder而不用StringBuffer的,就是速度的原因。
对于三者使用的总结:
1.如果要操作少量的数据用 String
2.单线程操作字符串缓冲区 下操作大量数据 StringBuilder
3.多线程操作字符串缓冲区 下操作大量数据 StringBuffer
1.Hashtable的方法是同步的,HashMap未经同步,所以在多线程场合要手动同步HashMap这个区别就像Vector和ArrayList一样。
查看Hashtable的源代码就可以发现,除构造函数外,Hashtable的所有 public 方法声明中都有 synchronized 关键字,而HashMap的源代码中则连 synchronized 的影子都没有,当然,注释除外。
2.Hashtable不允许 null 值(key 和 value 都不可以),HashMap允许 null 值(key和value都可以)。
答:就是在项目中的搜索模块要使用到的一个搜索引擎,它可以帮助我们
更加快速查找到有效信息,因为商品数量庞大,并且搜索条件十分的灵活多变,因此传统的数据库搜索的方式会显得不太合适,并且es是基于倒排索引的方式来搜索数据,就是在查询数据的时候,通过分词器将查询的数据分词处理,然后通过分词来查找索引的value,然后通过value找到key。这样搜索数据更快,不需要对整个数据库进行全文搜索。
常见问题:
1)缓存击穿
高并发的情况下,短时间内缓存会被穿过,请求直接打到数据库上,可能导致数据库压力过大。
解决方案:对代码上锁(双重检查锁)
2)缓存穿透
高并发的情况下,如果查询不存在的数据,因为缓存和数据库都不存在,请求都会打到数据库上,可能导致系统崩溃。
解决方案:
1) 保存不存在的数据到缓存中,设置一定过期时间
2) 布隆过滤器(直接过滤掉不存在数据的请求) 不能准确判断是否存在数据,能准确判断数据不存在
3)缓存雪崩
高并发的情况下,缓存服务器重启或热点数据同时过期,全部访问数据库,导致数据库宕机
解决方案:
1)配置缓存集群
2)尽量给热点数据设置不一样的过期时间,相对均匀
2.1 单例模式
定义
一个类只有一个实例,该类能自行创建,且能对外提供一个访问单例的全局访问点的一种模式。
优点
可以保证内存中只有一个实例,减少了内存开销。
可以避免对资源的多重占用。
设置全局访问点,可以优化和共享资源的访问。
缺点
单例模式一般没有接口,扩展困难。如果要修改就要修改原来的代码,违背了了开闭原则。
在并发测试中不利于代码调试。测试中如果单例中的代码没有执行完,不能模拟生成一个新的对象。
单例模式的功能和代码通常在一个类中,如果设计不合理,则很容易违背开闭原则。
应用场景
需要频繁创建的类。使用单例可减少内存压力。
需要只生成一个对象的时候。如军团最高长官,校长等。
创建实例时占用资源较多,或者实例化耗时比较常。如在堆上实例化本地数据库对象。
需要频繁实例化,且创建的对象又频繁被销毁。如多线程的线程池、网络连接池。
对于一些控制硬件级别的操作,或单一控制逻辑的操作,多个实例对象会引起混乱。
对象需要被共享的场合,如 WEB 中的配置对象、数据库的连接池。
两种实现方式
懒汉模式
特点是在类加载时没有创建单例,只有当第一次调用实例化的方法时才创建这个单例,因此第一次调用时要进行一系列的初始化工作因此会有一定的延时,初始化完成之后就和饿汉模式用起来一样了。
懒汉模式在多线程下是不安全的,不同的线程可能会创建创建不同的单例对象,需要通过加锁避免这种情况。
饿汉模式
特点是类一旦加载就创建一个单例,保证在调用实例化方法之前就已经存在了。
饿汉模式在多线程下是安全的。
Spring是一个生态体系(也可以说是技术体系),是集大成者,它包含了Spring Framework、Spring Boot、Spring Cloud等(还包括Spring Cloud data flow、spring data、spring integration、spring batch、spring security、spring hateoas)
Spring Cloud事实上是一整套基于Spring Boot的微服务解决方案。它为开发者提供了很多工具,用于快速构建分布式系统的一些通用模式,例如:配置管理、注册中心、服务发现、限流、网关、链路追踪等。
Vue 实例从创建到销毁的过程,就是生命周期。从开始创建、初始化数据、编译模板、挂载Dom→渲染、更新→渲染、销毁等一系列过程,称之为 Vue 的生命周期。
1.List中的元素实现IEquatabe接口,并提供Equals方法和GetHashCode方法。
2.使用表达式
3.使用循环,判断每个元素是否重复
random();//返回一个随机数。
isLetter();//是否是一个字母
rint(); //返回与参数最接近的整数
abs();//绝对值
jQuery 属性选择器
jQuery 使用 XPath 表达式来选择带有给定属性的元素。
$("[href]") 选取所有带有 href 属性的元素。
$("[href=’#’]") 选取所有带有 href 值等于 “#” 的元素。
$("[href!=’#’]") 选取所有带有 href 值不等于 “#” 的元素。
( " [ h r e f ("[href ("[href=’.jpg’]") 选取所有 href 值以 “.jpg” 结尾的元素。
34.spring事务配置的具体流程
第一步:配置事务管理器
第二步:配置通知–》传播行为
第三步:配置切入点–》切面 AOP
1.单一原则。一个类应该有且只有一个变化的原因。单一职责原则将不同的职责分离到单独的类,每一个职责都是一个变化的中心。需求变化时,将通过更改职责相关的类来体现。如果一个类拥有多于一个的职责,则多个职责耦合在一起,会有多于一个原因来导致这个类发生变化。一个职责的变化可能会影响到其他的职责,另外,把多个职责耦合在一起,影响复用性。
2.里氏替换原则,就是要求继承是严格的is-a关系。所有引用基类的地方必须能透明地使用其子类的对象。在软件中将一个基类对象替换成它的子类对象,程序将不会产生任何错误和异常,反过来则不成立,如果一个软件实体使用的是一个子类对象的话,那么它不一定能够使用基类对象。例如:我喜欢动物,那我一定喜欢狗,因为狗是动物的子类;但是我喜欢狗,不能据此断定我喜欢动物,因为我并不喜欢老鼠,虽然它也是动物。
3.依赖倒置原则。依赖倒置原则的核心就是要我们面向接口编程,理解了面向接口编程,也就理解了依赖倒置。低层模块尽量都要有抽象类或接口,或者两者都有。变量的声明类型尽量是抽象类或接口。
4.接口分离原则。一个类对另一个类的依赖应该建立在最小的接口上,通俗的讲就是需要什么就提供什么,不需要的就不要提供。接口中的方法应该尽量少,不要使接口过于臃肿,不要有很多不相关的逻辑方法。
5.多用组合(has-a),少用继承(is-a)。如果新对象的某些功能在别的已经创建好的对象里面已经实现,那么应当尽量使用别的对象提供的功能,使之成为新对象的一部分,而不要再重新创建。可以降低类与类之间的耦合程度。
6.开闭原则。对修改关闭,对扩展开放。在软件的生命周期内,因为变化,升级和维护等原因需要对软件原有代码进行修改,可能会给旧代码引入错误,也有可能会使我们不得不对整个功能进行重构,并且需要原有代码经过重新测试。解决方案:当软件需要变化时,尽量通过扩展软件实体的行为来实现变化,而不是通过修改已有的代码来实现。不过这要求,我们要对需求的变更有前瞻性和预见性。其实只要遵循前面5中设计模式,设计出来的软件就是符合开闭原则的。
1.解耦,系统A在代码中直接调用系统B和系统C的代码,如果将来D系统接入,系统A还需要修改代码,过于麻烦!
2.异步,将消息写入消息队列,非必要的业务逻辑以异步的方式运行,加快响应速度
3.削峰,并发量大的时候,所有的请求直接怼到数据库,造成数据库连接异常
一、继承Thread类创建线程类
二、通过Runnable接口创建线程类
三、通过Callable接口创建线程类
start方法: 让一个线程进入就绪状态
run方法:线程真正要执行的逻辑,让一个线程分配的cpu资源,开始启动就会调用run方法执行
sleep(n)方法:让线程休眠n毫秒,休眠时会让出cpu但不会释放锁。
join方法:当前线程等待目标线程运行结束,再开始运行。可以设置超时时间
interrupt()方法:打断线程,如果打断正在sleep,wait,join的方法会抛出InterruptedException异常,并清除打断标记。
如果打断正在执行的线程,会设置打断标记但不会真的打断它,如果打断正在park的线程会真的打断park状态,而且设置打断标记。
yield()方法:让当前线程从执行态变为就绪态。
setDaemon(true)方法:设置一个线程为守护线程。
setPriority(int)方法:修改线程的优先级。
list可以允许重复的对象。可以插入多个null元素。是一个有序容器,保持了每个元素的插入顺序,输出的顺序就是插入的顺序。
Set不允许重复对象,无序容器,你无法保证每个元素的存储顺序,TreeSet通过 Comparator 或者 Comparable 维护了一个排序顺序。只允许一个 null 元素。
Map不是collection的子接口或者实现类。Map是一个接口。Map 的 每个 Entry 都持有两个对象,也就是一个键一个值,Map 可能会持有相同的值对象但键对象必须是唯一的。
Lambda表达式 类似于ES6中的箭头函数
新的日期API Datetime
引入Optional 防止空指针异常
使用Base64
接口的默认方法和静态方法
新增方法引用格式
新增Stream类
注解相关的改变
支持并行(parallel)数组
对并发类(Concurrency)的扩展。
JavaFX
Vue 是一套用于构建用户界面的渐进式框架。
与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用。
Vue 的核心库只关注视图层,不仅易于上手,还便于与第三方库或既有项目整合。
另一方面,当与现代化的工具链以及各种支持类库结合使用时,Vue 也完全能够为复杂的单页应用提供驱动。
bool查询 模糊查询
1、@SpringBootApplication
2、@EnableAutoConfiguration
3、@ConfigurationProperties
一个是链表的长度达到8个,一个是数组的长度达到64个
面向对象是一种编程思想
封装性:封装是一种信息隐蔽技术,它体现于类的说明,是对象的重要特性。封装使数据和加工该数据的方法(函数)封装为一个整体,以实现独立性很强的模块,使得用户只能见到对象的外特性(对象能接受哪些消息,具有那些处理能力),而对象的内特性(保存内部状态的私有数据和实现加工能力的算法)对用户是隐蔽的。封装的目的在于把对象的设计者和对象者的使用分开,使用者不必知晓行为实现的细节,只须用设计者提供的消息来访问该对象。
继承性:继承性是子类自动共享父类之间数据和方法的机制。它由类的派生功能体现。一个类直接继承其它类的全部描述,同时可修改和扩充。继承具有传递性。继承分为单继承(一个子类只有一父类)和多重继承(一个类有多个父类)。类的对象是各自封闭的,如果没继承性机制,则类对象中数据、方法就会出现大量重复。继承不仅支持系统的可重用性,而且还促进系统的可扩充性。
多态性:对象根据所接收的消息而做出动作。同一消息为不同的对象接受时可产生完全不同的行动,这种现象称为多态性。利用多态性用户可发送一个通用的信息,而将所有的实现细节都留给接受消息的对象自行决定,如是,同一消息即可调用不同的方法。例如:Print消息被发送给一图或表时调用的打印方法与将同样的Print消息发送给一正文文件而调用的打印方法会完全不同。多态性的实现受到继承性的支持,利用类继承的层次关系,把具有通用功能的协议存放在类层次中尽可能高的地方,而将实现这一功能的不同方法置于较低层次,这样,在这些低层次上生成的对象就能给通用消息以不同的响应。在OOPL中可通过在派生类中重定义基类函数(定义为重载函数或虚函数)来实现多态性。
cd / 切换到根目录
cd /usr 切换到根目录下的usr目录
cd …/ 切换到上一级目录 或者 cd …
cd ~ 切换到home目录
cd - 切换到上次访问的目录
id选择器:
#id id属性不要以数字开头,数字开头的id在 Mozilla/Firefox 浏览器中不起作用。
class选择器:
.class
element选择器:
element
属性选择器:
[attribute]
伪类选择器:
:pseudo-class
如链接的不同状态
:link 未访问的链接
:hover 鼠标划过链接
:visited 已访问的链接
:active 已选中的链接
层级选择器:
element1 ? element2
? 处值可为空格、+、>
空格:(a b) 元素a中所有元素b的子代
+:(a + b) 所有紧接着元素a之后的元素b
:(a > b) 元素a中所有直接子元素b
通配符选择器:
1.作为web 服务器,它处理静态文件和索引文件效果非常高;
2.它的设计非常注重效率,最大支持5 万个并发连接,但只占用很少的内存空间;
3.稳定性高,配置简洁;
4.强大的反向代理和负载均衡功能,平衡集群中各个服务器的负载压力应用
49.Radis怎么实现数据同步
Redis的主从同步机制可以确保redis的master和slave之间的数据同步。按照同步内容的多少可以分为全同步和部分同步;按照同步的时机可以分为slave刚启动时的初始化同步和正常运行过程中的数据修改同步;
vue叫做渐进式框架,有底向上逐层应用,vue的代码执行时组件化和模范化,实施单页面编程,提高浏览器加载速度,减少代码写作采用的是MVVM编写模式。vue可以实现动态加载标签、做动画效果、表单数据双向绑定,异步连接后台等。
一、安装 vue-i18n插件
二、main.js文件的配置
三、定义两套中英文的 js 文件,并通过 require 的形式引入到 main.js。
四、绑定点击事件,来修改 locale 的值去调用对应的语言包实现语种切换。
五、vue-i18n 数据渲染的模板语法
登录服务单点登录:用户登陆进去的话 先查询数据库给JWT和RSA加密算法完成token的加密验证登录。
因为es搜索等功能比较强大,适合现阶段的使用,
项目中 课程的搜索功能,使用 Elasticsearch 实现,搜索出的数据使用 Redis 进行缓存,并将所有数据存到 Elasticsearch 中。
(1) 对事务的提交
MySQL默认是自动提交
Oracle默认不自动提交,需要用户手动提交,需要在写commit;指令或者点击commit按钮
(2) 分页查询
MySQL是直接在SQL语句中写"select… from …where…limit x, y",有limit就可以实现分页
Oracle则是需要用到伪列ROWNUM和嵌套查询
(3) 事务隔离级别
MySQL有4中隔离级别:读未提交,读已提交,可重复读,串行化
Oracle只有2中隔离级别:读已提交、串行化
MySQL是read commited的隔离级别,而Oracle是repeatable read的隔离级别,同时二者都支持serializable串行化事务隔离级别,可以实现最高级别的读一致性。每个session提交后其他session才能看到提交的更改。
(4) 对事务的支持
MySQL在innodb存储引擎的行级锁的情况下才可支持事务,而Oracle则完全支持事务
(5) 保存数据的持久性
MySQL是在数据库更新或者重启,则会丢失数据,Oracle把提交的sql操作线写入了在线联机日志文件中,保持到了磁盘上,可以随时恢复
(6) 并发性
MySQL以表级锁为主,对资源锁定的粒度很大,如果一个session对一个表加锁时间过长,会让其他session无法更新此表中的数据。虽然InnoDB引擎的表可以用行级锁,但这个行级锁的机制依赖于表的索引,如果表没有索引,或者sql语句没有使用索引,那么仍然使用表级锁。
Oracle使用行级锁,对资源锁定的粒度要小很多,只是锁定sql需要的资源,并且加锁是在数据库中的数据行上,不依赖与索引。所以Oracle对并发性的支持要好很多。
(7) 逻辑备份
MySQL逻辑备份时要锁定数据,才能保证备份的数据是一致的,影响业务正常的dml使用,Oracle逻辑备份时不锁定数据,且备份的数据是一致
(8) 复制
MySQL复制服务器配置简单,但主库出问题时,丛库有可能丢失一定的数据。且需要手工切换丛库到主库。
Oracle:既有推或拉式的传统数据复制,也有dataguard的双机或多机容灾机制,主库出现问题是,可以自动切换备库到主库,但配置管理较复杂。
(9) 性能诊断
MySQL的诊断调优方法较少,主要有慢查询日志。(现在的手段工具也挺多了)
Oracle有各种成熟的性能诊断调优工具,能实现很多自动分析、诊断功能。比如awr、addm、sqltrace、tkproof等
(10)权限与安全
MySQL的用户与主机有关,感觉没有什么意义,另外更容易被仿冒主机及ip有可乘之机。
Oracle的权限与安全概念比较传统,中规中矩。
(11)分区表和分区索引
MySQL的分区表还不太成熟稳定。
Oracle的分区表和分区索引功能很成熟,可以提高用户访问db的体验。
(12)管理工具
MySQL管理工具较少,在linux下的管理工具的安装有时要安装额外的包(phpmyadmin, etc),有一定复杂性。
Oracle有多种成熟的命令行、图形界面、web管理工具,还有很多第三方的管理工具,管理极其方便高效。
(13)最重要的区别
MySQL是轻量型数据库,并且免费,没有服务恢复数据,并且开源
Oracle是重量型数据库,收费,Oracle公司对Oracle数据库有任何服务。
使用?号
注解 功能
Select 映射查询的SQL语句
SelectProvider Select语句的动态SOL映射。允许指定一个类名和一个方法在执行时返回运行的查询语句。有两个属性:type和 method,type属性是类的完全限定名,method是该类中的那个方法名。
Insert 映射插入的SQL语句
InsertProvider Insert语句的动态SQL映射。允许指定一个类名和一个方法在执行时返回运行的查询语句。有两个属性:type和 method,type属性是类的完全限定名,method是该类中的那个方法名。
Update 映射更新的SQL语句
UpdateProvider Update语句的动态SQL。允许指定一个类名和一个方法在执行时返回运行的查询语句。有两个属性:type和 method,type属性是类的完全限定名,method是该类中的那个方法名。
Delete 映射删除的SQL语句
DeleteProvider Delete句的动态SQL映射。允许指定一个类名和一个方法在执行时返回运行的查询语句。有两个属性:type和 method,type属性是类的完全限定名,method是该类中的那个方法名。
Result 在列和属性之间的单独结果映射。属性包括:id、 column、 property、 javaType、jdbeType、 typeHandler、one、many。id属性是一个布尔值,表示是否被用于主键映射。one属性是单独的联系,和XML配置中的
one 复杂类型的单独属性值映射。必指定 select属性,表示已映射的SQL语句的完全限定名。
Many 复杂类型的集合属性映射。必指定 select属性,表示已映射的SQL语句的完全限定名。
Param 当映射器方法需要多个参数时,这个注解可以被应用于映射器方法参数来给每个参数取一个名字。否则,多参数将会以它们的顺序位置和SQL语句中的表达式进行映射,这是默认的。
Redis是一个key-value存储系统,它支持的value类型相对较多,包括string、list、set和zset,这些数据都支持push/pop/add/remove及交并补等操作,而且这些操作都是原子性的,在此基础上,redis支持各种不同方式的排序。为了保证效率,数据是缓存在内存中的,Redis会周期性的把数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave同步
一般而言,用户的每次请求都对应一个业务逻辑方法,并且每个业务逻辑方法往往具有逻辑上的原子性。此外,一个业务逻辑方法往往包括一系列数据库原子访问操作,并且这些数据库原子访问操作应该绑定成一个整体,即要么全部执行,要么全部不执行,通过这种方式我们可以保证数据库的完整性,这就是事务。总的来说,事务是一个不可分割操作序列,也是数据库并发控制的基本单位,其执行的结果必须使数据库从一种一致性状态变到另一种一致性状态。
在数据之外,数据库还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用指向数据,这样就可以在这些数据结构上实现高效查找,这些数据结构就是索引。
控制反转:控制是什么?
JavaBean(Java对象)的创建和管理
反转是什么?
一般情况下对象的创建和管理由开发者控制,反转是把对象的创建和管理交给容器完成,然后再交给开发者。
— 设置注入:设置注入是通过setter方法注入被调用者的实例。该方式简单、直观,而且容易理解,所以Spring的设置注入被大量使用。
— 构造注入:利用构造方法来设置依赖注入的方式称为构造注入。
/var/log/secure 与安全相关的日志信息
/var/log/maillog 与邮件相关的日志信息
/var/log/cron 与定时任务相关的日志信息
/var/log/spooler 与UUCP和news设备相关的日志信息
/var/log/boot.log 守护进程启动和停止相关的日志消息
FastDFS是一个开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题。特别适合以文件为载体的在线服务,如相册网站、视频网站等等。
FastDFS为互联网量身定制,充分考虑了冗余备份、负载均衡、线性扩容等机制,并注重高可用、高性能等指标,使用FastDFS很容易搭建一套高性能的文件服务器集群提供文件上传、下载等服务。
优点:
适合小文件存储
需要的计算资源少
支持在线扩容
主备Tracker服务,增强系统的可用性
线程是程序中执行的线程,Java虚拟机允许程序同时运行多个执行线程。
线程有6种状态:新建,运行(可运行),阻塞,等待,计时等待和终止。
调用对象不同
wait() 由锁对象调用
sleep() 由线程调用
锁使用不同
执行wait后,自动释放锁
执行sleep后,不会释放锁
唤醒机制不同
执行wait后,可以被通知唤醒
执行sleep后,只能等待时间结束后,自动唤醒
浅拷贝:
被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向
原来的对象.换言之,浅拷贝仅仅复制所考虑的对象,而不复制它所引用的对象.
深拷贝:
被复制对象的所有变量都含有与原来的对象相同的值.而那些引用其他对象的变量将指向被
复制过的新对象.而不再是原有的那些被引用的对象.换言之.深拷贝把要复制的对象所引用的对象都复制了一遍