Java整理
版本差别
- 并发
Java之美
大数据
目前大数据存储查询方案大概可以分为:HBase系、Dremel系、预聚合系、Lucene系
ELK
倒排索引
不是由记录来确定属性值,而是由属性值来确定记录的位置,因而称为倒排索引(inverted index)
API设计
Gradle整理
build.gradle文件的默认遍历是广度优先,所以会先便利root的,这个行为可以修改。
在Gradle术语中,Project对象对应的是BuildScript。
Project包含若干Tasks。另外,由于Project对应具体的工程,所以需要为Project加载所需要的插件,比如为Java工程加载Java插件。
Gradle工作包含三个阶段:
- 首先是初始化阶段。对我们前面的multi-project build而言,就是执行settings.gradle
- Initiliazation phase的下一个阶段是Configration阶段。
- Configration阶段的目标是解析每个project中的build.gradle。比如multi-project build例子中,解析每个子目录中的build.gradle。在这两个阶段之间,我们可以加一些定制化的Hook。这当然是通过API来添加的。
- Configuration阶段完了后,整个build的project以及内部的Task关系就确定了。恩?前面说过,一个Project包含很多Task,每个Task之间有依赖关系。Configuration会建立一个有向图来描述Task之间的依赖关系。所以,我们可以添加一个HOOK,即当Task关系图建立好后,执行一些操作。
- 最后一个阶段就是执行任务了。当然,任务执行完后,我们还可以加Hook
task
增量式构建
在增量式构建中,我们为每个Task定义输入(inputs)和输入(outputs),如果在执行一个Task时,如果它的输入和输出与前一次执行时没有发生变化,那么Gradle便会认为该Task是最新的(UP-TO-DATE),因此Gradle将不予执行
自定义property
- 文件中定义Property
- 通过命令行参数定义Property: gradle -Pproperty3="this is property3" showCommandLieProperties
- 通过JVM系统参数定义Property:gradle -Dorg.gradle.project.property3="this is another property3" showCommandLieProperties
- 通过环境变量设置Property : export ORG_GRADLE_PROJECT_property3="this is yet another property3"
自定义plugin
* configurations.all {
* resolutionStrategy {
* // fail eagerly on version conflict (includes transitive dependencies)
* // e.g. multiple different versions of the same dependency (group and name are equal)
* failOnVersionConflict()
*
* // force certain versions of dependencies (including transitive)
* // *append new forced modules:
* force 'asm:asm-all:3.3.1', 'commons-io:commons-io:1.4'
* // *replace existing forced modules with new ones:
* forcedModules = ['asm:asm-all:3.3.1']
*
* // add dependency substitution rules
* dependencySubstitution {
* substitute module('org.gradle:api') with project(':api')
* substitute project(':util') with module('org.gradle:util:3.0')
* }
*
* // cache dynamic versions for 10 minutes
* cacheDynamicVersionsFor 10*60, 'seconds'
* // don't cache changing modules at all
* cacheChangingModulesFor 0, 'seconds'
* }
* }
版本控制
tomcat
版本
tomcat7
tomcat8
tomcat8.5
tomcat9
总体设计
Container 是容器的父接口,所有子容器都必须实现这个接口,Container 容器的设计用的是典型的责任链的设计模式,它有四个子容器组件构成,其中:Engine 包含 Host,Host 包含 Context,Context 包含 Wrapper。通常一个 Servlet class 对应一个 Wrapper,如果有多个 Servlet 就可以定义多个 Wrapper,如果有多个 Wrapper 就要定义一个更高的 Container 了,如 Context
- Connector组件
Connector 组件是 Tomcat 中两个核心组件之一,它的主要任务是负责接收浏览器的发过来的 tcp 连接请求,创建一个 Request 和 Response 对象分别用于和请求端交换数据,然后会产生一个线程来处理这个请求并把产生的 Request 和 Response 对象传给处理这个请求的线程,处理这个请求的线程就是 Container 组件要做的事了 - Engine
它的标准实现类是 StandardEngine,这个类注意一点就是 Engine 没有父容器了,如果调用 setParent 方法时将会报错。添加子容器也只能是 Host 类型的 - Host容器
Host 是 Engine 的字容器,一个 Host 在 Engine 中代表一个虚拟主机,这个虚拟主机的作用就是运行多个应用,它负责安装和展开这些应用,并且标识这个应用以便能够区分它们。它的子容器通常是 Context,它除了关联子容器外,还有就是保存一个主机应该有的信息 - Context容器
Context 代表 Servlet 的 Context,它具备了 Servlet 运行的基本环境,理论上只要有 Context 就能运行 Servlet 了。简单的 Tomcat 可以没有 Engine 和 Host。 - Wrapper 容器
Wrapper 代表一个 Servlet,它负责管理一个 Servlet,包括的 Servlet 的装载、初始化、执行以及资源回收。Wrapper 是最底层的容器,它没有子容器了,所以调用它的 addChild 将会报错。
Wrapper 的实现类是 StandardWrapper,StandardWrapper 还实现了拥有一个 Servlet 初始化信息的 ServletConfig,由此看出 StandardWrapper 将直接和 Servlet 的各种信息打交道。
spring mvc整理
日志处理
hibernate:
JS整理
数据库整理
读现象
- 脏读:又称无效数据的读出,是指在数据库访问中,事务T1将某一值修改,然后事务T2读取该值,此后T1因为某种原因撤销对该值的修改,这就导致了T2所读取到的数据是无效的。
- 不可重复读:是指在数据库访问中,一个事务范围内两个相同的查询却返回了不同数据。这是由于查询时系统中其他事务修改的提交而引起的。比如事务T1读取某一数据,事务T2读取并修改了该数据,T1为了对读取值进行检验而再次读取该数据,便得到了不同的结果。
- 幻读:指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,比如这种修改涉及到表中的“全部数据行”。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入“一行新数据”。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样.一般解决幻读的方法是增加范围锁RangeS(range-locks:给SELECT 的查询中使用一个“WHERE”子句描述范围加锁),锁定检锁范围为只读,这样就避免了幻读
数据库隔离级别:
-
可序列化(Serializable):解决了脏读、不可重复读、幻读等读现象。产生的效果:
- 无法读取其它事务已修改但未提交的记录。
- 在当前事务完成之前,其它事务不能修改目前事务已读取的记录。
- 在当前事务完成之前,其它事务所插入的新记录,其索引键值不能在当前事务的任何语句所读取的索引键范围中。
- 可重复读(Repeatable reads):解决了脏读和不可重复读问题,但避免不了幻读:
- 提交读(Read committed):避免了脏读(dirty reads),解决不了不可重复读
- 未提交读(Read uncommitted):导致脏读
分类
通常分为层次式数据库、网络式数据库和关系式数据库 三种,网状数据库和层次数据库已经很好的解决了数据的集中和共享问题,但是在数据库独立性和抽象级别上扔有很大欠缺
- 关系型:MySQL,oracal,MS-sql
-
非关系型:
- 键值存储数据库(key-value):Memcached、Redis、MemcacheDB,Ecache。优势:在于简单、易部署、高并发,缺点:数据无结构化,通常只被当作字符串或者二进制数据
- 列存储(Column-oriented)数据库 :Cassandra、HBase(HBASE是Hadoop项目的一部)。列存储数据库将数据存储在列族中,一个列族存储经常被一起查询的相关数据,比如人类,我们经常会查询某个人的姓名和年龄,而不是薪资。这种情况下姓名和年龄会被放到一个列族中,薪资会被放到另一个列族中。这种数据库通常用来应对分布式存储海量数据,优点:查找速度快,可扩展性强,更容易进行分布式扩展,缺点:功能相对局限
- 面向文档(Document-Oriented)数据库:MongoDB、CouchDB,文档型数据库比键值数据库的查询效率更高,数据存储的最小单位是文档,同一个表中存储的文档属性可以是不同的,数据可以使用XML、JSON或JSONB等多种形式存储
- 图形数据库:Neo4J、InforGrid,实体会被作为顶点,而实体之间的关系则会被作为边