日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

DataSource

發(fā)布時(shí)間:2023/12/20 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 DataSource 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
一、DataSource接口是一個(gè)更好的連接數(shù)據(jù)源的方法:
  JDBC1.0是原來是用DriverManager類來產(chǎn)生一個(gè)對數(shù)據(jù)源的連接。JDBC2.0用一種替代的方法,使用DataSource的實(shí)現(xiàn),代碼變的更小巧精致,也更容易控制。
  一個(gè)DataSource對象代表了一個(gè)真正的數(shù)據(jù)源。根據(jù)DataSource的實(shí)現(xiàn)方法,數(shù)據(jù)源既可以是從關(guān)系數(shù)據(jù)庫,也電子表格,還可以是一個(gè)表格形式的文件。當(dāng)一個(gè)DataSource對象注冊到名字服務(wù)中,應(yīng)用程序就可以通過名字服務(wù)獲得DataSource對象,并用它來產(chǎn)生一個(gè)與DataSource代表的數(shù)據(jù)源之間的連接。
  關(guān)于數(shù)據(jù)源的信息和如何來定位數(shù)據(jù)源,例如數(shù)據(jù)庫服務(wù)器的名字,在哪臺(tái)機(jī)器上,端口號等等,都包含在DataSource對象的屬性里面去了。這樣,對應(yīng)用程序的設(shè)計(jì)來說是更方便了,因?yàn)椴⒉恍枰残缘陌羊?qū)動(dòng)的名字寫死到程序里面去。通常驅(qū)動(dòng)名字中都包含了驅(qū)動(dòng)提供商的名字,而在DriverManager類中通常是這么做的。如果數(shù)據(jù)源要移植到另一個(gè)數(shù)據(jù)庫驅(qū)動(dòng)中,代碼也很容易做修改。所需要做的修改只是更改DataSource的相關(guān)的屬性。而使用DataSource對象的代碼不需要做任何改動(dòng)。
  由系統(tǒng)管理員或者有相應(yīng)權(quán)限的人來配置DataSource對象。配置DataSource,包括設(shè)定DataSource的屬性,然后將它注冊到JNDI名字服務(wù)中去。在注冊DataSource對象的的過程中,系統(tǒng)管理員需要把DataSource對象和一個(gè)邏輯名字關(guān)聯(lián)起來。名字可以是任意的,通常取成能代表數(shù)據(jù)源并且容易記住的名字。在下面的例子中,名字起為:InventoryDB,按照慣例,邏輯名字通常都在jdbc的子上下文中。這樣,邏輯名字的全名就是:jdbc/ InventoryDB。
  一旦配置好了數(shù)據(jù)源對象,應(yīng)用程序設(shè)計(jì)者就可以用它來產(chǎn)生一個(gè)與數(shù)據(jù)源的連接。下面的代碼片段示例了如何用JNDI上下文獲得一個(gè)一個(gè)數(shù)據(jù)源對象,然后如何用數(shù)據(jù)源對象產(chǎn)生一個(gè)與數(shù)據(jù)源的連接。開始的兩行用的是JNDI API,第三行用的才是JDBC的API:
   Context ctx = new InitialContext(); DataSource ds = (DataSource)ctx.lookup("jdbc/InventoryDB");Connection con = ds.getConnection("myPassword", "myUserName");
  在一個(gè)基本的DataSource實(shí)現(xiàn)中,DataSource.getConnection方法返回的Connection對象和用DriverManager.getConnection方法返回的Connection對象是一樣的。因?yàn)镈ataSource提供的方便性,我們推薦使用DataSource對象來得到一個(gè)Connection對象。我們希望所以的基于JDBC2.0技術(shù)的數(shù)據(jù)庫驅(qū)動(dòng)都包含一個(gè)基本的DataSource的實(shí)現(xiàn),這樣就可以在應(yīng)用程序中很容易的使用它。
  對于普通的應(yīng)用程序設(shè)計(jì)者,是否使用DataSource對象只是一個(gè)選擇問題。但是,對于那些需要用的連接池或者分布式的事務(wù)的應(yīng)用程序設(shè)計(jì)者來說,就必須使用DataSource對象來獲得Connection,原因在下面我們會(huì)提到。
?? 二、Connection pooling(連接池):
  連接池是這么一種機(jī)制,當(dāng)應(yīng)用程序關(guān)閉一個(gè)Connection的時(shí)候,這個(gè)連接被回收,而不是被destroy,因?yàn)榻⒁粋€(gè)連接是一個(gè)很費(fèi)資源的操作。如果能把回收的連接重新利用,會(huì)減少新創(chuàng)建連接的數(shù)目,顯著的提高運(yùn)行的性能。
  假設(shè)應(yīng)用程序需要建立到一個(gè)名字為EmpolyeeDB的DataSource的連接。使用連接池得到連接的代碼如下:
   Context ctx = new InitialContext(); DataSource ds = (DataSource)ctx.lookup("jdbc/EmployeeDB");Connection con = ds.getConnection("myPassword", "myUserName");除了邏輯名字以外,我們發(fā)現(xiàn)其代碼和上面舉的例子的代碼是一樣的。邏輯名字不同,就可以連接到不同的數(shù)據(jù)庫。DataSource對象的getConnection方法返回的Connection是否是一個(gè)連接池中的連接完全取決于DataSource對象的實(shí)現(xiàn)方法。如果DataSource對象實(shí)現(xiàn)與一個(gè)支持連接池的中間層的服務(wù)器一起工作,DataSource對象就會(huì)自動(dòng)的返回連接池中的連接,這個(gè)連接也是可以重復(fù)利用的。
  是否使用連接池獲得一個(gè)連接,在應(yīng)用程序的代碼上是看不出不同的。在使用這個(gè)Connection連接上也沒有什么不一樣的地方,唯一的不同是在java的finally語句塊中來關(guān)閉一個(gè)連接。在finally中關(guān)閉連接是一個(gè)好的編程習(xí)慣。這樣,即使方法拋出異常,Connection也會(huì)被關(guān)閉并回收到連接池中去。代碼應(yīng)該如下所示:
  try{…
  }catch(){…
  }finally{ if(con!=null)con.close();}
  三、分布式事務(wù):
  獲得一個(gè)用來支持分布式事務(wù)的連接與獲得連接池中的連接是很相似的。同樣,不同之處在于DataSource的實(shí)現(xiàn)上的不同,而不是在應(yīng)用程序中獲得連接的方式上有什么不同。假設(shè)DataSource的實(shí)現(xiàn)可以與支持分布式事務(wù)中間層服務(wù)器一起工作,得到連接的代碼還是如下所示:
   Context ctx = new InitialContext(); DataSource ds = (DataSource)ctx.lookup("jdbc/EmployeeDB"); Connection con = ds.getConnection("myPassword", "myUserName");由于性能上的原因,如果一個(gè)DataSource能夠支持分布式的事務(wù),它同樣也可以支持連接池管理。
  從應(yīng)用程序設(shè)計(jì)者的觀點(diǎn)來看。是否支持分布式的事務(wù)的連接對它來說沒什么不同,唯一的不同是在事務(wù)的邊界上(開始一個(gè)事務(wù)的地方和結(jié)束一個(gè)事務(wù)的地方),開始一個(gè)事務(wù)或者結(jié)束一個(gè)事務(wù)都是由事務(wù)服務(wù)器來控制的。應(yīng)用程序不應(yīng)該做任何可能妨礙服務(wù)的事情。應(yīng)用程序不能夠直接調(diào)用事務(wù)提交commit或者回滾rollback操作,也不能夠使用事務(wù)的自動(dòng)提交模式auto-commit mode(在數(shù)據(jù)庫操作完成的時(shí)候自動(dòng)的調(diào)用commit或者rollback)。?
?
在一個(gè)連接參與了分布式事務(wù)的時(shí)候,下面的代碼是你不能做的(con表示支持分布式事務(wù)的連接Connection)。
  con.commit();或者con.rollback();或者con.setAutoCommit(true);對于通常的Connection來說,缺省的是auto-commit模式。而對于支持分布式事務(wù)的Connection來說,缺省不是auto-commit模式。注意,即使Connection是支持事務(wù)的,它也可以用于沒有事務(wù)的情況。關(guān)于事務(wù)邊界的限制只是是對分布式事務(wù)的情況下才成立的。
  配置支持連接池的DataSource的時(shí)候,涉及到配置ConnectionPoolDataSource對象,這個(gè)對象是三層體系結(jié)構(gòu)中的中間層來管理連接池的。同樣的,在配置支持分布式事務(wù)的時(shí)候,需要配置XADataSource,XADataSource是中間層用來管理分布式事物的對象。ConnectionPoolDataSource和XADataSource是由驅(qū)動(dòng)提供商提供的,對應(yīng)用程序的設(shè)計(jì)者來說是透明的。和基本的DataSource一樣,系統(tǒng)管理員來配置ConnectionPoolDataSource和XADataSource對象。
  四、結(jié)果集(RowSet接口):
  結(jié)果集對象是一行行數(shù)據(jù)的容器。根據(jù)其目的,可以通過多種方法實(shí)現(xiàn)。RowSet及其相關(guān)的接口與JDBC2.0的標(biāo)準(zhǔn)擴(kuò)展API有點(diǎn)不同,他們并不是驅(qū)動(dòng)的一部分,RowSet是在驅(qū)動(dòng)的上層實(shí)現(xiàn)的,可以由其它的任何人來實(shí)現(xiàn)他們。
  任何類型的rowset都實(shí)現(xiàn)了RowSet接口,RowSet接口擴(kuò)展了ResultSet接口。這樣RowSet對象就有了ResultSet對象所有的功能。能夠通過getXXX方法得到數(shù)據(jù)庫中的某列值,通過updateXXX方法可以修改某列值,可以移動(dòng)光標(biāo),是當(dāng)前行變?yōu)榱硪恍小?
  當(dāng)然,我們更感興趣的是RowSet接口提供的新的功能。作為一個(gè)JavaBean組件,RowSet對象可以增加或者刪除一個(gè)listener(監(jiān)聽者),可以get或者set其屬性值,這些屬性中,有一個(gè)是字符串,表示一個(gè)對數(shù)據(jù)庫Query請求,RowSet接口定義了設(shè)定參數(shù)的方法,也提供了執(zhí)行這個(gè)請求的方法。這意味著RowSet對象能夠執(zhí)行查詢請求,可以根據(jù)它產(chǎn)生的結(jié)果集進(jìn)行計(jì)算。同樣,RowSet也可以根據(jù)任何表格數(shù)據(jù)源進(jìn)行計(jì)算,所以,它不局限于關(guān)系數(shù)據(jù)庫。
  從數(shù)據(jù)源得到數(shù)據(jù)之后,RowSet對象可以和數(shù)據(jù)源斷開連接,rowset也可以被序列化。這樣,RowSet就可以通過網(wǎng)絡(luò)傳遞給瘦客戶端。
  RowSet可以被重新連接到數(shù)據(jù)源,這樣,做的修改就可以存回到數(shù)據(jù)源中去。如果產(chǎn)生了一個(gè)listener,當(dāng)RowSet的當(dāng)前行移動(dòng),或者數(shù)據(jù)被修改的時(shí)候,監(jiān)聽者就會(huì)收到通知。例如,圖形用戶界面組件可以注冊成為監(jiān)聽者,當(dāng)RowSet更改的時(shí)候,圖形用戶界面接到通知,就可以修改界面,來符合它所表示的RowSet。
  根據(jù)不同的需要,RowSet接口可以通過多種方法來實(shí)現(xiàn)。Java software已經(jīng)寫了一個(gè)CachedRowSet實(shí)現(xiàn),從http://developer.java.sun.com/developer/earlyAccess/crs/index.html中可以得到這個(gè)實(shí)現(xiàn)。
  與CachedRowSet類不樣的是,JDBCRowSet類總是保持一個(gè)和數(shù)據(jù)源的連接。這樣,在ResultSet外圍簡單到加了一層,是基于JDBC技術(shù)的驅(qū)動(dòng)看起來象是一個(gè)簡單的JavaBean組件一樣。

  總結(jié):JDBC2.0標(biāo)準(zhǔn)擴(kuò)展API通過見DataSource注冊到JNDI名字服務(wù)上,將JDBC技術(shù)擴(kuò)展為一個(gè)全新的概念。使應(yīng)用程序的代碼更加精巧,易于控制。新的API支持了連接池,支持分布式的事務(wù)。最后,還使java應(yīng)用程序可以在網(wǎng)絡(luò)上傳播結(jié)果集,是不可以滾動(dòng)的ResultSet變成了可以滾動(dòng)的RowSet。

總結(jié)

以上是生活随笔為你收集整理的DataSource的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。