標籤:rac ted form 單位 利用 檢測 可重複 欄位 工作
11、檔案上傳~~~
Apache提供Commons-FileUpload
SmartUpload
Struts2檔案上傳
步驟一:form表單使用post提交,並且表單添加 enctype="multipart/form-data",
實現多媒體封裝。
表單項中<input type="file" name="myFile" >,file表單項必須有name屬性,否則不會上傳。
步驟二:開發後天程式處理檔案上傳的資料。
可以使用Apache提供Commons-FileUpload來完成檔案的上傳
2、檔案儲存的位置
3.防止上傳的檔案重名覆蓋
4.防止同一個目錄下上傳檔案過多
12、分頁(帶有查詢條件)~~~
13、事務
事務的四大特性 ~
事務的四大特性是事務本身具有的特點。簡稱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 > Serializable
資料庫中的鎖:
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(本地線程變數) ~~~
線上程內部儲存資料,利用線程對象線上程執行的過程中傳遞資料,另外由於每一個線程儲存各自
的資料,所以可以避免多線程並發安全的問題。
本質:是參數傳遞一種機制。
1、建立對象
private static ThreadLocal<Connection> tl = new ThreadLocal<Connection>(){
protected Connection initialValue() {
try {
return DaoUtils.getConn();
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
};
2、常用的方法
set(Object obj)
get()
initialValue()
public void remove()
註解~~~
反射註解
!!!動態代理
java-web複習階段2