spring的加载原理
4.解析XML的信息,跟踪进去 NamespaceHandlerSupport 的parse 的类BeanDefinitionParser
5.里面有ClassPathBeanDefinitionScanner 来扫描类文件。
6.值得注意的是classpath*:com/abc/**/*.class加载类的路径。
mybatis 的优缺点。
1.1)单小巧易用上手,方便浏览修改sql就是它最大的优点。
2)运行速度,hibernate是在jdbc上进行了一次封装,而mybatis基于原生的jdbc,因此mybatis天生就有运行速度上的优势。
3)mybatis可以很容易做到不规范的映射对象和规范的映射对象共存
4)Hibernate理念不错,完全的ORMapping,MyBatis只是个SQL Mapper
5)mybatis会有更强的掌控度,你可以控制sql,而不是hibernate那样使用hsql。你几乎无法预知生成的真正sql是什么样,多么烂。。
这个优点前期并不明显,尤其是表少,表关联少,数据量少的时候,因此这个阶段hibernate会更方便,但是一点复杂度到了一定程度,
那mybatis的优越性就就来了,自己写sql,可控度非常高。效率也不会因为无法预计的sql而被拉低(不排除人为因素)。
2..差异比较大的是关联查询时,hibernate为了保证POJO的数据完整性,需要将关联的数据加载,需要额外地查询更多的数据。这里hibernate并没有提供相应的灵活性。
3. mybatis提供xml标签,支持编写动态sql。
4.mybatis的sql写在xml里,便于统一管理和优化。
5.sql工作量很大,尤其是字段多、关联表多时,更是如此,编写动态sql时,不方便调试,尤其逻辑复杂时,可读性差。
mysql的优化
1)EXPLAIN 将获取查询的索引
EXPLAIN
SELECT *
FROM LOG.mycis_trans_log t1
WHERE date_format(entry_datetime, '%Y%m%d') >= '20170120'
AND date_format(entry_datetime, '%Y%m%d') < '20170224'
AND resource_id = 'apVoidCheck'
and local_company <> 0
2)尽量避免SELECT *命令
3)建立有效的索引
4)利用LIMIT 1取得唯一行
5)保证连接的索引是相同的类型,不要用索引字段上加函数,否则可能不能用。
6)拆分大的 DELETE 或 INSERT 语句。
索引:
1)左前缀匹配原则,非常重要的原则,mysql会一直向右匹配直到遇到范围查询(>、<、between、like)就停止匹配,比如a = 1 and b = 2 and c > 3 and d = 4 如果建立(a,b,c,d)顺序的索引,d是用不到索引的。
2)尽量选择区分度高的列作为索引,例如主键做索引。
3)索引列不能参与计算
4)尽量的扩展索引,不要新建索引。比如表中已经有a的索引,现在要加(a,b)的索引,那么只需要修改原来的索引即可。
jvm GC 调试
JVM原理
1.JVM 其实是一种抽象的机器,安装在操作系统之上,有完整的机器指令,并且拥有自己的栈,寄存器等。JVM提供了不同的硬件平台编译java技术代码的规范,该规范使得java独立于平台。
1)java 从编译到最终运行,首先是代码的装入。由类加载器class load。
2)代码的校验,由字节码验证器完成,以保证不违反java的安全性规则。
3)代码的执行,由运行时解释器完成。在字节码校验后,代码就可以执行了。
2.jvm加载:
1) JVM加载,连接,初始化。
2)JAVA class的加载,Bootstrap ,Extension ,System ,User-Defined
3)JVM执行引擎
4)JVM运行时数据区
---3)4)也可以称为管理并分配内存
5)JVM垃圾回收
3.java 的内存分类,以及存贮的类型。
1)java栈的区域很小,只有1M,特点是存取速度很快,所以在stack中存放的都是快速执行的任务,
基本数据类型的数据,和对象的引用(reference)。
2)程序计数器(ProgramCounter)寄存器
PC寄存器( PC register ):每个线程启动的时候,都会创建一个PC(Program Counter,程序计数器)寄存器。PC寄存器里保存有当前正在执行的JVM指令的地址。 每一个线程都有它自己的PC寄存器,也是该线程启动时创建的。保存下一条将要执行的指令地址的寄存器是 :PC寄存器。PC寄存器的内容总是指向下一条将被执行指令的地址,这里的地址可以是一个本地指针,也可以是在方法区中相对应于该方法起始指令的偏移量。
3)本地方法栈
Nativemethodstack(本地方法栈):保存native方法进入区域的地址。
4)堆
类的对象放在heap(堆)中,所有的类对象都是通过new方法创建,创建后,在stack(栈)会创建类对象的引用(内存地址)。
5)方法区
method(方法区)又叫静态区,存放所有的①类(class),②静态变量(static变量),③静态方法,④常量和⑤成员方法。
6)运行常量池
这儿的“静态”是指“位于固定位置”。程序运行期间,静态存储的数据将随时等候调用。可用static关键字指出一个对象的特定元素是静态的。但Java对象本身永远都不会置入静态存储空间。
这个区域属于方法区。该区域存放类和接口的常量,除此之外,它还存放成员变量和成员方法的所有引用。当一个成员变量或者成员方法被引用的时候,JVM就通过运行常量池中的这些引用来查找成员变量和成员方法在内存中的的实际地址。
Session和cookie区别
举例三种设计模式和运用场景。
高并发
多线程
redis的原理
dubbo
Dubbo的架构
节点角色说明:
· Provider: 暴露服务的服务提供方(service服务层)。
· Consumer: 调用远程服务的服务消费方(web表现层)。
· Registry: 服务注册与发现的注册中心(zookeeper)。
· Monitor: 统计服务的调用次调和调用时间的监控中心。
· Container: 服务运行容器(tomcat容器,spring容器)。
调用关系说明:
· 0. 服务容器负责启动,加载,运行服务提供者。
· 1. 服务提供者在启动时,向注册中心注册自己提供的服务。
· 2. 服务消费者在启动时,向注册中心订阅自己所需的服务。
· 3. 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
· 4. 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
· 5. 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。
注册服务关系图解:
注册发布服务流程:
1) 服务容器启动(tomcat容器,spring容器)
2) Service服务层项目发布服务
a) Dubbo服务治理中间件把服务发布存储到Zookeeper注册中心
3) Web层服务调用服务
a) Dubbo服务治理中间件去Zookeeper注册中心获取服务。
1)dubbo的import的加载
Class.forName("com.alibaba.dubbo.config.spring.schema.DubboNamespaceHandler");
Class clz = Class.forName("org.springframework.context.support.ClassPathXmlApplicationContext");
Constructor con = clz.getConstructor(new Class[]{String.class});
context = con.newInstance(new Object[]{"classpath*:" + System.getProperty("dubbo.consumer.file", "dubbo-consumer-config.xml")});
MQ,
GIT
java集合类总结
接口 | 特性 | 实现类 | 实现类特性 | 成员要求 |
List | 线性、有序的存储容器,可通过索引访问元素 | ArrayList | 数组实现。非同步。查询快O(1),写入慢O(N),但是如果从数组末尾插入则效率高。 |
|
Vector | 类似ArrayList,同步。 |
| ||
LinkedList | 双向链表。非同步。 查询慢,写入快 实现了stack和queue的方法。 通过movefist实现stack和movelast实现queue 可以通过push,pop实现stack,先进后出 通过offer(value),pull()和实现queue,先进先出 |
| ||
Map | 保存键值对成员 | HashMap | 基于哈希表的 Map 接口的实现,满足通用需求 | 任意Object对象,如果修改了equals方法,需同时修改hashCode方法 |
TreeMap | 默认根据自然顺序进行排序,或者根据创建映射时提供的 Comparator进行排序 ,comparator 的是key的值,可以自定义输出结果从大到小。 默认会以按照树结构从小到大的顺序输出结果。 | 键成员要求实现caparable接口,或者使用Comparator构造TreeMap。键成员一般为同一类型。 | ||
LinkedHashMap | 类似于HashMap,但迭代遍历时取得“键值对”的顺序是其插入顺序或者最近最少使用的次序 | 与HashMap相同 | ||
IdentityHashMap | 使用==取代equals()对“键值”进行比较的散列映射 | 成员通过==判断是否相等 | ||
WeakHashMap | 弱键映射,允许释放映射所指向的对象 |
| ||
ConcurrentHashMap | 线性安全的Map |
| ||
Set | 成员不能重复 | HashSet | 为快速查找设计的Set | 元素必须定义hashCode() |
TreeSet | 保持次序的Set,底层为树结构 | 元素必须实现Comparable接口 | ||
LinkedHashSet | 内部使用链表维护元素的顺序(插入的次序) | 元素必须定义hashCode() |