目录
1、Tomcat
源码是java编写,运行需要依赖jdk
linux:export CATALINA_HOME:设置Tomcat环境变量
环境变量:JAVA_OPTS
Tomcat server.xml
Tomcat架构,server.xml:
<Server>
<Service><-可以有多个service-><-即container容器->
<Connector><-可以有多个-><-用来接收用户请求->
</Connector>
<Engine><-用来处理Connector接收到的用户请求-><-java代码实际由Engine来执行的->
<Host><-可以有多个-><-虚拟主机->
<Context><Context><-可以有多个-><-Context即是web应用->
</Host>
</Engine>
</Service>
</Server>
Connector:端口、协议、客户端连接超时ms、依赖的线程池、最大连接数(阻塞IO,即线程池的最大连接数)、请求排队长度
Executor默认线程池:最小空闲线程数、最大线程数
线程池:
最小空闲线程数
最大线程数
日志:系统运行日志、访问日志、应用日志
Tomcat官方文档
2、JDBC 数据库统一接口规范
JDBC API :与java web程序进行通信
JDBC Driver API :与数据库层建立连接,由数据库厂商实现,与数据库通信
JDBC URL:协议jdbc、子协议:各数据库协议、主机IP、端口、数据库名称
JDBC API:
Driver:数据库驱动程序。向DriverManager注册一个驱动程序:Class.forName()
DriverManager:驱动程序管理。获取建立数据库物理连接:DriverManager.getConnection()
Statement:SQL的容器。conn.createStatement();stmt.execute*();
ResultSet:stmt.executeQuery执行结果/sql查询结果。由行和列组成的二元表(基于关系型数据库是个二元表)
SQLException:数据库相关异常
步骤:装载驱动程序--获取数据库连接--执行SQL语句--获取执行结果--清理环境(close:关闭连接、释放资源)
游标:提供一种客户端读取部分服务器结果集的机制。
PreparedStatement:继承自Statement,在生成Statement对象时需传入sql语句
setFetchSize():可实现游标功能,设置jdbc客户端从数据库服务端取回的数据数量
ResultSet.getBinaryStream():获取执行结果的流对象
流方式:应对大字段。将大字段内容以二进制流方式按照区间进行划分,依次读取每个区间的内容
批处理:添加SQL:Statement.addBatch(); 执行SQL:Statement.executeBatch(); 清空batch中SQL语句:Statement.clearBatch();
批量处理,提供效率,避免每次与数据库连接耗时
字符集设置:show variables like '%character%' 、 show create table tableName
server级别、数据库级别、表级别、列(字段)级别。(优先级从左至右依次提高)
JDBC_URL + characterEncoding=utf8
3、数据库连接池(避免频繁建立数据库连接,连接复用)
DriverManager.getConnection()创建数据库连接步骤(mysql):
客户端请求建立连接--服务端返回随机密码种子--客户端发送加密密码--服务端响应连接建立成功
客户端与服务端多次网络交互,跨机器网络传输有较大时间开销,建立连接时间花销大
服务器端(数据库)处理sql请求会分配内存,处理完成释放,内存大小有限制,可分配资源超出限制服务器宕机,故有最大并发连接数限制
客户端(java程序)对请求数据库进行限流,业务线程排队获取数据库连接,限制同时获得数据库连接的连接数
DBCP连接池:Apache开源,通用连接池
BasicDataSource:连接池对象
url、driver、user、password
getConnection()获取连接
close:将数据库连接归还给连接池,重写了close方法
设置连接池创建时预置连接数、设置连接池中最大连接数(客户端限流保护数据库)、设置线程获取连接排队等待最大时间、
设置最大空闲连接数(减少连接数、减少资源损耗)、设置最小空闲连接数(与最大空闲连接数保持一致,避免频繁创建销毁连接)、
定期检查:设置开启定期检查、设置销毁连接最小空闲时间、设置定期检查间隔时间(MySQL默认关闭空闲时间超过8个小时的连接,MySQL服务器关闭了连接,而客户端连接池不知道已经关闭该连接,故需要定期检查客户端连接池中的连接,关闭超出预订时间的连接,一般小于服务端连接空闲关闭时间)
show processlist:查看数据库物理连接
4、死锁
两个以上事务,争夺锁资源,互相等待
产生的必要条件:互斥、请求和保持、不剥夺、环路等待
调整SQL顺序,按序获取锁资源
排它锁、共享锁
加锁方式:
外部加锁:
由应用程序添加,锁依赖关系较容易分析
共享锁(S):select * from table lock in share mode
排它锁(X):select * from table for update
内部加锁:
为了实现ACID特性,由数据库系统内部自动添加
加锁规则繁琐,与SQL执行计划、事务隔离级别、表索引结构有关
共享锁(S)、排它锁(X)
对数据库的更新、插入、删除,可能引起数据库内部加锁
MySQL中所有select都是快照读,select查询不会加锁
innodb实现了多版本控制(MVCC),支持不加锁快照读
需要持有锁的SQL:
select * from table lock in share mode
select * from table for update
update table from table set ...
insert into ...
delete from table ...
分析死锁的常用办法:
MySQL会自动检测死锁,并强制回滚代价最小的事务,解除死锁
分析死锁:show engine innodb status 语句:会列出导致死锁发生的SQL语句,及回滚的SQL语句
5、MyBatis
关系型数据库:数据以行和列的二元表存储
ORM:建立对象到数据库表之间的映射关系
MyBatis:区别于传统ORM框架对象到数据库表之间的映射,而是建立对对象的操作方法到SQL语句的映射
支持自定义SQL、存储过程、视图等,开发人员可使用关系型数据库的所有特性
使用xml配置或注解配置
可映射基本数据元素、接口、java对象到数据库
功能架构:
API接口层:数据查询、新增、更新、删除、获取配置
数据处理层:a、参数映射:参数映射配置、参数映射解析、参数类型解析
b、SQL解析:SQL获取、SQL解析、动态SQL
c、SQL执行:单个、批量、复用
d、结果映射:结果映射配置、结果类型转换、结果数据拷贝
基础支撑层:连接管理、事务管理、配置加载、缓存处理
配置:sqlSessionFactory
事务(transactionManger:jdbc:将事务交给jdbc处理,mange:将事务交给外部容器如spring来处理,mybatis不会调用jdbc提交回滚事务)
数据源(驱动、数据库url、用户名、密码)
优势:操作简单、自定义SQL操作数据库更加灵活
劣势:编写SQL工作量大,xml配置多,数据库移植性差
resultMap
dataSource type = "POOLED" 开启数据库连接池:
空闲连接池队列、活跃连接池队列
数据库最大活跃连接数、最大空闲连接数,最好设置一样大
连接侦测(启用,检查连接是否有效),侦测SQL(select 1),侦测时间(小于MySQL服务端连接超时时间8小时)
6、Spring JDBC
关注业务,封装公用操作(建立连接、执行SQL获取结果、处理异常、关闭连接等)
DataSource(java提供的接口).getConnection
DriverManagerDataSource(spring提供的DataSource实现).getConnection(每次会创建一个连接)
BasicDataSource(Apache提供,连接池)
JdbcTemplate:声明SQL及参数、执行SQL及处理结果、异常处理
JdbcTemplate定义:new JdbcTemplate(dataSource)
RowMapper(JdbcTemplate提供的接口,将SQL执行结果ResultSet转换为java对象)
@Repository:定义一个bean,用于DAO类注解,表示会访问数据库数据
NamedParameterJdbcTemplate(可定义参数名称)
SqlParameterSource:定义参数类型
MapSqlParameterSource(等同于直接使用Map,put KV)
BeanPropertySqlParameterSource(将java bean作为参数),new BeanPropertySqlParameterSource(Object)
异常处理:
SqlException(checked) --> DataAccessException(unchecked)
7、Spring事务管理
统一的事务编程模型
编程式事务、声明式事务(AOP切面)
PlatformTransactionManger 接口:获取事务、提交事务、回滚事务
实现:DataSourceTransactionManger(JDBC的事务管理)
HibernateTransactionManger(Hibernate的事务管理实现)
TransactionDefinition:事务定义
事务名称、事务隔离级别、事务行为、超时时间、是否只读事务
TransactionStatus:事务状态
隔离级别:
读未提交、读提交、重复读、串行化、默认
传播行为:影响事务提交状态
声明式事务:aop
定义事务Advice
@Transactional
841

被折叠的 条评论
为什么被折叠?



