不积跬步,无以至千里;不积小流,无以成江海
面向对象
封装:将抽象性函式接口的实现细节部分包装、隐藏起来的方法;
多态:同一个行为具有多个不同表现形式或形态的能力
继承:子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法;
多态变量
Java的对象变量是多态的,它们能保存不止一种类型的对象;
它们可以保存的是声明类型的对象,或声明类型的子类的对象;
当把子类的对象赋给父类的时候,就发生了向上造型;
造型
子类的对象可以赋值给父类的变量,Java中不存在对象对对象的赋值;
父类的对象不能赋值给子类的变量,但可以用造型;
对象本身并没有发生任何变化,不是类型转换;
运行时有机制来检测这样的转化是否合理,ClassCastException;
函数调用的绑定
当通过对象变量调用函数的时候,调用哪个函数这件事情叫做绑定;
动态绑定,根据变量的动态类型来决定;
静态绑定,根据变量的声明类型来决定;
在成员函数中调用其他成员函数也是通过this这个对象来调用的;
死锁
两个或者两个以上的事务在执行过程中,因争夺资源而造成的一种互相等待的现象
产生的必要条件
1.互斥
并发执行的事务为了进行必要的隔离保证执行正确,在事务结束前,需要对修改的数据库记录持锁,保证多个事务对相同数据库记录串行修改
对于大型并发系统无法避免
2.请求和保持
已经持有一个资源锁,等待另外一个资源锁
死锁仅发生在请求两个或者两个以上的锁对象
由于应用需要,难以消除
3.不剥夺
已经获得锁资源的事务,在未执行前,不能被强制剥夺,只能使用完时,由事务自己释放
一般用于已经出现死锁时,通过破坏该条件达到解除死锁的目的
数据库系统通常通过一定的死锁检测机制发现死锁,强制回滚代价相对较小的事务,达到解除事务的目的
4.环路等待
发生死锁时,必然存在一个事务---锁的环形链
按照统一顺序获取锁,可以破坏该条件
通过分析死锁事务之间的锁竞争关系,调整SQL的顺序,达到消除死锁的目的
MySQL
锁类别
排它锁
它跟任何的锁都是冲突的,如果一个事务加了排它锁,不管其他事务是加任何的锁,都必须要等待这个事务
共享锁
多个事务可以共享一把锁,多个锁是可以兼容的
加锁方式
外部加锁
由应用程序添加,锁依赖关系较容易分析
共享锁:select * from table lock in share mode
排它锁:select * from table for update
内部加锁
为了实现ACID特性,由数据库系统内部自动添加
加锁规则繁琐,与SQL执行计划、事务隔离级别、表索引结构有关
共享锁和排它锁
需要持有锁的SQL
快照读
在MySQL中所有的select读都属于快照读
Innodb实现了多版本控制(MVCC),支持不加锁快照读
select操作都是不加锁的,这样可以保证select的性能
能够保证同一个select结果集是一致的
不能保证同一个事务内部,select语句和其他语句的数据一致性,如果业务需要,需通过外部显式加锁
当前读
select * from table lock in share mode
select * from table for update
update from table set ......
insert into ......
delete from table ......
分析死锁的常用办法
show engine innodb status
注解
元注解(描述注解的一种方式)
@Retention定义注解的声明周期:source->class->runtime
@Documented文档注解,会被Javadoc工具文档化
@Inherited是否让子类继承该注解
@Target描述了注解的应用范围【type:表示可以用来修饰类,接口、注解类型或者枚举类型; package:可以用来修饰包;
parameter:可以用来修饰参数;
annotation_type:可以用来修饰注解类型;
method:可以用来修饰方法;
field:可以用来修饰属性(包括枚举常量);
constructor:可以用来修饰构造器;
local_variable:可以用来修饰局部变量;
反射
反射的优缺点:
1.通过反射可以使程序代码访问装载到jvm中的类的内部信息,获取已装载类的属性信息,获取已装载类的方法,获取已装载类的构造方法信息
2.反射提高了Java程序的灵活性和扩展性,降低耦合性,提高自适应能力
3.反射会对性能造成一定的影响,同时让代码的可读性变低
反射(reflection):在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射。
事务管理
JDBC事务
hibernate事务
spring事务管理
统一的事务编程模型
编程式事务
TransactionTemplate
PlatorformTransactionManager
适用于事务操作少
声明式事务(AOP)
xml
添加schema
定义事务管理器
定义事务Advice
定义Pointcut
配置<tx:method/>
name:匹配函数的名称,支持*匹配
propagation:事务传播行为
islation:事务隔离级别
timeout:超时
read-only:是否只读事务
rollback-for:触发回滚的异常,逗号分隔
no-rollback-for:不触发回滚的异常,逗号分隔
@Tranctional
value:使用的TransactionManager
propagation:事务传播行为
isolation:事务隔离级别
timeout:超时
readOnly:是否只读事务
rollbackFor:触发回滚的异常
rollbackForClassName:触发回滚的异常类名称数组
noRollbackFor:不触发回滚的异常
适用于事务操作多
事务管理器
PlatorformTransactionManager
DataSourceTransactionManager
HibernateTransactionManager
TransactionDefinition
getName:事务名称
getIsolationLevel:隔离级别
getPropagationBehavior:传播行为
getTimeout:超时时间
isReadOnly:是否只读事务
TransactionStatus
isNewTransaction:是否是新的事务
hasSavepoint:是否有(诊断,NESTED)
isCompeleted:是否已完成
isRollbackOnly:事务结果是否是rollback-only
setRollbackOnly:设置事务为rollback-only(TransactionTemplate)
隔离级别
ISOLATION_READ_UNCOMMITTED:读未提交
ISOLATION_READ_COMMITTED:读提交
ISOLATION_REPEATABLE_READ:重复度
ISOLATION_SERIERLIZED:串行化
ISOLATION_DEFAULT:默认
传播行为
PROPAGATION_REQUIRED
如果存在一个事务,则支持当前事务。如果没有事务则开启一个新的事务
PROPAGATION_SUPPORTS
如果存在一个事务,支持当前事务。如果没有事务,则非事务的执行。但是对于事务同步的事务管理器,PROPAGATION_SUPPORTS与不使用事务有少许不同
PROPAGATION_MANDATORY
如果已经存在一个事务,支持当前事务。如果没有一个活动的事务,则抛出异常
PROPAGATION_REQUIRES_NEW
使用PROPAGATION_REQUIRES_NEW,需要使用 JtaTransactionManager作为事务管理器。它会开启一个新的事务。如果一个事务已经存在,则先将这个存在的事务挂起。
PROPAGATION_NOT_SUPPORTED
PROPAGATION_NOT_SUPPORTED 总是非事务地执行,并挂起任何存在的事务。使用PROPAGATION_NOT_SUPPORTED,也需要使用JtaTransactionManager作为事务管理器
PROPAGATION_NEVER
总是非事务地执行,如果存在一个活动事务,则抛出异常。
PROPAGATION_NESTED
如果一个活动的事务存在,则运行在一个嵌套的事务中。 如果没有活动事务, 则按TransactionDefinition.PROPAGATION_REQUIRED 属性执行。 这是一个嵌套事务,使用JDBC 3.0驱动时,仅仅支持DataSourceTransactionManager作为事务管理器。 需要JDBC 驱动的java.sql.Savepoint类。使用PROPAGATION_NESTED,还需要把PlatformTransactionManager的nestedTransactionAllowed属性设为true(属性值默认为false)