1. JDBC介紹
JDBC全稱為:Java DataBase Connectivity(java數據庫連接)。SUN公司為了簡化、統一對數據庫的操作,定義了一套Java操作數據庫的規范,稱之為JDBC。見圖:

2.JDBC開發步驟
@Test
public void testJDBC() {
Connection conn = null;
PreparedStatement prestmt = null;
ResultSet rs = null;
try {
// 注冊驅動
Class.forName("com.mysql.jdbc.Driver");
// 獲取連接
conn = DriverManager.getConnection("jdbc:mysql:///day17", "root","admin");
//執行SQL語句
prestmt = conn.prepareStatement("select * from user where id = ?");
prestmt.setString(1, "1");
rs = prestmt.executeQuery();
while (rs.next()) {
System.out.println(rs);
String name = rs.getString("name");
System.out.println("name = " + name);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
//釋放資源
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (prestmt != null) {
try {
prestmt.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
3. 事務具有什么特性?
原子性:事務事務是一個不可分割的工作單位,事務中的操作要么都發生,要么都不發生
一致性:事務前后數據的完整性必須保持一致
隔離性:事務的隔離性是指多個用戶並發訪問數據庫時,一個用戶的事務不能被其它用戶的事務所干擾,多個並發事務的數據要相互隔離.
持久性:持久性一個事務一旦被提交,它的數據庫中數據的改變就是永久性的,然后即使數據庫發生故障也不對其他有任何影響.
4. 事物操作的關鍵字
l 手動的開啟事務: start transaction
l 手動提交事務: commit ----- 表示確認 開啟事務后 的若干步操作, 在commit 之后, 那么數據就真的持久化到硬盤上了
l 手動回滾事務: rollback --------- 表示在開啟事務后, 中間進行了若干步操作, 如果出現時了異常, 那么回滾事務,這個時候數據不會真的持久化到硬盤上
這幾個特性中,最最重要的, 是隔離性, 通常會有程序的多線程並發, 那么在並發訪問的時候,最終操作了數據庫中的數據,
如果同時操作的是同一張表的同一行記錄, 就肯定事務的隔離性問題了.
5. 什么是事務的隔離性? 如果不考慮隔離性,會引發哪幾類問題?
事務的隔離性:是指多個用戶並發訪問數據庫時,一個用戶的事務不能被其它用戶的事務所干擾,多個並發事務的數據要相互隔離.
會發生三類問題:
第一類:臟讀,一個事務讀到其它事務未提交的數據
第二類:不可重復讀,一個事務讀到其他事務已經提交的數據,強調的是使用update語句對原有的記錄進行更改
第三類:虛讀,幻讀.一個事務讀到其他事務已經提交的數據,強調的是使用insert語句對表格的數據插入操作,發生概率較小.
不可重復讀:是指在一個事務內,多次讀同一數據。在這個事務還沒有結束時,另外一個事務也訪問該同一數據。那么,在第一個事務中的兩次讀數據之間,由於第二個事務的修改,那么第一個事務兩次讀到的的數據可能是不一樣的。這樣在一個事務內兩次讀到的數據是不一樣的,因此稱為是不可重復讀。
e.g.
1.在事務1中,Mary 讀取了自己的工資為1000,操作並沒有完成
2.在事務2中,這時財務人員修改了Mary的工資為2000,並提交了事務.
3.在事務1中,Mary 再次讀取自己的工資時,工資變為了2000
解決辦法:如果只有在修改事務完全提交之后才可以讀取數據,則可以避免該問題。
幻讀 : 是指當事務不是獨立執行時發生的一種現象,例如第一個事務對一個表中的數據進行了修改,這種修改涉及到表中的全部數據行。同時,第二個事務也修改這個表中的數據,這種修改是向表中插入一行新數據。那么,以后就會發生操作第一個事務的用戶發現表中還有沒有修改的數據行,就好象發生了幻覺一樣。
e.g.
目前工資為1000的員工有10人。
1.事務1,讀取所有工資為1000的員工。
2.這時事務2向employee表插入了一條員工記錄,工資也為1000
3.事務1再次讀取所有工資為1000的員工 共讀取到了11條記錄,
解決辦法:如果在操作事務完成數據處理之前,任何其他事務都不可以添加新數據,則可避免該問題
6. 為什么要使用數據庫連接池?
一次性批量的制造一些連接Connection對象放到連接池中, 要使用的時候就從這個池子中取出一個連接使用,當用完不再需要使用的時候,
再將連接放回到池子中, 這樣就可以在其他的程序要使用連接的時候可以達到復用連接,避免了不斷的創建連接,關閉連接, 從而達到了優化.
7. 請列舉出至少兩種開源的數據庫連接池技術?
C3P0
C3P0是一個開源的JDBC連接池,它實現了數據源和JNDI綁定,支持JDBC3規范和JDBC2的標准擴展。目前使用它的開源項目有Hibernate,Spring等。
c3p0所需jar:c3p0-0.9.2.1.jar mchange-commons-java-0.2.3.4.jar
DBCP
DBCP(DataBase connection pool),數據庫連接池。是 apache 上的一個 java 連接池項目,也是 tomcat 使用的連接池組件。
使用dbcp需要2個包:commons-dbcp.jar,commons-pool.jar由於建立數據庫連接是一個非常耗時耗資源的行為,所以通過連接池預先同數據庫建立一些連接,放在內存中,應用程序需要建立數據庫連接時直接到連接池中申請一個就行,用完后再放回去。
Proxool
Proxool是一種Java數據庫連接池技術。sourceforge下的一個開源項目,這個項目提供一個健壯、易用的連接池,最為關鍵的是這個連接池提供監控的功能,方便易用,便於發現連接泄漏的情況。
Hibernate官方宣布由於Bug太多不再支持DBCP,而推薦使用 Proxool或C3P0。
從性能和出錯率來說,proxool稍微比前兩種好些,但是使用者貌似較少。
c3p0與dbcp區別
dbcp沒有自動回收空閑連接的功能
c3p0有自動回收空閑連接功能
8. JNDI
NDI(Java Naming and Directory Interface),Java命名和目錄接口,它對應於J2SE中的javax.naming包,這 套API的主要作用在於:它可以把Java對象放在一個容器中(JNDI容器),並為容器中的java對象取一個名稱,以后程序想獲得Java對象,只需 通過名稱檢索即可。其核心API為Context,它代表JNDI容器,其lookup方法為檢索容器中對應名稱的對象。
