十一、文件上传~~~
Apache提供Commons-FileUpload
SmartUpload
Struts2文件上传
步骤一:form表单使用post提交,而且表单添加 enctype="multipart/form-data",
实现多媒体封装。
表单项中<input type="file" name="myFile" >,file表单项必须有name属性,不然不会上传。
步骤二:开发后天程序处理文件上传的数据。
可使用Apache提供Commons-FileUpload来完成文件的上传
二、文件保存的位置
3.防止上传的文件重名覆盖
4.防止同一个目录下上传文件过多mysql
十二、分页(带有查询条件)~~~sql
1三、事务数据库
事务的四大特性 ~
事务的四大特性是事务自己具备的特色。简称ACID。
原子性(Atomicity)
原子性是指事务是一个不可分割的工做单位,事务中的操做要么都发生,要么都不发生。
一致性(Consistency)
事务先后数据的完整性必须保持一致。 安全
隔离性(Isolation)多线程
事务的隔离性是指多个用户并发访问数据库时,一个用户的事务不能被其它用户的事务所干扰,
多个并发事务之间数据要相互隔离。并发
持久性(Durability)
持久性是指一个事务一旦被提交,它对数据库中数据的改变就是"永久性"的,
接下来即便数据库发生故障也不该该对其有任何影响。数据库设计
四大隔离级别 ~
那么数据库设计者在设计数据库时到底该防止哪些问题呢?防止的问题越多性能越低,
防止的问题越少,则安全性越差。
到底该防止哪些问题应该由数据库使用者根据具体的业务场景来决定,因此数据库的设计者并无
把放置哪类问题写死,而是提供了以下选项:
数据库的四大隔离级别:
read uncommitted;
--- 不作任何隔离,可能形成脏读 不可重复度 虚读(幻读)问题
read committed;
-- 能够防止脏读,可是不能防止不可重复度 虚读(幻读)问题
repeatable read;
-- 能够防止脏读 不可重复度,可是不能防止 虚读(幻读)问题
serializable;
-- 能够防止全部隔离性的问题,可是数据库就被设计为了串行化的数据库,性能很低
从安全性上考虑:
Serializable > Repeatable Read > Read Committed > Read uncommitted
从性能上考虑:
Read uncommitted > Read committed > Repeatable Read > Serializablepost
数据库中的锁:
1.8.1. 共享锁
共享锁和共享锁能够共存,共享锁和排他锁不能共存.
在非Serializable隔离级别下作查询不加任何锁,
在Serializable隔离级别下作查询加共享锁.性能
1.8.2. 排他锁
排他锁和共享锁不能共存,排他锁和排他锁也不能共存,在任何隔离级别下作增删改都加排他锁.
1.8.3. 可能的死锁
mysql能够自动检测到死锁,错误退出一方执行另外一方线程
1.9更新丢失问题~~~
1.9.1. 更新丢失问题的产生
两个并发的事务基于同一个查询结果进行修改,
后提交的事务忽略了先提交的事务对数据库的影响,形成了先提交的事务对数据库的影响丢失,
这个过程就叫作更新丢失。
乐观锁和悲观锁并非数据库中真实存在的锁,而是两种解决方案的名字。
(1)悲观锁:悲观的认为每一次修改,都会操做更新丢失的问题。
在查询时,手动的加排他锁,从而在查询时就排除可能的更新丢失。
select * from users for update;
(2)乐观锁:
在表中设计版本字段,在进行修改时修改时,要求根据具体版本进行修改,并将版本字段+1,
若是更新失败,说明更新丢失,须要从新进行更新。
#两种解决方案各有优缺点:
若是查询多修改少,用乐观锁.
若是修改多查询少,用悲观锁。
ThreadLocal(本地线程变量) ~~~
在线程内部保存数据,利用线程对象在线程执行的过程当中传递数据,另外因为每个线程保存各自
的数据,因此能够避免多线程并发安全的问题。
本质:是参数传递一种机制。
一、建立对象
private static ThreadLocal<Connection> tl = new ThreadLocal<Connection>(){
protected Connection initialValue() {
try {
return DaoUtils.getConn();
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
};
二、经常使用的方法
set(Object obj)
get()
initialValue()
public void remove()
注解~~~
反射注解
!!!动态代理