數據源

資料庫應用程序所使用的資料庫

數據源是指資料庫應用程序所使用的資料庫或者資料庫伺服器。

數據源(Data Source)顧名思義,數據的來源,是提供某種所需要數據的器件或原始媒體。在數據源中存儲了所有建立資料庫連接的信息。就像通過指定文件名稱可以在文件系統中找到文件一樣,通過提供正確的數據源名稱,你可以找到相應的資料庫連接。

分類


信息系統的數據源必需可靠且具備更新能力,常用的數據源有:①觀測數據,即現場獲取的實測數據,它們包括野外實地勘測、量算數據,台站的觀測記錄數據,遙測數據等。②分析測定數據,即利用物理和化學方法分析測定的數據。③圖形數據,各種地形圖和專題地圖等。④統計調查數據,各種類型的統計報表、社會調查數據等。⑤遙感數據,由地面、航空或航天遙感獲得的數據。中國的數據源數量龐大。如:全國範圍的土地資源清查及詳查數據,航空攝影測量圖像和國土普查衛星資料已覆蓋全國,定位、半定位觀測站網遍布全國,有地面調查、地圖測繪等大量數據。
數據源
數據源
上面提到的數據源例子只是很小一部分,事實上數據源可以是任何數據類型。

屬性


1. databaseName String資料庫名稱,即資料庫的SID。
2. dataSourceName String數據源介面實現類的名稱。
3. description String 對數據源的描述。
4. networkProtocol String 和伺服器通訊使用的網路協議名。
5. password String 用戶登錄密碼。
6. portNumber資料庫伺服器使用的埠。
7. serverName String資料庫伺服器名稱。
8. user String 用戶登錄名。
如果數據是水,資料庫就是水庫,數據源就是連接水庫的管道,終端用戶看到的數據集是管道里流出來的水。

名稱


數據源名稱(data source name,DSN)是包含了有關某個特定資料庫信息的數據結構,這個信息是開放式資料庫連接驅動能夠連接到資料庫上必需的信息。DSN存儲在註冊表或作為一個單獨的文本文件,DSN裡面包含的信息有名稱、目錄和資料庫驅動器,以及用戶ID和密碼(根據DSN的類型)。開發人員為每個資料庫創建一個獨立的DSN。為了連接到某個資料庫,開發人員需要在程序中指定DSN。相反,沒有DSN的連接則需要在程序中指定所有必要的信息。
有三種類型的DSN:用戶DSN(有時也叫作機器DSN)、系統DSN和文件DSN。用戶和系統DSN都根據具體計算機而有所不同,DSN信息存儲在註冊表中。用戶DSN允許單個用戶在單個計算機上訪問資料庫,系統DSN允許在某個計算機上的多個用戶訪問資料庫。文件DSN在一個以.DSN擴展名結尾的文本文件中存儲相關信息,並且可以被安裝了相同驅動器的不同計算機上的多個用戶共享。
註:DSN也是 Deep Space Network太空跟蹤網的縮寫。

數據包


不管通過何種持久化技術,都必須通過數據連接訪問資料庫,在Spring中,數據連接是通過數據源獲得的。在以往的應用中,數據源一般是Web應用伺服器提供的。在Spring中,你不但可以通過JNDI獲取應用伺服器的數據源,也可以直接在Spring容器中配置數據源,此外,你還可以通過代碼的方式創建一個數據源,以便進行無依賴的單元測試配置一個數據源。
Spring在第三方依賴包中包含了兩個數據源的實現類包,其一是Apache的DBCP,其二是C3P0。可以在Spring配置文件中利用這兩者中任何一個配置數據源。

DBCP

DBCP類包位於/lib/jakarta-commons/commons-dbcp.jar,DBCP是一個依賴Jakarta commons-pool對象池機制的資料庫連接池,所以在類路徑下還必須包括/lib/jakarta-commons/commons-pool.jar。下面是使用DBCP配置MySql數據源的配置片斷:
xml代碼
BasicDataSource提供了close()方法關閉數據源,所以必須設定destroy-method=”close”屬性,以便Spring容器關閉時,數據源能夠正常關閉。除以上必須的數據源屬性外,還有一些常用的屬性:
defaultAutoCommit:設置從數據源中返回的連接是否採用自動提交機制,默認值為true;
defaultReadOnly:設置數據源是否僅能執行只讀操作,默認值為false;
maxActive:最大連接資料庫連接數,設置為0時,表示沒有限制;
maxIdle:最大等待連接中的數量,設置為0時,表示沒有限制;
maxWait:最大等待秒數,單位為毫秒,超過時間會報出錯誤信息;
validationQuery:用於驗證連接是否成功的查詢SQL語句,SQL語句必須至少要返回一行數據,如你可以簡單地設置為:“selectcount(*)fromuser”;
removeAbandoned:是否自我中斷,默認是false;
removeAbandonedTimeout:幾秒后數據連接會自動斷開,在removeAbandoned為true,提供該值;
logAbandoned:是否記錄中斷事件,默認為false;

C3P0

C3P0是一個開放源代碼的JDBC數據源實現項目,它在lib目錄中與Hibernate一起發布,實現了JDBC3和JDBC2擴展規範說明的Connection和Statement池。C3P0類包位於/lib/c3p0/c3p0-0.9.0.4.jar。下面是使用C3P0配置一個Oracle數據源:
xml代碼
ComboPooledDataSource和BasicDataSource一樣提供了一個用於關閉數據源的close()方法,這樣我們就可以保證Spring容器關閉時數據源能夠成功釋放。
C3P0擁有比DBCP更豐富的配置屬性,通過這些屬性,可以對數據源進行各種有效的控制:
acquireIncrement:當連接池中的連接用完時,C3P0一次性創建新連接的數目;
acquireRetryAttempts:定義在從資料庫獲取新連接失敗后重複嘗試獲取的次數,默認為30;
acquireRetryDelay:兩次連接中間隔時間,單位毫秒,默認為1000;
autoCommitOnClose:連接關閉時默認將所有未提交的操作回滾。默認為false;
automaticTestTable:C3P0將建一張名為Test的空表,並使用其自帶的查詢語句進行測試。如果定義了這個參數,那麼屬性preferredTestQuery將被忽略。你不能在這張Test表上進行任何操作,它將作為C3P0測試所用,默認為null;
breakAfterAcquireFailure:獲取連接失敗將會引起所有等待獲取連接的線程拋出異常。但是數據源仍有效保留,並在下次調用getConnection()的時候繼續嘗試獲取連接。如果設為true,那麼在嘗試獲取連接失敗后該數據源將申明已斷開並永久關閉。默認為false;
checkoutTimeout:當連接池用完時客戶端調用getConnection()后等待獲取新連接的時間,超時后將拋出SQLException,如設為0則無限期等待。單位毫秒,默認為0;
connectionTesterClassName:通過實現ConnectionTester或QueryConnectionTester的類來測試連接,類名需設置為全限定名。默認為com.mchange.v2.C3P0.impl.DefaultConnectionTester;
idleConnectionTestPeriod:隔多少秒檢查所有連接池中的空閑連接,默認為0表示不檢查;
initialPoolSize:初始化時創建的連接數,應在minPoolSize與maxPoolSize之間取值。默認為3;
maxIdleTime:最大空閑時間,超過空閑時間的連接將被丟棄。為0或負數則永不丟棄。默認為0;
maxPoolSize:連接池中保留的最大連接數。默認為15;
maxStatements:JDBC的標準參數,用以控制數據源內載入的PreparedStatement數量。但由於預緩存的Statement屬於單個Connection而不是整個連接池。所以設置這個參數需要考慮到多方面的因素,如果maxStatements與maxStatementsPerConnection均為0,則緩存被關閉。默認為0;
maxStatementsPerConnection:連接池內單個連接所擁有的最大緩存Statement數。默認為0;
numHelperThreads:C3P0是非同步操作的,緩慢的JDBC操作通過幫助進程完成。擴展這些操作可以有效的提升性能,通過多線程實現多個操作同時被執行。默認為3;
preferredTestQuery:定義所有連接測試都執行的測試語句。在使用連接測試的情況下這個參數能顯著提高測試速度。測試的表必須在初始數據源的時候就存在。默認為null;
propertyCycle:用戶修改系統配置參數執行前最多等待的秒數。默認為300;
testConnectionOnCheckout:因性能消耗大請只在需要的時候使用它。如果設為true那麼在每個connection提交的時候都將校驗其有效性。建議使用idleConnectionTestPeriod或automaticTestTable
等方法來提升連接測試的性能。默認為false;
testConnectionOnCheckin:如果設為true那麼在取得連接的同時將校驗連接的有效性。默認為false。

ODBC

ODBC(Open Database Connectivity,開放資料庫互連)是微軟公司開放服務結構(WOSA,Windows Open Services Architecture)中有關資料庫的一個組成部分,它建立了一組規範,並提供了一組對資料庫訪問的標準API(應用程序編程介面)。這些API利用SQL來完成其大部分任務。ODBC本身也提供了對SQL語言的支持,用戶可以直接將SQL語句送給ODBC。一組數據的位置,可以使用 ODBC驅動程序訪問該位置。