DanZ's Blog

a normal developer daily blog

0%

[toc]

一.Tomcat服务器

相信一直默默耕耘在 JavaWEB 的同学,肯定不会不认识 Tomcat。这可是世界一个著名的 Web服务器 之一,在之前动态 Web服务 还没有那么盛行的时候,Tomcat 依靠对 Servlet 的实现,让 Web开发 变得简单,JSP诞生 也是目前 动态页面 的始祖。 我不知道现在的同学还记不记得 servlet 的开发方法:

  1. 创建自己的处理类,继承 HttpServlet,覆写 doGet doPost doPut 等不同 HTTP Method 的方法实现;
  2. WEB项目web.xml 文件中配置 servlet 的请求路径信息;
  3. 打包成 war 包,丢进 Tomcat/webapp
  4. 启动 Tomcat 服务器,Tomcat 端口映射成功以后请求相对应的路径,即可访问到我们刚刚写的 servlet 中。
    阅读全文 »

一.InnoDB锁

并发的世界里,就离不开锁这个东西,即使会降低一些执行效率,但是该锁住的还是得锁住。MySQL 也一样,当两个 会话 同时修改一条数据的时候,就需要通过锁机制来保证修改后数据的正确性。锁听起来很牛逼,但是简单的概括一下也就是对某个资源(一个变量)的修改操作撸成一条队列来执行,由于执行之前需要判断一些锁的信息,所以执行效率肯定是要低一点的。

阅读全文 »

一.事务的隔离

刚开始我们说了事务的四个特性:原子性 一致性 隔离性 持久性

我们简单的分一下类: redo log 可以保证事务的 原子性持久性undo log 可以保证事务的 一致性,那么剩下的 隔离性 就由我们现在要说的 MVCC 来保证了。

阅读全文 »

一.UNDO LOG

之前说了数据库最重要的是持久化,那现在就需要来说 原子性隔离性 了。实现这两个目标最重要的的元素就是 undo log。 在日常开发中,我们也有 回滚 数据的需求。比方说,插入的某条数据不符合数据库的长度要求,就会抛出异常,从而触发 Spring框架事务 发送一个 ROLLBACK 命令给数据库,数据库就会把前面做的修改给重新还原回来。所以也需要 undo logundo 在中文不知道叫什么比较容易理解,后文就直接用这个英文名称吧。

阅读全文 »

一.REDO LOG

数据库最主要的特性是 持久性,即修改了数据库数据以后,无论发生什么事情,数据都不会丢失。MySQL-InnDB 就利用 REDO LOG 来满足持久性。REDO LOG 中文称为 重做日志,那也可以简洁一点叫做 REDO 日志。是数据库启动的时候,用于读取计算 BufferPool 中脏页数据的方式,这样可以避免由于其他原因导致数据库掉线但是脏页未刷新到硬盘,而导致数据丢失的尴尬局面。

二.高效且持久化的方式

由于 REDO 日志 存在的意义就是,重启数据库的时候能够重新将数据恢复回来。所以在数据库没有发生重启或者异常宕机的时候,他是没有任何意义的,甚至还多了一些开销…

所以为了减少开销,REDO 日志 应当尽量轻巧,记录一些必要的信息就可以了,比如:某个区,某个页号,的某一行,修改成xx。第二个减少开销的方式就是顺序写入硬盘,先发生的事务,REDO 日志 先被写入硬盘,后边的排队顺序追加到后面去。

三.日志格式

首先明白一点,REDO 日志 所携带的数据是 MySQL_InnoDB 在重启系统的时候,需要调用某些函数进行恢复时所需要的参数。不过,为了减少容量的开销,又做了一些事情。

阅读全文 »

一.数据库事务

刚开始接触编程,要写业务代码的时候我们知道。某个业务动作必须通过 事务 完成对数据库的修改。那么这个事务是什么,InnoDB 是怎样实现事务的要求的,就是接下来老夫想说的内容。

阅读全文 »

该文章采用先各个概念理解然后在最后可以配置各个不同参数的方式。所以如果想要配置的时候,可以直接看最后一个章节。

一. BufferPool总览

之前在 MySQL-InnoDB体系结构 中有说过,InnoDB 有一个一直在运行的后台线程在跑,目的简单的说就是 异步的同步内存中的数据到硬盘上去。 那进一步说为啥要同步,因为内存中的数据已经发生修改,所以这就是接下来的内容,从修改数据开始讲起。但是之前我们需要先了解一下 BufferPool 的出现。

阅读全文 »

一.子查询

我们平时在查询数据的时候,特别是报表数据的时候,或多或少都会接触到 子查询 这个东西的吧。因为有些数据,他就是需要前套一层 子查询 来先拿到部分数据,然后再结合这部分的数据接着进行查询。

阅读全文 »

一.InnoDB表数据

上面聊了这么多这个结构,那个结构的。现在是不是有点好奇,InnoDB 是把数据存在哪里的。答案也很简单,存在一颗 B+ 树种。

InnoDB 中,数据所在的位置没有其他地方,就只有一颗 B+ 树。而我们自己建立的索引,也是一颗 B+ 树。存储完整数据的 B+ 树也叫 聚簇索引,而我们自定义的列索引的 B+ 树,则称为 非聚簇索引

OK,大概明白了这两个东西以后,我们一个一个拆开来说说。

阅读全文 »

SqlSession

好了,继上一节的 SqlSession 继续,一气呵成。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
private class SqlSessionInterceptor implements InvocationHandler {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
SqlSession sqlSession = getSqlSession(SqlSessionTemplate.this.sqlSessionFactory,
SqlSessionTemplate.this.executorType, SqlSessionTemplate.this.exceptionTranslator);
try {
// 来到这里调用SqlSession的方法
Object result = method.invoke(sqlSession, args);
if (!isSqlSessionTransactional(sqlSession, SqlSessionTemplate.this.sqlSessionFactory)) {
// force commit even on non-dirty sessions because some databases require
// a commit/rollback before calling close()
sqlSession.commit(true);
}
return result;
} catch (Throwable t) {
Throwable unwrapped = unwrapThrowable(t);
if (SqlSessionTemplate.this.exceptionTranslator != null && unwrapped instanceof PersistenceException) {
// release the connection to avoid a deadlock if the translator is no loaded. See issue #22
closeSqlSession(sqlSession, SqlSessionTemplate.this.sqlSessionFactory);
sqlSession = null;
Throwable translated = SqlSessionTemplate.this.exceptionTranslator
.translateExceptionIfPossible((PersistenceException) unwrapped);
if (translated != null) {
unwrapped = translated;
}
}
throw unwrapped;
} finally {
if (sqlSession != null) {
closeSqlSession(sqlSession, SqlSessionTemplate.this.sqlSessionFactory);
}
}
}
}
阅读全文 »