- 浏览: 169670 次
- 性别:
- 来自: 杭州
最新评论
文章列表
按底层实现方式划分,Java文件读写有两种:用户空间拷贝 和 内核空间拷贝。
用户空间拷贝
数据传递需要在 用户空间 和 内核空间 之间转换。
java.nio.Files.copy() 几个重载方法内部都是这种方式。
典型用户空间数据拷贝:
void copy(InputStream source, OutputStream target) {
byte[] buffer = new byte[8192];
int n;
while ((n = source.read(buffer)) > 0) {
target.write(b ...
压力测试的一种工作纲要
- 博客分类:
- Testing
1. 测试目标与范围
本次测试的对象是什么。
该测试的意义是什么,期望得到什么信息。
2. 测试环境
2.1 软硬件部署
被测系统的部署情况,它与其它服务对接的部署方式。
2.2 配置清单
被测系统性能相关参数设置。
宿主机资源配置信息。
2.3 业务数据说明
数据类型,数据量,受影响的业务。
3. 测试方法
例:
方法简述
通过模拟的请求发起者,向被测系统发送请求;
记录被测系统的的吞吐量、响应时间、资源利用(CUP/内存/硬盘IO/网络IO等)、成功率。监控对象包括服务器总体状况 ...
当MySQL单表记录数太多时,各项操作性能会明显下降。
相关优化策略有很多,但肯定不是所有策略都适合某个特定案例。也许在技术层面上,很多策略都能提高性能,但我们也得考虑成本和收益(ROI)。
另,是否有性能提升 ...
水平拆分是优化数据库大表的常见方式。
拆分方式
水平拆分的一种实现方式是使用数据库本身支持的分区表特性,即多个物理子表组成一个逻辑总表。 也可以显式地 (库内)分表,或 分库。
库内分表 可以缓解单表 ...
MySQL表分区是MySQL提供的一种简单的数据表水平拆分方法。 分区表是一个逻辑表,它由多个物理子表组成。 目前只有 InnoDB 和 NDB 正式支持表分区。
注:表分区虽然可以缓解单表数据量过大的问题,但对于减轻数据库服务器压力的作用不大,所有请求还是在争用同一服务器的资源。
1. 创建分区表
可在创建表时指定分区方式。例:
create table t1 (
id int,
amount decimal(7,2),
tr_date date)
Partition by hash(month(tr_date))
Partitions 6;
...
垂直拆分是数据拆分方式中比较简单的方式(相对于水平拆分而言)。
注意:垂直拆分后单表数据量未变,依然很大(需要 水平拆分)。
垂直拆分有 分库 和 分表 两种方式。
垂直分库
垂直分库就是根据数据表的 ...
MySQL 的默认事务隔离级别是 Repeatable Read(可重复读)。
Oracle 的默认事务隔离级别是 Read Committed(读已提交)。
这是一个比较“怪”的现象。毕竟这两个事务隔离级别是差异是比较大的,而这两个数据库都是通用型的产品。
真实原因是MySQL为了规避一个数据复制场景中的缺陷,而选择 Repeatable Read 作为默认隔离级别。
基于 Statement 的 binlog
binary log 的主要用途
MySQL的 binary log 记录了数据库的“事件”。这些“事件”描述了数据库的改动,包括 表的创建、数据修改等。 ...
MyBatis 有 一级缓存 和 二级缓存。
一级缓存
一级缓存,默认就是开启的,范围是 Session。
可通过 localCacheScope 设置不同的范围,支持两种范围:
SESSION:同一个 SQL Session 内的查询共享数据。(默认配置)(类似事务隔离级别中的 “Repeatable Read”)
STATEMENT:缓存仅用于语句执行;同一个 SQL Session 内的不同调用不会共享数据。 (类似 “Read Committed”)
注意:MyBatis中的Session与Spring中的事务绑定。Spring默认每次都创建一个新 ...
Spring不直接管理事务,它提供了事务管理器,但是具体相关管理职责由 Hibernate、MyBatis 等持久层框架实现。由这些持久层框架实现与数据库服务的通信。
@Transactional
使用Spring提供的事务框最普遍的方式是 在事务方法上添加标记 @Transactional,并设置相关属性。如:
@Transactional(propagation=Propagation.REQUIRED,
isolation=Isolation.REPEATABLE_READ)
public void runInTransaction() {
...
...
避坑:自定义 Spring MVC 的 HttpMessageConverter 时,应显式设置各Converter的先后顺序,避免被Spring框架的“自动调整”打乱优先级。
@Configuration
public class MyConfig impliments WebMvcConfigurer {
@Override
public void configureMessageConverters(List ...
【MySQL】索引结构
- 博客分类:
- MySQL
为数据表增加索引(Index)可以提升MySQL数据查询效率。MySQL中所有类型的数据字段都可以有索引。索引指向了数据表中的记录(行),可以快速判断某行记录是否符合 where 语句中的限定条件。
但是索引并不是越多越好:
索引需要耗费存储空间;
索引越多,MySQL在决定采用哪个索引时也会消耗更多时间;
数据的 增、删、改 都会引起索引的维护操作;
如果总共就一、二千条数据,或目标列的查询使用率很低,或重复索引值占比过高,就没必要创建索引。
MySQL中的索引结构
B+Tree
MyISAM 和 InnoDB 都使用了 B+Tree 作为索引的数据 ...
事务的 4个 特性(ACID)
原子性(Atomicity):事务是不可分割的工作单元,其包含的操作,要么都做,要么都不做。
一致性(Consistency):事务执行后,数据记录必须符合各项约束条件。
隔离性(Isolation):并发事务的执 ...
【MySQL】索引类型
- 博客分类:
- MySQL
MySQL支持多种类型的索引。在使用时可以根据业务需求选择合适的索引类型。
普通索引
就是没有特殊限制的索引。示例:
create index 'index_name_1' on table1 (column1);
唯一索引
唯一索引所使用的列(Column)值必须唯一,可以是空值,而且是允许多个空值。 如果索引引用了多列,则其组合的列值必须唯一。 示例:
create unique index 'index_name_1' on table1 (column1);
主键索引
一种特殊的唯一索引,不允许列值为空值。通常在创建表时就创建主键 ...
【MySQL】字符集设置
- 博客分类:
- MySQL
较真点说,“字符集”指多个字符的合集,“字符编码”指对字符集中的字符进行编码的方式(方便信息传输)。
字符集 与 字符编码 是 1:N 的关系。
如,UTF-8 是针对 Unicode字符集 的一种编码方式。
在实际使用场景中,往往 ...
InnoDB 和 MyISAM 是MySQL中最常见的两种存储引擎。
通常:
读操作密集的表,选MyISAM
写操作密集的表,选InnoDB
二选一需要考虑哪些特性
以下特性是 InnoDB 和 MyISAM 二选一时通常需要考虑的特性。
MyISAM
MyISAM 基于 ISAM(Indexed Sequential Access Method)改良而来。性能好,但是:
只有表锁,没有行锁。
读数据时,对所有读到的表加锁;
写数据时,对表加排它锁。
不支持事务
不支持崩溃后安全恢复
不支持外键
InnoDB
...