jdbc事務(wù)和之后的全部內(nèi)容_第1頁
jdbc事務(wù)和之后的全部內(nèi)容_第2頁
jdbc事務(wù)和之后的全部內(nèi)容_第3頁
jdbc事務(wù)和之后的全部內(nèi)容_第4頁
jdbc事務(wù)和之后的全部內(nèi)容_第5頁
已閱讀5頁,還剩22頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、總結(jié)今日內(nèi)容l 事務(wù)l 連接池l ThreadLocall BaseServlet自定義Servlet父類(只要求會(huì)用,不要求會(huì)寫)l DBUtils commons-dbutils事務(wù)l 事務(wù)的四大特性:ACID;l mysql中操作事務(wù)l jdbc中操作事務(wù)事務(wù)概述為了方便演示事務(wù),我們需要?jiǎng)?chuàng)建一個(gè)account表:CREATE TABLE account(id INT PRIMARY KEY AUTO_INCREMENT,NAME VARCHAR(30),balance NUMERIC(10.2);INSERT INTO account(NAME,balance) VALUES(zs,

2、100000);INSERT INTO account(NAME,balance) VALUES(ls, 100000);INSERT INTO account(NAME,balance) VALUES(ww, 100000);SELECT * FROM account;1什么是事務(wù)銀行轉(zhuǎn)賬!張三轉(zhuǎn)10000塊到李四的賬戶,這其實(shí)需要兩條SQL語句:l 給張三的賬戶減去10000元;l 給李四的賬戶加上10000元。如果在第一條SQL語句執(zhí)行成功后,在執(zhí)行第二條SQL語句之前,程序被中斷了(可能是拋出了某個(gè)異常,也可能是其他什么原因),那么李四的賬戶沒有加上10000元,而張三卻減去了1000

3、0元。這肯定是不行的!你現(xiàn)在可能已經(jīng)知道什么是事務(wù)了吧!事務(wù)中的多個(gè)操作,要么完全成功,要么完全失?。〔豢赡艽嬖诔晒σ话氲那闆r!也就是說給張三的賬戶減去10000元如果成功了,那么給李四的賬戶加上10000元的操作也必須是成功的;否則給張三減去10000元,以及給李四加上10000元都是失敗的!2事務(wù)的四大特性(ACID)面試!事務(wù)的四大特性是:l 原子性(Atomicity):事務(wù)中所有操作是不可再分割的原子單位。事務(wù)中所有操作要么全部執(zhí)行成功,要么全部執(zhí)行失敗。l 一致性其他特性都是為了這一特性服務(wù)的。(Consistency):事務(wù)執(zhí)行后,數(shù)據(jù)庫狀態(tài)與其它業(yè)務(wù)規(guī)則保持一致。如轉(zhuǎn)賬業(yè)務(wù),無

4、論事務(wù)執(zhí)行成功與否,參與轉(zhuǎn)賬的兩個(gè)賬號(hào)余額之和應(yīng)該是不變的。l 隔離性(Isolation):隔離性是指在并發(fā)操作中,不同事務(wù)之間應(yīng)該隔離開來,使每個(gè)并發(fā)中的事務(wù)不會(huì)相互干擾。l 持久性(Durability):一旦事務(wù)提交成功,事務(wù)中所有的數(shù)據(jù)操作都必須被持久化到數(shù)據(jù)庫中,即使提交事務(wù)后,數(shù)據(jù)庫馬上崩潰,在數(shù)據(jù)庫重啟時(shí),也必須能保證通過某種機(jī)制恢復(fù)數(shù)據(jù)。3MySQL中的事務(wù)在默認(rèn)情況下,MySQL每執(zhí)行一條SQL語句,都是一個(gè)單獨(dú)的事務(wù)。如果需要在一個(gè)事務(wù)中包含多條SQL語句,那么需要開啟事務(wù)和結(jié)束事務(wù)。l 開啟事務(wù):start transaction;l 結(jié)束事務(wù):commit或rollb

5、ack。在執(zhí)行SQL語句之前,先執(zhí)行strat transaction,這就開啟了一個(gè)事務(wù)(事務(wù)的起點(diǎn)),然后可以去執(zhí)行多條SQL語句,最后要結(jié)束事務(wù),commit表示提交,即事務(wù)中的多條SQL語句所做出的影響會(huì)持久化到數(shù)據(jù)庫中?;蛘遰ollback,表示回滾,即回滾到事務(wù)的起點(diǎn),之前做的所有操作都被撤消了!下面演示zs給li轉(zhuǎn)賬10000元的示例:START TRANSACTION;UPDATE account SET balance=balance-10000 WHERE id=1;UPDATE account SET balance=balance+10000 WHERE id=2;RO

6、LLBACK回滾結(jié)束,事務(wù)執(zhí)行失敗;START TRANSACTION;UPDATE account SET balance=balance-10000 WHERE id=1;UPDATE account SET balance=balance+10000 WHERE id=2;COMMIT提交結(jié)束,事務(wù)執(zhí)行成功;START TRANSACTION;UPDATE account SET balance=balance-10000 WHERE id=1;UPDATE account SET balance=balance+10000 WHERE id=2;quit退出,MySQL會(huì)自動(dòng)回滾事務(wù)。

7、;JDBC事務(wù)在jdbc中處理事務(wù),都是通過Connection完成的!同一事務(wù)中所有的操作,都在使用同一個(gè)Connection對(duì)象!1JDBC中的事務(wù)Connection的三個(gè)方法與事務(wù)相關(guān):l setAutoCommit(boolean):設(shè)置是否為自動(dòng)提交事務(wù),如果true(默認(rèn)值就是true)表示自動(dòng)提交,也就是每條執(zhí)行的SQL語句都是一個(gè)單獨(dú)的事務(wù),如果設(shè)置false,那么就相當(dāng)于開啟了事務(wù)了;con.setAutoCommit(false)表示開啟事務(wù)!l commit():提交結(jié)束事務(wù);mit();表示提交事務(wù)l rollback():回滾結(jié)束事務(wù)。con.rollback();

8、表示回滾事務(wù)jdbc處理事務(wù)的代碼格式:try con.setAutoCommit(false);/開啟事務(wù) . mit();/try的最后提交事務(wù) catch() con.rollback();/回滾事務(wù)public void transfer(boolean b) Connection con = null;PreparedStatement pstmt = null;try con = JdbcUtils.getConnection();/手動(dòng)提交con.setAutoCommit(false);設(shè)置為手動(dòng)提交事務(wù),即開啟了事務(wù)。String sql = update account s

9、et balance=balance+? where id=?;pstmt = con.prepareStatement(sql);/操作pstmt.setDouble(1, -10000);pstmt.setInt(2, 1);pstmt.executeUpdate();/ 在兩個(gè)操作中拋出異常if(b) throw new Exception();如果出現(xiàn)了異常就回滾結(jié)束事務(wù)pstmt.setDouble(1, 10000);pstmt.setInt(2, 2);pstmt.executeUpdate();/提交事務(wù)mit();當(dāng)兩個(gè)操作都執(zhí)行完了,提交結(jié)束事務(wù)。 catch(Except

10、ion e) /回滾事務(wù)if(con != null) try con.rollback();當(dāng)出現(xiàn)異常時(shí),回滾事務(wù)。 catch(SQLException ex) throw new RuntimeException(e); finally /關(guān)閉JdbcUtils.close(con, pstmt);2保存點(diǎn)Spring中的七種事務(wù)的傳播機(jī)制(了解)保存點(diǎn)是JDBC3.0的東西!當(dāng)要求數(shù)據(jù)庫服務(wù)器支持保存點(diǎn)方式的回滾。校驗(yàn)數(shù)據(jù)庫服務(wù)器是否支持保存點(diǎn)!boolean b = con.getMetaData().supportsSavepoints();保存點(diǎn)的作用是允許事務(wù)回滾到指定的保存點(diǎn)

11、位置。在事務(wù)中設(shè)置好保存點(diǎn),然后回滾時(shí)可以選擇回滾到指定的保存點(diǎn),而不是回滾整個(gè)事務(wù)!注意,回滾到指定保存點(diǎn)并沒有結(jié)束事務(wù)!只有回滾了整個(gè)事務(wù)才算是結(jié)束事務(wù)了!Connection類的設(shè)置保存點(diǎn),以及回滾到指定保存點(diǎn)方法:l 設(shè)置保存點(diǎn):Savepoint setSavepoint();l 回滾到指定保存點(diǎn):void rollback(Savepoint)。/* * 李四對(duì)張三說,如果你給我轉(zhuǎn)1W,我就給你轉(zhuǎn)100W。 * = * * 張三給李四轉(zhuǎn)1W(張三減去1W,李四加上1W) * 設(shè)置保存點(diǎn)! * 李四給張三轉(zhuǎn)100W(李四減去100W,張三加上100W) * 查看李四余額為負(fù)數(shù),那么回

12、滾到保存點(diǎn)。 * 提交事務(wù) */Testpublic void fun() Connection con = null;PreparedStatement pstmt = null;try con = JdbcUtils.getConnection();/手動(dòng)提交con.setAutoCommit(false);開始事務(wù)String sql = update account set balance=balance+? where name=?;pstmt = con.prepareStatement(sql);/操作1(張三減去1W)pstmt.setDouble(1, -10000);pst

13、mt.setString(2, zs);pstmt.executeUpdate();給張三減1萬/操作2(李四加上1W)pstmt.setDouble(1, 10000);pstmt.setString(2, ls);pstmt.executeUpdate();給李四加1萬/ 設(shè)置保存點(diǎn)Savepoint sp = con.setSavepoint();設(shè)置保存點(diǎn)/操作3(李四減去100W)pstmt.setDouble(1, -1000000);pstmt.setString(2, ls);pstmt.executeUpdate();給李四減支100萬/操作4(張三加上100W)pstmt.

14、setDouble(1, 1000000);pstmt.setString(2, zs);pstmt.executeUpdate();給張三加上100萬/操作5(查看李四余額)sql = select balance from account where name=?;pstmt = con.prepareStatement(sql);pstmt.setString(1, ls);ResultSet rs = pstmt.executeQuery();rs.next();double balance = rs.getDouble(1);查看李四余額/如果李四余額為負(fù)數(shù),那么回滾到指定保存點(diǎn)if

15、(balance 0) con.rollback(sp);發(fā)現(xiàn)李四余額小于0,回滾到指定還原點(diǎn)!即撤銷了李四給張三轉(zhuǎn)賬100萬的操作System.out.println(張三,你上當(dāng)了!);/提交事務(wù)mit()注意,一定要提交事務(wù),因?yàn)榛貪L到指定保存點(diǎn)不會(huì)結(jié)束事務(wù)!保存點(diǎn)之前的操作沒有被回滾,只能提交了才能真正把沒有回滾的操作執(zhí)行了。; catch(Exception e) /回滾事務(wù)if(con != null) try con.rollback(); catch(SQLException ex) throw new RuntimeException(e); finally /關(guān)閉JdbcU

16、tils.close(con, pstmt);事務(wù)隔離級(jí)別1 事務(wù)的并發(fā)讀問題l 臟讀不能允許出來的事情?。鹤x取到另一個(gè)事務(wù)未提交數(shù)據(jù);l 不可重復(fù)讀:兩次讀取不一致;l 幻讀(虛讀):讀到另一事務(wù)已提交數(shù)據(jù)。2并發(fā)事務(wù)問題因?yàn)椴l(fā)事務(wù)導(dǎo)致的問題大致有5類,其中兩類是更新問題,三類是讀問題。l 臟讀(dirty read):讀到另一個(gè)事務(wù)的未提交更新數(shù)據(jù),即讀取到了臟數(shù)據(jù);l 不可重復(fù)讀(unrepeatable read):對(duì)同一記錄的兩次讀取不一致,因?yàn)榱硪皇聞?wù)對(duì)該記錄做了修改;l 幻讀(虛讀)(phantom read):對(duì)同一張表的兩次查詢不一致,因?yàn)榱硪皇聞?wù)插入了一條記錄;臟讀 事務(wù)

17、1:張三給李四轉(zhuǎn)賬100元事務(wù)2:李四查看自己的賬戶l t1:事務(wù)1:開始事務(wù)l t2:事務(wù)1:張三給李四轉(zhuǎn)賬100元l t3:事務(wù)2:開始事務(wù)l t4:事務(wù)2:李四查看自己的賬戶,看到賬戶多出100元(臟讀)l t5:事務(wù)2:提交事務(wù)l t6:事務(wù)1:回滾事務(wù),回到轉(zhuǎn)賬之前的狀態(tài)不可重復(fù)讀事務(wù)1:酒店查看兩次1048號(hào)房間狀態(tài)事務(wù)2:預(yù)訂1048號(hào)房間l t1:事務(wù)1:開始事務(wù)l t2:事務(wù)1:查看1048號(hào)房間狀態(tài)為空閑l t3:事務(wù)2:開始事務(wù)l t4:事務(wù)2:預(yù)定1048號(hào)房間l t5:事務(wù)2:提交事務(wù)l t6:事務(wù)1:再次查看1048號(hào)房間狀態(tài)為使用l t7:事務(wù)1:提交事務(wù)對(duì)同一記

18、錄的兩次查詢結(jié)果不一致!幻讀事務(wù)1:對(duì)酒店房間預(yù)訂記錄兩次統(tǒng)計(jì)事務(wù)2:添加一條預(yù)訂房間記錄l t1:事務(wù)1:開始事務(wù)l t2:事務(wù)1:統(tǒng)計(jì)預(yù)訂記錄100條l t3:事務(wù)2:開始事務(wù)l t4:事務(wù)2:添加一條預(yù)訂房間記錄l t5:事務(wù)2:提交事務(wù)l t6:事務(wù)1:再次統(tǒng)計(jì)預(yù)訂記錄為101記錄l t7:事務(wù)1:提交對(duì)同一表的兩次查詢不一致!不可重復(fù)讀和幻讀的區(qū)別:l 不可重復(fù)讀是讀取到了另一事務(wù)的更新;l 幻讀是讀取到了另一事務(wù)的插入(MySQL中無法測試到幻讀);3四大隔離級(jí)別 4個(gè)等級(jí)的事務(wù)隔離級(jí)別,在相同數(shù)據(jù)環(huán)境下,使用相同的輸入,執(zhí)行相同的工作,根據(jù)不同的隔離級(jí)別,可以導(dǎo)致不同的結(jié)果。不同

19、事務(wù)隔離級(jí)別能夠解決的數(shù)據(jù)并發(fā)問題的能力是不同的。1SERIALIZABLE(串行化)三種讀問題都能處理l 不會(huì)出現(xiàn)任何并發(fā)問題,因?yàn)樗菍?duì)同一數(shù)據(jù)的訪問是串行的,非并發(fā)訪問的;l 性能最差;2REPEATABLE READ臟讀、不可重復(fù)讀,不能處理幻讀(可重復(fù)讀)(MySQL)l 防止臟讀和不可重復(fù)讀,不能處理幻讀問題;l 性能比SERIALIZABLE好3READ COMMITTED只能處理臟讀,不能處理不可重復(fù)讀和幻讀。(讀已提交數(shù)據(jù))(Oracle)l 防止臟讀,沒有處理不可重復(fù)讀,也沒有處理幻讀;l 性能比REPEATABLE READ好4READ UNCOMMITTED啥也不處理!

20、(讀未提交數(shù)據(jù))l 可能出現(xiàn)任何事務(wù)并發(fā)問題l 性能最好MySQL的默認(rèn)隔離級(jí)別為REPEATABLE READ,這是一個(gè)很不錯(cuò)的選擇吧!5MySQL隔離級(jí)別MySQL的默認(rèn)隔離級(jí)別為Repeatable read,可以通過下面語句查看:select tx_isolation也可以通過下面語句來設(shè)置當(dāng)前連接的隔離級(jí)別:set transaction isolationlevel 4先16JDBC設(shè)置隔離級(jí)別con. setTransactionIsolation(int level)參數(shù)可選值如下:l Connection.TRANSACTION_READ_UNCOMMITTED;l Conn

21、ection.TRANSACTION_READ_COMMITTED;l Connection.TRANSACTION_REPEATABLE_READ;l Connection.TRANSACTION_SERIALIZABLE。事務(wù)總結(jié):l 事務(wù)的特性:ACID;l 事務(wù)開始邊界與結(jié)束邊界:開始邊界(con.setAutoCommit(false)),結(jié)束邊界(mit()或con.rollback());l 事務(wù)的隔離級(jí)別: READ_UNCOMMITTED、READ_COMMITTED、REPEATABLE_READ、SERIALIZABLE。多個(gè)事務(wù)并發(fā)執(zhí)行時(shí)才需要考慮并發(fā)事務(wù)。數(shù)據(jù)庫連接池

22、池參數(shù)(所有池參數(shù)都有默認(rèn)值):初始大小:10個(gè)最小空閑連接數(shù):3個(gè)增量:一次創(chuàng)建的最小單位(5個(gè))最大空閑連接數(shù):12個(gè)最大連接數(shù):20個(gè)最大的等待時(shí)間:1000毫秒四大連接參數(shù)連接池也是使用四大連接參數(shù)來完成創(chuàng)建連接對(duì)象!實(shí)現(xiàn)的接口連接池必須實(shí)現(xiàn):javax.sql.DataSource接口!連接池返回的Connection對(duì)象,它的close()方法與眾不同!調(diào)用它的close()不是關(guān)閉,而是把連接歸還給池!數(shù)據(jù)庫連接池1數(shù)據(jù)庫連接池的概念用池來管理Connection,這可以重復(fù)使用Connection。有了池,所以我們就不用自己來創(chuàng)建Connection,而是通過池來獲取Conne

23、ction對(duì)象。當(dāng)使用完Connection后,調(diào)用Connection的close()方法也不會(huì)真的關(guān)閉Connection,而是把Connection“歸還”給池。池就可以再利用這個(gè)Connection對(duì)象了。2JDBC數(shù)據(jù)庫連接池接口(DataSource)Java為數(shù)據(jù)庫連接池提供了公共的接口:javax.sql.DataSource,各個(gè)廠商可以讓自己的連接池實(shí)現(xiàn)這個(gè)接口。這樣應(yīng)用程序可以方便的切換不同廠商的連接池!3自定義連接池(ItcastPool)分析:ItcastPool需要有一個(gè)List,用來保存連接對(duì)象。在ItcastPool的構(gòu)造器中創(chuàng)建5個(gè)連接對(duì)象放到List中!當(dāng)用

24、人調(diào)用了ItcastPool的getConnection()時(shí),那么就從List拿出一個(gè)返回。當(dāng)List中沒有連接可用時(shí),拋出異常。我們需要對(duì)Connection的close()方法進(jìn)行增強(qiáng),所以我們需要自定義ItcastConnection類,對(duì)Connection進(jìn)行裝飾!即對(duì)close()方法進(jìn)行增強(qiáng)。因?yàn)樾枰谡{(diào)用close()方法時(shí)把連接“歸還”給池,所以ItcastConnection類需要擁有池對(duì)象的引用,并且池類還要提供“歸還”的方法。ItcastPool.javapublic class ItcastPool implements DataSource 實(shí)現(xiàn)DataSourc

25、e接口private static Properties props = new Properties();private List list 用來存放連接的list= new ArrayList();static 加載配置文件中的配置信息到props屬性中InputStream in = ItcastPool.class.getClassLoader().getResourceAsStream(perties);try props.load(in);Class.forName(props.getProperty(driverClassName); catch (Exc

26、eption e) throw new RuntimeException(e);public ItcastPool構(gòu)造器中向list中存放5個(gè)連接對(duì)象() throws SQLException for (int i = 0; i 0) return list.remove(0);throw new SQLException(沒連接了); .省略了DataSource中其他沒有的方法。ItcastConnection.javapublic class ItcastConnection extends ConnectionWrapperConnectionWrapper是Connection的裝

27、飾模板類!這個(gè)類要自己提供! private ItcastPool pool;public ItcastConnection(Connection con, ItcastPool pool) super(con);this.pool = pool本類需要擁有池對(duì)象的引用,用來歸還連接。;Overridepublic void close當(dāng)程序調(diào)用了close()方法時(shí),把當(dāng)前連接對(duì)象添加到池中。() throws SQLException pool.add(this);DBCP1什么是DBCP?DBCP是Apache提供的一款開源免費(fèi)的數(shù)據(jù)庫連接池!Hibernate3.0之后不再對(duì)DBCP提

28、供支持!因?yàn)镠ibernate聲明DBCP有致命的缺欠!DBCP因?yàn)镠ibernate的這一毀謗很是生氣,并且說自己沒有缺欠。2DBCP的使用public void fun1() throws SQLException BasicDataSource ds = new BasicDataSource();ds.setUsername(root);ds.setPassword(123);ds.setUrl(jdbc:mysql:/localhost:3306/mydb1);ds.setDriverClassName(com.mysql.jdbc.Driver);基本配置ds.setMaxActi

29、ve(20);最大連接數(shù)ds.setMaxIdle(10);最大空閑連接數(shù)ds.setInitialSize(10)初始化連接數(shù);ds.setMinIdle(2)最小空閑連接數(shù);ds.setMaxWait(1000)最大等待毫秒數(shù);Connection con = ds.getConnection();System.out.println(con.getClass().getName();con.close()關(guān)閉連接只是把連接歸還給池!;3DBCP的配置信息下面是對(duì)DBCP的配置介紹:#基本配置driverClassName=com.mysql.jdbc.Driverurl=jdbc:mys

30、ql:/localhost:3306/mydb1username=rootpassword=123#初始化池大小,即一開始池中就會(huì)有10個(gè)連接對(duì)象默認(rèn)值為0initialSize=0#最大連接數(shù),如果設(shè)置maxActive=50時(shí),池中最多可以有50個(gè)連接,當(dāng)然這50個(gè)連接中包含被使用的和沒被使用的(空閑)#你是一個(gè)包工頭,你一共有50個(gè)工人,但這50個(gè)工人有的當(dāng)前正在工作,有的正在空閑#默認(rèn)值為8,如果設(shè)置為非正數(shù),表示沒有限制!即無限大maxActive=8#最大空閑連接#當(dāng)設(shè)置maxIdle=30時(shí),你是包工頭,你允許最多有20個(gè)工人空閑,如果現(xiàn)在有30個(gè)空閑工人,那么要開除10個(gè)#默認(rèn)

31、值為8,如果設(shè)置為負(fù)數(shù),表示沒有限制!即無限大maxIdle=8#最小空閑連接#如果設(shè)置minIdel=5時(shí),如果你的工人只有3個(gè)空閑,那么你需要再去招2個(gè)回來,保證有5個(gè)空閑工人#默認(rèn)值為0minIdle=0#最大等待時(shí)間#當(dāng)設(shè)置maxWait=5000時(shí),現(xiàn)在你的工作都出去工作了,又來了一個(gè)工作,需要一個(gè)工人。#這時(shí)就要等待有工人回來,如果等待5000毫秒還沒回來,那就拋出異常#沒有工人的原因:最多工人數(shù)為50,已經(jīng)有50個(gè)工人了,不能再招了,但50人都出去工作了。#默認(rèn)值為-1,表示無限期等待,不會(huì)拋出異常。maxWait=-1#連接屬性#就是原來放在url后面的參數(shù),可以使用conne

32、ctionProperties來指定#如果已經(jīng)在url后面指定了,那么就不用在這里指定了。#useServerPrepStmts=true,MySQL開啟預(yù)編譯功能#cachePrepStmts=true,MySQL開啟緩存PreparedStatement功能,#prepStmtCacheSize=50,緩存PreparedStatement的上限#prepStmtCacheSqlLimit=300,當(dāng)SQL模板長度大于300時(shí),就不再緩存它c(diǎn)onnectionProperties=useUnicode=true;characterEncoding=UTF8;useServerPrepStm

33、ts=true;cachePrepStmts=true;prepStmtCacheSize=50;prepStmtCacheSqlLimit=300#連接的默認(rèn)提交方式#默認(rèn)值為truedefaultAutoCommit=true#連接是否為只讀連接#Connection有一對(duì)方法:setReadOnly(boolean)和isReadOnly()#如果是只讀連接,那么你只能用這個(gè)連接來做查詢#指定連接為只讀是為了優(yōu)化!這個(gè)優(yōu)化與并發(fā)事務(wù)相關(guān)!#如果兩個(gè)并發(fā)事務(wù),對(duì)同一行記錄做增、刪、改操作,是不是一定要隔離它們?。?如果兩個(gè)并發(fā)事務(wù),對(duì)同一行記錄只做查詢操作,那么是不是就不用隔離它們了?#如

34、果沒有指定這個(gè)屬性值,那么是否為只讀連接,這就由驅(qū)動(dòng)自己來決定了。即Connection的實(shí)現(xiàn)類自己來決定!defaultReadOnly=false#指定事務(wù)的事務(wù)隔離級(jí)別#可選值:NONE,READ_UNCOMMITTED, READ_COMMITTED, REPEATABLE_READ, SERIALIZABLE#如果沒有指定,那么由驅(qū)動(dòng)中的Connection實(shí)現(xiàn)類自己來決定defaultTransactionIsolation=REPEATABLE_READC3P01C3P0簡介C3P0也是開源免費(fèi)的連接池!C3P0被很多人看好!2C3P0的使用C3P0中池類是:ComboPoole

35、dDataSource。public void fun1() throws PropertyVetoException, SQLException ComboPooledDataSource ds = new ComboPooledDataSource();ds.setJdbcUrl(jdbc:mysql:/localhost:3306/mydb1);ds.setUser(root);ds.setPassword(123);ds.setDriverClass(com.mysql.jdbc.Driver);基本配置ds.setAcquireIncrement(5)每次的增量為5;ds.setIn

36、itialPoolSize(20)初始化連接數(shù);ds.setMinPoolSize(2)最少連接數(shù);ds.setMaxPoolSize(50)最多連接數(shù);Connection con = ds.getConnection();System.out.println(con);con.close();配置文件要求:l 文件名稱:必須叫c3p0-config.xmll 文件位置:必須在src下c3p0也可以指定配置文件,而且配置文件可以是properties,也可騍xml的。當(dāng)然xml的高級(jí)一些了。但是c3p0的配置文件名必須為c3p0-config.xml,并且必須放在類路徑下。默認(rèn)配置jdbc:

37、mysql:/localhost:3306/mydb1com.mysql.jdbc.Driverroot123310210命名配置jdbc:mysql:/localhost:3306/mydb1com.mysql.jdbc.Driverroot123310210c3p0的配置文件中可以配置多個(gè)連接信息,可以給每個(gè)配置起個(gè)名字,這樣可以方便的通過配置名稱來切換配置信息。上面文件中默認(rèn)配置為mysql的配置,名為oracle-config的配置也是mysql的配置,呵呵。public void fun2() throws PropertyVetoException, SQLException Co

38、mboPooledDataSource ds = new ComboPooledDataSource();不用定配置文件名稱,因?yàn)榕渲梦募仨毷莄3p0-config.xml,這里使用的是默認(rèn)配置。Connection con = ds.getConnection();System.out.println(con);con.close();public void fun2() throws PropertyVetoException, SQLException ComboPooledDataSource ds = new ComboPooledDataSource(orcale-config

39、)使用名為oracle-config的配置。;Connection con = ds.getConnection();System.out.println(con);con.close();Tomcat配置連接池1Tomcat配置JNDI資源JNDI(Java Naming and Directory Interface),Java命名和目錄接口。JNDI的作用就是:在服務(wù)器上配置資源,然后通過統(tǒng)一的方式來獲取配置的資源。我們這里要配置的資源當(dāng)然是連接池了,這樣項(xiàng)目中就可以通過統(tǒng)一的方式來獲取連接池對(duì)象了。下圖是Tomcat文檔提供的:配置JNDI資源需要到元素中配置子元素:l name:指定

40、資源的名稱,這個(gè)名稱可以隨便給,在獲取資源時(shí)需要這個(gè)名稱;l factory:用來創(chuàng)建資源的工廠,這個(gè)值基本上是固定的,不用修改;l type:資源的類型,我們要給出的類型當(dāng)然是我們連接池的類型了;l bar:表示資源的屬性,如果資源存在名為bar的屬性,那么就配置bar的值。對(duì)于DBCP連接池而言,你需要配置的不是bar,因?yàn)樗鼪]有bar這個(gè)屬性,而是應(yīng)該去配置url、username等屬性。 2獲取資源配置資源的目的當(dāng)然是為了獲取資源了。只要你啟動(dòng)了Tomcat,那么就可以在項(xiàng)目中任何類中通過JNDI獲取資源的方式來獲取資源了。下圖是Tomcat文檔提供的,與上面Tomcat文檔提供的配置

41、資源是對(duì)應(yīng)的。獲取資源:l Context:javax.naming.Context;l InitialContext:javax.naming.InitialContext;l lookup(String):獲取資源的方法,其中”java:comp/env”是資源的入口(這是固定的名稱),獲取過來的還是一個(gè)Context,這說明需要在獲取到的Context上進(jìn)一步進(jìn)行獲取。”bean/MyBeanFactory”對(duì)應(yīng)中配置的name值,這回獲取的就是資源對(duì)象了。 Context cxt = new InitialContext(); DataSource ds = (DataSource)c

42、xt.lookup(java:/comp/env/mydbcp); Connection con = ds.getConnection(); System.out.println(con); con.close(); Context cxt = new InitialContext(); Context envCxt = (Context)cxt.lookup(java:/comp/env); DataSource ds = (DataSource)env.lookup(mydbcp); Connection con = ds.getConnection(); System.out.print

43、ln(con); con.close();上面兩種方式是相同的效果。修改JdbcUtils因?yàn)橐呀?jīng)學(xué)習(xí)了連接池,那么JdbcUtils的獲取連接對(duì)象的方法也要修改一下了。JdbcUtils.javapublic class JdbcUtils private static DataSource dataSource = new ComboPooledDataSource();public static DataSource getDataSource() return dataSource;public static Connection getConnection() try return

44、dataSource.getConnection(); catch (Exception e) throw new RuntimeException(e);ThreadLocalThread 人類Runnable 任務(wù)類keyvaluethread1aaathread2bbbthread3ccc1ThreadLocal APIThreadLocal類只有三個(gè)方法:l void set(T value):保存值;l T get():獲取值;l void remove():移除值。2ThreadLocal的內(nèi)部是MapThreadLocal內(nèi)部其實(shí)是個(gè)Map來保存數(shù)據(jù)。雖然在使用ThreadLoc

45、al時(shí)只給出了值,沒有給出鍵,其實(shí)它內(nèi)部使用了當(dāng)前線程做為鍵。class MyThreadLocal private Map map = new HashMap();public void set(T value) map.put(Thread.currentThread(), value);public void remove() map.remove(Thread.currentThread();public T get() return map.get(Thread.currentThread();BaseServlet1BaseServlet的作用在開始客戶管理系統(tǒng)之前,我們先寫一個(gè)工具類:BaseServlet。我們知道,寫一個(gè)項(xiàng)目可能會(huì)出現(xiàn)N多個(gè)Servlet,而且一般一個(gè)Servlet只有一個(gè)方法(doGet或doPost),如果項(xiàng)目大一些,那么Servlet的數(shù)量就會(huì)很驚人。為了避免Servlet的“膨脹”,我們寫一個(gè)BaseServlet。它的作用是讓一個(gè)Servlet可以處理多種不同的請(qǐng)求。不同的請(qǐng)求調(diào)用Servlet的不同方法。我們寫好了BaseServlet后,讓其他Servlet繼承BaseServlet,例如CustomerServlet繼承BaseServlet,然后在

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論