版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、第四章 JDBC,訪問多種數(shù)據(jù)庫的統(tǒng)一數(shù)據(jù)庫訪問接口,概要,JDBC概述 JDBC驅動程序 DriverManager Connections Statements Result Sets 數(shù)據(jù)庫元數(shù)據(jù),JDBC概述,JDBC 本身是個商標名而不是一個縮寫字“Java Database Connectivity” 一種用于執(zhí)行 SQL 語句的 Java API,由一組類和接口組成。 為工具/數(shù)據(jù)庫開發(fā)人員提供了一個標準的 API,使他們能夠用純Java API 來編寫數(shù)據(jù)庫應用程序。 采用 JDBC,不需要針對各種關系數(shù)據(jù)庫編寫不同的數(shù)據(jù)庫程序 將 Java 和 JDBC 結合起來將使程序員只
2、須寫一遍程序就可讓它在任何平臺上運行。,JDBC體系結構,JDBC數(shù)據(jù)庫驅動程序,數(shù)據(jù)庫驅動有四種類型: Type 1:JDBC-ODBCBridge Type 2:JDBC-NativeAPIBridge Type 3:JDBC-middleware Type 4:PureJDBCdriver,JDBC-ODBCBridge,橋接器驅動程序之一 特色是必須在使用者端的計算機上事先安裝好ODBC驅動程序,然后通過JDBC-ODBC的調用方法,進而通過ODBC來存取數(shù)據(jù)庫。 Application-JDBC-ODBCBridge-JDBC-ODBCLibrary-ODBCDriver-Datab
3、ase適用于快速的原型系統(tǒng),沒有提供JDBC驅動的數(shù)據(jù)庫如Access,JDBC-NativeAPIBridge,橋接器驅動程序之一 這類驅動程序也必須先在使用者計算機上先安裝好特定的驅動程序(類似ODBC),然后通過JDBC-NativeAPI橋接器的轉換,把JavaAPI調用轉換成特定驅動程序的調用方法,進而存取數(shù)據(jù)庫。 利用開發(fā)商提供的本地庫直接與數(shù)據(jù)庫通信。Application-JDBCDriver-NativeDatabaselibrary-Database比A類性能略好。,JDBC-middleware,好處:省去了在使用者計算機上安裝任何驅動程序的麻煩,只需在服務器端安裝好mi
4、ddleware,而middleware會負責所有存取數(shù)據(jù)庫必要的轉換。 Application-JdbcDriver-javamiddleware-JDBCDriver-Database 具有最大的靈活性,通常由那些非數(shù)據(jù)庫廠商提供。,PureJDBCdriver,這類型的驅動程序是最成熟的JDBC驅動程序,不但無需在使用者計算機上安裝任何額外的驅動程序,也不需要在服務器端安裝任何中介程序(middleware),所有存取數(shù)據(jù)庫的操作,都直接由驅動程序來完成。 Application-Jdbcdriver-databaseengine-database 最高的性能,通過自己的本地協(xié)議直接與數(shù)
5、據(jù)庫引擎通信,具備在Internet裝配的能力。,JDBC API,JDBC 是一種低級 API ,是高級 API 的基礎 JDBC 是個“低級”接口,用于直接調用 SQL 命令。在這方面功能極佳,并比其它的數(shù)據(jù)庫連接 API 易于使用。 高級接口是“對用戶友好的”接口,它使用的是一種更易理解和更為方便的 API,這種 API 在幕后被轉換為諸如 JDBC 這樣的低級接口。,JDBC API,核心的 JDBC API 在包java.sql中 包java.sql中主要的類和接口關系如圖 包javax.sql在JDBC2.0中是可選的,JDBC3.0開始為絕大多數(shù)廠商支持 javax.sql.Da
6、taSource 和 java.sql.Connection關系如圖,JDBC API,JDBC API實現(xiàn)了四個基本的功能:建立與數(shù)據(jù)的連接、執(zhí)行SQL語句和處理執(zhí)行結果、關閉數(shù)據(jù)庫的連接。 Driver接口 DataSource接口 DriverManager類 Connection類 Statement類 PreparedStatement類 CallableStatement類 ResultSet類 ResultSetMetaData類 DatabaseMetaData類,Driver接口,JDBC驅動程序必須實現(xiàn)Driver接口, 且該實現(xiàn)必須包含一個靜態(tài)的初始化塊a static
7、initializer 靜態(tài)的初始化塊使用DriverManager 注冊自身的一個新的實例,Driver接口,當使用Class.forName(“com.acme.jdbc.AcmeJdbcDriver”), 加載該驅動的實例時,靜態(tài)的代碼塊將自動的注冊該驅動的實例 當DriverManager 試圖建立某個數(shù)據(jù)庫連接時, DriverManager 調用驅動程序的connect()方法,并把數(shù)據(jù)庫連接的URL傳遞給它。 JDBC URL 提供了一種標識數(shù)據(jù)庫的方法,可以使相應的驅動程序能識別該數(shù)據(jù)庫并與之建立連接,Driver接口,URL 語法 jdbc: JDBC URL 中的協(xié)議總是
8、jdbc 子協(xié)議用來標識一種特定種類的數(shù)據(jù)庫連接機制 的內容依賴于子協(xié)議,推薦的語法是: /hostname:port/subsubname 例如URL: jdbc:mysql:/localhost:3306/jpetstore?autoReconnect=true jdbc:odbc:fred,Driver接口,“odbc” 子協(xié)議, 是一種特殊情況。用于指定 ODBC 風格的數(shù)據(jù)資源名稱的 URL 而保留的,并具有下列特性: 允許在子名稱(數(shù)據(jù)資源名稱)后指定任意多個屬性值。 odbc 子協(xié)議的完整語法為: jdbc:odbc:;=* 因此,以下都是合法的 jdbc:odbc 名稱:jdb
9、c:odbc:qeor7 jdbc:odbc:wombatjdbc:odbc:wombat;CacheSize=20;ExtensionCase=LOWERjdbc:odbc:qeora;UID=kgh;PWD=fooey,DataSource接口,建議用此種式來獲取數(shù)據(jù)源的連接 DataSource 對象表示一個數(shù)據(jù)源,并提供了該數(shù)據(jù)源的連接 使用 DataSource 對象增加了應用程序的可移植性(使用邏輯名稱表示一個數(shù)據(jù)源,取代為驅動程序提供特定的連接信息) DataSource的屬性改變,應用程序代碼不需要改變,DataSource接口,DataSource 的標準屬性,DataSou
10、rce接口,DataSource屬性遵循JavaBeans組件中屬性的命名約定 DataSource的實現(xiàn)必須為每個支持的屬性提供存取方法 “getter” and “setter” DataSource 的屬性對于JDBC客戶端來說不是直接可訪問的。,DataSource接口,使用 JNDI API,指定邏輯名來訪問DataSource 對象,把邏輯名映射到相應的數(shù)據(jù)源 例子: / Get the initial JNDI naming context Context ctx = new InitialContext(); / Get the DataSource object associ
11、ated with the logical name / jdbc/AcmeDB and use it to obtain a database connection DataSource ds = (DataSource)ctx.lookup(jdbc/AcmeDB); Connection con = ds.getConnection(user, pwd);,DriverManager類,負責管理JDBC驅動程序。 使用JDBC驅動程序之前,必須先將驅動程序加載并向DriverManager注冊后才可以使用,同時提供方法來建立與數(shù)據(jù)庫的連接。 通過指定的URL查找合適的驅動 DriverM
12、anager 關鍵方法 include: registerDriver getConnection(String url) getConnection(String url, java.util.Properties prop),Connection類,Connection 對象代表與數(shù)據(jù)庫的連接。 建立到底層數(shù)據(jù)源的連接有兩種方式: DriverManager DataSource 連接過程包括所執(zhí)行的 SQL 語句和在該連接上所返回的結果。 一個應用程序可與單個數(shù)據(jù)庫有一個或多個連接,或者可與許多數(shù)據(jù)庫有連接。,使用 DriverManager的例子,String className,ur
13、l,uid,pwd; className = “com.microsoft.jdbc.sqlserver.SQLServerDriver”; url = “jdbc:microsoft:sqlserver:/localhost:1433;DatabaseName=testJDC;User=user;Password=password; / the hard-code URL uid = ”sa“; pwd = “sa”; Class.forName(className); / load the driver Connection cn = DriverManager.getConnection
14、(url);/Connection cn = DriverManager.getConnection(url,uid,pwd);,使用 DataSource的例子,String jndi = jdbc/jpetstore1; Context ctx = (Context) new InitialContext().lookup(java:comp/env); DataSource ds = (DataSource) ctx.lookup(jndi); Connection cn = ds.getConnection();,Connection類的方法,StatementcreateStatem
15、ent()throwsSQLException;/建立Statement類對象 StatementcreateStatement(intresultSetType,intresultSetConcurrency)throwsSQLException;/建立Statement類對象 resultSetType值 TYPE_FORWARD_ONLY結果集不可滾動 TYPE_SCROLL_INSENSITIVE結果集可滾動,不反映數(shù)據(jù)庫的變化 TYPE_SCROLL_SENSITIVE結果集可滾動,反映數(shù)據(jù)庫的變化 resultSetConcurrency值 CONCUR_READ_ONLY不能用結
16、果集更新數(shù)據(jù) CONCUR_UPDATABLE能用結果集更新數(shù)據(jù) JDBC2.0中才支持滾動的結果集,而且可以對數(shù)據(jù)進行更新,Connection類的方法,PreparedStatementprepareStatement(Stringsql)throwsSQLException;/建立PreparedStatement類對象 booleangetAutoCommit()throwsSQLException/返回Connection類對象的AutoCommit狀態(tài) voidsetAutoCommit(booleanautoCommit)throwsSQLException/設定Connecti
17、on類對象的AutoCommit狀態(tài) DatabaseMetaDatagetMetaData()throwsSQLException;/建立DatabaseMetaData類對象,Connection類的方法,voidcommit()throwsSQLException/確定執(zhí)行對數(shù)據(jù)庫新增、刪除或修改記錄的操作 voidrollback()throwsSQLException/取消執(zhí)行對數(shù)據(jù)庫新增、刪除或修改記錄的操作 voidclose()throwsSQLException/結束Connection對象對數(shù)據(jù)庫的聯(lián)機 booleanisClosed()throwsSQLException
18、/測試是否已經(jīng)關閉Connection類對象對數(shù)據(jù)庫的聯(lián)機,Statement類,Statement類提供的方法,可以利用標準的SQL命令,對數(shù)據(jù)庫直接新增、刪除或修改操作 實現(xiàn)這種功能的類有三個: Statement PreparedStatement CallableStatement,創(chuàng)建Statements對象,通過 Connection對象建立 可創(chuàng)建多個Statements對象,供程序并發(fā)使用,執(zhí)行sql語句的方法,ResultSetexecuteQuery(Stringsql)throwsSQLException/使用SELECT命令對數(shù)據(jù)庫進行查詢,執(zhí)行sql語句的方法,int
19、executeUpdate(Stringsql)throwsSQLException/使用INSERTDELETEUPDATE對數(shù)據(jù)庫進行新增、刪除和修改操作。,執(zhí)行sql語句的方法,voidclose()throwsSQLException/結束Statement類對象對數(shù)據(jù)庫的聯(lián)機 調用此方法表明已完成sql的執(zhí)行 創(chuàng)建Statement的Connection對象關閉,將導致Statement對象關閉 關閉Statement對象將會導致,由Statement對象獲得的ResultSet對象不在有效,PreparedStatement類,PreparedStatement 是 Stateme
20、nt 的子類,在創(chuàng)建 PreparedStatement 時,會提供一個 SQL 語句 。 區(qū)別在于:PreparedStatement類對象會將傳入的SQL命令事先編好等待使用,當有單一的SQL指令比多次執(zhí)行時,用PreparedStatement類會比Statement類有效率 一般來說,使用PreparedStatement對象都是帶輸入?yún)?shù)的,PreparedStatement類的方法,ResultSetexecuteQuery()throwsSQLException/使用SELECT命令對數(shù)據(jù)庫進行查詢 intexecuteUpdate()throwsSQLException/使用I
21、NSERTDELETEUPDATE對數(shù)據(jù)庫進行新增、刪除和修改操作。 ResultSetMetaDatagetMetaData()throwsSQLException/取得ResultSet類對象有關字段的相關信息 voidsetInt(intparameterIndex,intx)throwsSQLException/設定整數(shù)類型數(shù)值給PreparedStatement類對象的IN參數(shù) voidsetFloat(intparameterIndex,floatx)throwsSQLException/設定浮點數(shù)類型數(shù)值給PreparedStatement類對象的IN參數(shù),PreparedSta
22、tement類的方法,voidsetNull(intparameterIndex,intsqlType)throwsSQLException/設定NULL類型數(shù)值給PreparedStatement類對象的IN參數(shù) voidsetString(intparameterIndex,Stringx)throwsSQLException/設定字符串類型數(shù)值給PreparedStatement類對象的IN參數(shù) voidsetDate(intparameterIndex,Datex)throwsSQLException/設定日期類型數(shù)值給PreparedStatement類對象的IN參數(shù) voidset
23、Time(intparameterIndex,Timex)throwsSQLException/設定時間類型數(shù)值給PreparedStatement類對象的IN參數(shù),PreparedStatement編程例子,Connection con=DriverManager.getConnection(url,user,password); /當前的表中有如下幾個字段ID,NAME,PASSWORD,TEXT,NOTE PreparedStatement insertStatement = con.prepareStatement( INSERT INTO rbac_application value
24、s(?,?,?,?,?); insertStatement.setInt(1,10); insertStatement.setString(2,thinkersky); insertStatement.setString(3,88888); insertStatement.setString(4,這是個測試的應用程序); insertStatement.setString(5,備注); int result = insertStatement.executeUpdate(); con.close();,CallableStatement類,CallableStatement是Statement
25、的子類 為所有的 DBMS 提供了一種以標準形式調用儲存過程的方法。儲存過程儲存在數(shù)據(jù)庫中。 這種調用是用一種換碼語法來寫的,有兩種形式:一種形式帶結果參,另一種形式不帶結果參數(shù)。結果參數(shù)是一種輸出 (OUT) 參數(shù),是已儲存過程的返回值。 兩種形式都可帶有數(shù)量可變的輸入(IN 參數(shù))、輸出(OUT 參數(shù))或輸入和輸出(INOUT 參數(shù))的參數(shù)。問號將用作參數(shù)的占位符。,CallableStatement的例子,CallableStatement cstm = connection.prepareCall(call return_student?,?); cstm.setString(1,86
26、23034); cstm.registerOutparameter(2, Types.REAL); cstm.execute(); float gpa = cstm.getFloat(2);,ResultSet類,負責存儲查詢數(shù)據(jù)庫的結果。并提供一系列的方法對數(shù)據(jù)庫進行新增、刪除和修改操作。也負責維護一個記錄光標(Cursor),記錄光標指向數(shù)據(jù)表中的某個記錄,通過適當?shù)囊苿佑涗浌鈽耍梢噪S心所欲的存取數(shù)據(jù)庫,加強程序的效率。,ResultSet的類型,在以下方面確定了ResultSet 的功能: 光標操作的方式 對于底層數(shù)據(jù)源的改變如何反映到ResultSet 對象. 有三種類型: TYPE
27、_FORWARD_ONLY默認值 TYPE_SCROLL_INSENSITIVE TYPE_SCROLL_SENSITIVE.,ResultSet Concurrency并發(fā)性,決定具備的更新能力 有兩個并發(fā)性層次: CONCUR_READ_ONLY默認值 CONCUR_UPDATABLE,ResultSet holdability持久性,當commit 操作在顯式或隱式完成后,通過holdability 設置讓應用程序控制ResultSet 對象是否關閉. holdability 常量有: HOLD_CURSORS_OVER_COMMIT CLOSE_CURSORS_AT_COMMIT,指定
28、 Type, Concurrency and Holdability,Connection.createStatement()中指定 Statement 對象也為這三個屬性提供了存取方法 setter and getter.,創(chuàng)建 ResultSet對象,光標移動,光標指向ResultSet對象的當前行 當ResultSet對象被首次創(chuàng)建時, 光標位于第一行之前. 如下方式用于操作光標: next(), previous(),first(), last(), beforeFirst(), afterLast(), relative(int rows), absolute(int row),檢索
29、記錄集中的值,有兩個getter 方法 : 取列索引值作為第一個參數(shù) 取列名作為參數(shù) 列索引從左至右排序,從1開始 列名是大小寫敏感的,SQL類型所對應的Java類型,JDBC下載及配置(使用sql server 2000),下載SQL Server JDBC驅動 默認安裝在C:Program FilesMicrosoft SQL Server 2000 Driver for JDBC,lib目錄中有msbase.jar,mssqlserver.jar,msutil.jar文件。 添加C:Program FilesMicrosoft SQL Server 2000 Driver for JDB
30、Clib到classpath中。 在Eclipse中右擊project, 選擇Build Path-Configure Build Path-Library, click Add External Jars,添加msbase.jar,mssqlserver.jar,msutil.jar。,一個JDBC例子:測試JDBC,import java.sql.*; public class ConSqlserver Connection con; Statement st; ResultSet rs; public ConSqlserver() try String name=com.microsof
31、t.jdbc.sqlserver.SQLServerDriver; String url=jdbc:microsoft:sqlserver:/localhost:1433;DatabaseName=testJDBC;User=user;Password=password;,一個JDBC例子:測試JDBC,Class.forName(name); con=DriverManager.getConnection(url,sa,sa); System.out.println(連接成功!); con.close(); catch(Exception e) e.printStackTrace(); pu
32、blic static void main(String args) ConSqlserver cs=new ConSqlserver(); ,另一個例子:從表中select,import java.util.*; import java.sql.*; public class Example2 public static void main(String args) Connection conn=null; Statement stmt=null; ResultSet rs=null; int rowcount=0;,另一個例子:從表中select,try /注冊數(shù)據(jù)庫驅動程序為SqlSe
33、rver驅動 String name=com.microsoft.jdbc.sqlserver.SQLServerDriver; Class.forName(name); catch (java.lang.ClassNotFoundException e) /這樣寫是為了方便調試程序,出錯打印mydb()就知道在什么地方出錯了 System.err.println(mydb(): + e.getMessage(); try String url=jdbc:microsoft:sqlserver:/localhost:1433;DatabaseName=testJDBC; conn=Driver
34、Manager.getConnection(url,sa,sa); catch (SQLException ex) System.err.println(conn:+ex.getMessage(); ,另一個例子:從表中select,if (conn!=null) System.out.println(connection successful); else System.out.println(connection failure); try stmt=conn.createStatement(); catch (SQLException ex) System.err.println(cre
35、ateStatement();+ex.getMessage(); try rs=stmt.executeQuery(select * from member); catch (SQLException ex) System.err.println(stmt.excuteQuery();+ex.getMessage(); ,另一個例子:從表中select,try while (rs.next() System.out.println(userNo: + rs.getString(1); System.out.println(userName: +rs.getString(2); catch (S
36、QLException ex) System.err.println(A ERROR is failure +ex.getMessage(); ,DatabaseMetaData類,JDBC 3.0以后加入元數(shù)據(jù)的功能 DatabaseMetaData類保存了數(shù)據(jù)庫的所有特性,并且提供許多方法來取得這些信息。 使用Connection對象的getMetaData()來獲取實例 用于動態(tài)的發(fā)現(xiàn)底層的數(shù)據(jù)源的限制、是否支持某些特性(如事務等) supportsAlterTableWithDropColumn supportsBatchUpdates supportsTableCorrelation
37、Names supportsPositionedDelete supportsFullOuterJoins supportsStoredProcedures supportsMixedCaseQuotedIdentifiers,DatabaseMetaData類的方法,StringgetDatabaseProductName()throwsSQLException/取得數(shù)據(jù)庫名稱 StringgetDatabaseProductVersion()throwsSQLException /取得數(shù)據(jù)庫版本代號 StringgetDriverName()throwsSQLException/取得JDB
38、C驅動程序的名稱 StringgetDriverVersion()throwsSQLException/取得JDBC驅動程序的版本代號 StringgetURL()throwsSQLException/取得連接數(shù)據(jù)庫的JDBCURL StringgetUserName()throwsSQLException/取得登錄數(shù)據(jù)庫的使用者帳號 。 更多的方法參考API文檔,獲取最基本的數(shù)據(jù)庫信息(如數(shù)據(jù)庫表),public static void showTables(Connection connection) throws Exception DatabaseMetaData meta = con
39、nection.getMetaData(); /獲取數(shù)據(jù)庫連接的元數(shù)據(jù) /查詢連接的所有Table(如果需要查詢視圖等,可以在最后的數(shù)組中添加VIEW.,依此類推) ResultSet rsTable = meta.getTables(null, null, null, new String TABLE ); /獲取到的數(shù)據(jù)是以ResultSet形式返回 while (rsTable.next() System.out.println(rsTable.getString(1); /第一列是Database名稱 System.out.println(rsTable.getString(2); /
40、第二列是用戶名稱(有的表可能沒有對應的用戶) System.out.println(rsTable.getString(3); /第三列就是表名稱 ,如何獲取Table的主鍵信息,public static List getPrimaryKeys(Connection connection, String tableName) throws Exception ArrayList keyList = new ArrayList(); DatabaseMetaData meta = connection.getMetaData(); ResultSet rsKey = meta.getPrima
41、ryKeys(null, null, tableName); /獲取制定表的主鍵列信息 while (rsKey.next() keyList.add(rsKey.getString(4); return keyList; ,獲取一個表中是外鍵列的名稱列表,public static List getExportedKeys(Connection connection, String tableName) throws Exception ArrayList keyList = new ArrayList(); DatabaseMetaData meta = connection.getMet
42、aData(); ResultSet rsKey = meta.getExportedKeys(null, null, tableName); while (rsKey.next() keyList.add(rsKey.getString(4); return keyList; ,一個完整的例子,package .njust;import java.sql.Connection;import java.sql.DriverManager;import java.sql.Statement;import java.sql.DatabaseMetaData;public class D
43、ataConn public DataConn() ,一個完整的例子,public static void main(String args) try /加載驅動程序,下面的代碼為加載JDBD-ODBC驅動程序 Class.forName(“oracle.jdbc.driver.OracleDriver”); /建立連接,用適當?shù)尿寗映绦蜻B接到DBMS String url=“jdbc:oracle:thin:5:1521:oemrep”; String user = “ums”; String password = “rongji”; /用url創(chuàng)建連接 Connect
44、ion con=DriverManager.getConnection(url,user,password);,一個完整的例子,/獲取數(shù)據(jù)庫的信息 DatabaseMetaData dbMetaData = con.getMetaData(); /返回一個String類對象,代表數(shù)據(jù)庫的URL System.out.println(URL:+dbMetaData.getURL()+;); /返回連接當前數(shù)據(jù)庫管理系統(tǒng)的用戶名。 System.out.println(UserName:+dbMetaData.getUserName()+;); /返回一個boolean值,指示數(shù)據(jù)庫是否只允許讀操
45、作。 System.out.println(isReadOnly:+dbMetaData.isReadOnly()+;); /返回數(shù)據(jù)庫的產(chǎn)品名稱。System.out.println(DatabaseProductName:+dbMetaData.getDatabaseProductName()+;); /返回數(shù)據(jù)庫的版本號。System.out.println(DatabaseProductVersion:+dbMetaData.getDatabaseProductVersion()+;); /返回驅動驅動程序的名稱。 System.out.println(DriverName:+dbMe
46、taData.getDriverName()+;);/返回驅動程序的版本號。 System.out.println(DriverVersion:+dbMetaData.getDriverVersion();,一個完整的例子,/關閉連接 con.close();catch (Exception e) /輸出異常信息 System.err.println(SQLException :+e.getMessage(); e.printStackTrace(); ,數(shù)據(jù)庫連接池,對某一數(shù)據(jù)庫所有連接的“緩沖池”,主要實現(xiàn)以下功能: 從連接池獲取或創(chuàng)建可用連接; 使用完畢之后,把連接返還給連接池; 在系統(tǒng)
47、關閉前,斷開所有連接并釋放連接占用的系統(tǒng)資源; 還能夠處理無效連接(原來登記為可用的連接,由于某種原因不再可用,如超時,通訊問題),并能夠限制連接池中的連接總數(shù)不低于某個預定值和不超過某個預定值。,數(shù)據(jù)庫連接池,基本思想:為數(shù)據(jù)庫連接建立一個“緩沖池”。預先在緩沖池中放入一定數(shù)量的連接,當需要建立數(shù)據(jù)庫連接時,只需從“緩沖池”中取出一個,使用完畢之后再放回去??梢酝ㄟ^設定連接池最大連接數(shù)來防止系統(tǒng)無盡的與數(shù)據(jù)庫連接。更為重要的是我們可以通過連接池的管理機制監(jiān)視數(shù)據(jù)庫的連接的數(shù)量、使用情況,為系統(tǒng)開發(fā)、測試及性能調整提供依據(jù)。,數(shù)據(jù)庫連接池關鍵問題,并發(fā)問題為了使連接管理服務具有最大的通用性,必
48、須考慮多線程環(huán)境,即并發(fā)問題。這個問題相對比較好解決,因為Java語言自身提供了對并發(fā)管理的支持,使用synchronized關鍵字即可確保線程是同步的。使用方法為直接在類方法前面加上synchronized關鍵字,如:publicsynchronizedConnectiongetConnection(),數(shù)據(jù)庫連接池關鍵問題,多數(shù)據(jù)庫服務器和多用戶 對于大型的企業(yè)級應用,常常需要同時連接不同的數(shù)據(jù)庫(如連接Oracle和Sybase)??刹捎玫牟呗允牵涸O計一個符合單例模式的連接池管理類,在連接池管理類的唯一實例被創(chuàng)建時讀取一個資源文件,其中資源文件中存放著多個數(shù)據(jù)庫的url地址()、用戶名(
49、)、密碼()等信息。如tx.url=23:5000/tx_it,tx.user=yang,tx.password=yang321。根據(jù)資源文件提供的信息,創(chuàng)建多個連接池類的實例,每一個實例都是一個特定數(shù)據(jù)庫的連接池。連接池管理類實例為每個連接池實例取一個名字,通過不同的名字來管理不同的連接池。 對于同一個數(shù)據(jù)庫有多個用戶使用不同的名稱和密碼訪問的情況,也可以通過資源文件處理,即在資源文件中設置多個具有相同url地址,但具有不同用戶名和密碼的數(shù)據(jù)庫連接信息。,數(shù)據(jù)庫連接池關鍵問題,事務處理 事務具有原子性,此時要求對數(shù)據(jù)庫的操作符合“ALL-ALL-NOTHING”原則,即
50、對于一組SQL語句要么全做,要么全不做。 在Java語言中,Connection類本身提供了對事務的支持,可以通過設置Connection的AutoCommit屬性為false,然后顯式的調用commit或rollback方法來實現(xiàn)。但要高效的進行Connection復用,就必須提供相應的事務支持機制??刹捎妹恳粋€事務獨占一個連接來實現(xiàn),這種方法可以大大降低事務管理的復雜性。,數(shù)據(jù)庫連接池關鍵問題,連接池的分配與釋放 使用空閑池。即把已經(jīng)創(chuàng)建但尚未分配出去的連接按創(chuàng)建時間存放到一個空閑池中。每當用戶請求一個連接時,系統(tǒng)首先檢查空閑池內有沒有空閑連接。如果有,就把建立時間最長(通過容器的順序存放
51、實現(xiàn))的那個連接分配給他;如果沒有,則檢查當前連接池是否達到連接池所允許的最大連接數(shù),如果沒有達到,就新建一個連接,如果已經(jīng)達到,就等待一定的時間。如果在等待的時間內有連接被釋放出來就可以把這個連接分配給等待的用戶,如果等待時間超過預定時間,則返回空值(null)。系統(tǒng)對已經(jīng)分配出去正在使用的連接只做計數(shù),當使用完后再返還給空閑池。,數(shù)據(jù)庫連接池關鍵問題,連接池的配置與維護 連接池中到底應該放置多少連接,才能使系統(tǒng)的性能最佳?系統(tǒng)可采取設置最小連接數(shù)(minConn)和最大連接數(shù)(maxConn)來控制連接池中的連接。最小連接數(shù)是系統(tǒng)啟動時連接池所創(chuàng)建的連接數(shù)。如果創(chuàng)建過多,則系統(tǒng)啟動就慢,但
52、創(chuàng)建后系統(tǒng)的響應速度會很快;如果創(chuàng)建過少,則系統(tǒng)啟動的很快,響應起來卻慢。 如何確保連接池中的最小連接數(shù)呢?有動態(tài)和靜態(tài)兩種策略。動態(tài)即每隔一定時間就對連接池進行檢測,如果發(fā)現(xiàn)連接數(shù)量小于最小連接數(shù),則補充相應數(shù)量的新連接,以保證連接池的正常運轉。靜態(tài)是發(fā)現(xiàn)空閑連接不夠時再去檢查。,連接池模型,連接池管理類是連接池類的外覆類(wrapper),符合單例模式,即系統(tǒng)中只能有一個連接池管理類的實例。其主要用于對多個連接池對象的管理,具有以下功能: 裝載并注冊特定數(shù)據(jù)庫的JDBC驅動程序; 根據(jù)屬性文件給定的信息,創(chuàng)建連接池對象; 為方便管理多個連接池對象,為每一個連接池對象取一個名字,實現(xiàn)連接池名字與其實例之間的映射; 跟蹤客戶使用連接情況,以便需要是關閉連接釋放資源。 連接池管理類的引入主要是為了方便對多個連接池的使用和管理,如系統(tǒng)需要連接不同的數(shù)據(jù)庫,或連接相同的數(shù)據(jù)庫但由于安全性問題,需要不同的用戶使用不同的名稱和密碼。,連接池實現(xiàn),給出連接池類和連接池管理類的主要屬性及所要實現(xiàn)的基本接口 public
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 鋁電解工安全管理評優(yōu)考核試卷含答案
- 礦井泵工崗前班組安全考核試卷含答案
- 稀土發(fā)光材料工崗前理論能力考核試卷含答案
- 滴丸工安全意識強化水平考核試卷含答案
- 電線電纜拉制工操作知識評優(yōu)考核試卷含答案
- 軋制加熱工風險評估競賽考核試卷含答案
- 2024年湖南農業(yè)大學東方科技學院輔導員考試參考題庫附答案
- 水解酵母干燥工崗前活動策劃考核試卷含答案
- 品牌資產(chǎn)評價師崗前實操知識考核試卷含答案
- 丁二酸裝置操作工8S考核試卷含答案
- 兒童支氣管哮喘急性發(fā)作急救培訓流程
- 2026年焊工(技師)考試題庫(附答案)
- 2026年醫(yī)療器械不良事件分析報告
- 四川藏區(qū)高速公路集團有限責任公司2026年校園招聘參考題庫完美版
- 基本醫(yī)療保險內控制度
- 抽紙定制合同協(xié)議書
- 物料代購服務合同
- 2025-2026學年人教版小學音樂四年級上冊期末綜合測試卷及答案
- 高數(shù)上冊期末考試及答案
- 風電場運維安全責任書2025年版
- 臘八蒜的課件
評論
0/150
提交評論