JDBC面試問題
1.
什麼是JDBC API,何時使用它?
Java DataBase Connectivity API允許我們使用關係資料庫。JDBC API介面和類是part java.sql和javax.sqlpackage的一部分。我們可以使用JDBC API來獲取資料庫連線,在資料庫伺服器中執行SQL查詢和儲存過程並處理結果。
JDBC API的編寫方式允許我們的Java程式和實際的JDBC驅動程式之間的鬆散耦合,這使我們可以輕鬆地從一個數據庫切換到另一個數據庫伺服器。
2.
JDBC驅動程式有哪幾種類型?
有四種類型的JDBC驅動程式。任何與資料庫一起工作的java程式都有兩個部分,第一部分是JDBC API,第二部分是執行實際工作的驅動程式。
JDBC-ODBC Bridge加ODBC驅動程式(型別1):它使用ODBC驅動程式連線到資料庫。我們應該安裝ODBC驅動程式來連線資料庫,這就是為什麼這個驅動程式幾乎已經過時的原因。
Native API部分支援Java技術的驅動程式(型別2):此驅動程式將JDBC類轉換為資料庫伺服器的客戶端API。我們應該安裝資料庫客戶端API。由於對資料庫客戶端API驅動程式的額外依賴性,這也不是首選驅動程式。
用於資料庫中介軟體的純Java驅動程式(型別3):此驅動程式將JDBC呼叫傳送到可以連線到不同型別資料庫的中介軟體伺服器。我們應該安裝一箇中間件伺服器來使用這個驅動程式。這增加了額外的網路呼叫和效能降低,這就是為什麼不廣泛使用JDBC驅動程式。
直接到資料庫的純Java驅動程式(型別4):此驅動程式將JDBC呼叫轉換為資料庫伺服器可以理解的網路協議。該解決方案簡單,適用於網路上的資料庫連線。但是對於此解決方案,我們應該使用特定於資料庫的驅動程式,例如Oracle for Oracle DB的OJDBC jar和MySQL Connector的MySQL Connector / J.
3.
JDBC API如何幫助我們實現Java程式和JDBC驅動程式API之間的鬆散耦合?
JDBC API使用Java Reflection API實現java程式和JDBC驅動程式之間的鬆散耦合。如果你看一個簡單的JDBC例子,你會發現所有的程式設計都是用JDBC API完成的,而驅動程式只有在通過反射使用Class.forName()方法載入時才會出現。
我認為這是在核心java類中使用Reflection的最佳示例之一,以確保我們的應用程式不能直接使用Drivers API,這使得從一個數據庫移動到另一個數據庫變得非常容易。
4.
什麼是JDBC連線?解釋在簡單的java程式中獲取資料庫連線的步驟。
JDBC Connection就像使用資料庫伺服器建立的Session。您還可以將Connection 視為來自資料庫伺服器的Socket連線。
建立JDBC連線非常簡單,需要兩個步驟:
註冊並載入驅動程式:使用Class.forName(),驅動程式類註冊到DriverManager並載入到記憶體中。
使用DriverManager獲取Connection物件:我們DriverManager.getConnection()通過傳遞資料庫URL字串,使用者名稱和密碼作為引數來獲取連線物件。
Connection con = null;try{ // 載入驅動類 Class.forName("com.mysql.jdbc.Driver"); // 建立連線 con = DriverManager.getConnection("jdbc:mysql://localhost:3306/UserDB", "pankaj", "pankaj123"); }catch (SQLException e) { System.out.println("Check database is UP and configs are correct"); e.printStackTrace(); }catch (ClassNotFoundException e) { System.out.println("Please include JDBC MySQL jar in classpath"); e.printStackTrace(); }
5.
JDBC DriverManager類有什麼用?
JDBC DriverManager是我們通過它獲取資料庫連線物件的工廠類。當我們載入JDBC Driver類時,它將自己註冊到DriverManager,您可以查詢JDBC Driver類原始碼來檢查它。
當我們通過傳遞資料庫配置細節來呼叫方法DriverManager.getConnection()時,DriverManager使用已註冊的驅動程式來獲取Connection並將其返回給呼叫者程式。
6.
如何在java程式中獲取資料庫伺服器的詳細資訊?
我們可以使用DatabaseMetaDataobject來獲取資料庫伺服器的詳細資訊。成功建立資料庫連線後,我們可以通過呼叫getMetaData()方法獲取元資料物件。我們可以使用DatabaseMetaData中的方法來獲取資料庫產品名稱,版本和詳細的配置資訊。
DatabaseMetaData metaData = con.getMetaData();String dbProduct = metaData.getDatabaseProductName();
7.
什麼是JDBC Statement?
JDBC API Statement用於在資料庫中執行SQL查詢。我們可以通過呼叫Connection createStatement()方法來建立Statement物件。我們可以使用Statement通過不同的執行方法傳遞查詢來執行靜態SQL查詢,例如execute(),executeQuery(),executeUpdate()等。
由於查詢是在java程式中生成的,如果未正確驗證使用者輸入,則可能導致SQL注入問題,可以在SQL注入示例中找到更多詳細資訊。
預設情況下,每個Statement物件只能同時開啟一個ResultSet物件。因此,如果我們想要使用多個ResultSet物件,則每個物件必須由不同的Statement物件生成。Statement介面中的所有execute()方法都隱式關閉一個statment的當前ResultSet物件(如果存在open物件)。
8.
execute,executeQuery,executeUpdate有什麼區別?
Statement execute(String query)用於執行任何SQL查詢,如果結果是ResultSet(如執行Select查詢),則返回TRUE。當沒有ResultSet物件(如執行Insert或Update查詢)時,輸出為FALSE。我們可以使用getResultSet()獲取ResultSet和getUpdateCount()方法來檢索更新計數。
Statement executeQuery(String query)用於執行Select查詢並返回ResultSet。即使沒有與查詢匹配的記錄,返回的ResultSet也永遠不會為null。執行select查詢時,我們應該使用executeQuery方法,這樣如果有人試圖執行insert / update語句,它將丟擲java.sql.SQLException,並顯示訊息“executeQuery方法不能用於更新”。
語句executeUpdate(String query)用於執行不返回任何內容的Insert / Update / Delete(DML)語句或DDL語句。輸出為int,等於SQL資料操作語言(DML)語句的行數。對於DDL語句,輸出為0。
只有在不確定語句型別時才應使用execute()方法,否則使用executeQuery或executeUpdate方法。
9.
什麼是JDBC PreparedStatement?
JDBC PreparedStatement物件表示預編譯的SQL語句。我們可以使用它的setter方法來設定查詢的變數。
由於PreparedStatement是預編譯的,因此可以使用它多次有效地執行此語句。PreparedStatement是Statement的更好選擇,因為它會自動轉義特殊字元並避免SQL注入攻擊。
10.
如何在JDBC PreparedStatement中設定NULL值?
我們可以使用PreparedStatement setNull()方法將null變數繫結到引數。例如,setNull方法將index和SQL Types作為引數 ps.setNull(10, java.sql.Types.INTEGER);。
11.
Statement中的getGeneratedKeys()方法有什麼用?
有時,表可以使用自動生成的鍵來插入主鍵的唯一列值。我們可以使用Statement getGeneratedKeys()方法獲取此自動生成金鑰的值。
12.
PreparedStatement對Statement有什麼好處?
PreparedStatement對Statement的一些好處是:
PreparedStatement幫助我們防止SQL注入攻擊,因為它會自動轉義特殊字元。
PreparedStatement允許我們使用引數輸入執行動態查詢。
PreparedStatement比Statement快。當我們重用PreparedStatement或使用它的批處理方法執行多個查詢時,它變得更加明顯。
PreparedStatement幫助我們使用setter方法編寫面向物件的程式碼,而使用Statement我們必須使用String Concatenation來建立查詢。如果要設定多個引數,則使用字串連線編寫查詢看起來非常難看並且容易出錯。
13.
PreparedStatement的限制是什麼以及如何克服它?
PreparedStatement的一個限制是我們不能直接在IN子句中使用它。將PreparedStatement與IN子句一起使用的一些替代方法是:
執行單一查詢 效能非常慢,不推薦使用
使用儲存過程 特定於資料庫,因此不適用於多個數據庫應用程式。
動態建立PreparedStatement查詢 良好的方法但失去了快取的PreparedStatement的好處。
在PreparedStatement查詢中使用NULL 當您知道變數輸入的最大數量時,這是一種很好的方法,可以通過部分執行來擴充套件以允許無限制的引數。 可以在JDBC PreparedStatement IN子句替代中找到更詳細的分析。
14.
什麼是JDBC ResultSet?
JDBC ResultSet就像一個表示資料庫結果集的資料表,通常通過執行查詢資料庫的語句來生成。
ResultSet物件維護指向其當前資料行的遊標。最初,游標位於第一行之前。next()方法將游標移動到下一行。如果沒有更多行,則next()方法返回false,並且可以在while迴圈中使用它來迭代結果集。
預設的ResultSet物件不可更新,並且只有一個向前移動的遊標。因此,您只能迭代一次,並且只能從第一行到最後一行。可以使用以下語法生成可滾動和/或可更新的ResultSet物件。
Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);
當生成它的Statement物件關閉,重新執行或用於從多個結果序列中檢索下一個結果時,ResultSet物件將自動關閉。
我們可以使用ResultSet getter方法,列名或索引號從1開始檢索列資料。
15.
ResultSet有哪些不同的型別?
在建立Statement時,我們可以根據使用者輸入獲得不同型別的ResultSet物件。如果您將檢視Connection方法,您將看到createStatement()和prepareStatement()方法被過載以提供ResultSet型別和併發作為輸入引數。
ResultSet物件有三種類型。
ResultSet.TYPEFORWARDONLY:這是預設型別,遊標只能在結果集中向前移動。
ResultSet.TYPESCROLLINSENSITIVE:遊標可以前後移動,結果集對建立結果集後其他人對資料庫所做的更改不敏感。
ResultSet.TYPESCROLLSENSITIVE:遊標可以向前和向後移動,結果集對建立結果集後其他人對資料庫所做的更改很敏感。 基於併發性,有兩種型別的ResultSet物件。
ResultSet.CONCURREADONLY:結果集是隻讀的,這是預設的併發型別。
ResultSet.CONCUR_UPDATABLE:我們可以使用ResultSet更新方法來更新行資料。
16.
Statement中的setFetchSize()和setMaxRows()方法有什麼用?
我們可以使用setMaxRows(int i)方法來限制資料庫從查詢返回的行數。您可以使用SQL查詢本身實現相同的功能。例如,在MySQL中,我們可以使用LIMIT子句來設定查詢返回的最大行數。
理解fetchSize可能很棘手,因為你應該知道Statement和ResultSet是如何工作的。當我們在資料庫中執行查詢時,將在資料庫快取中獲取並維護結果,並返回ResultSet。ResultSet是具有對資料庫中結果的引用的遊標。
假設我們有一個返回100行的查詢,並且我們將fetchSize設定為10,因此在每次資料庫訪問時,JDBC驅動程式將只獲取10行,因此將有10次訪問以獲取所有行。如果每行需要大量處理時間並且結果中的行數很大,那麼設定最佳fetchSize會很有幫助。
我們可以通過Statement物件設定fetchSize,但可以通過ResultSet物件setFetchSize()方法覆蓋它。
17.
如何使用JDBC API呼叫儲存過程?
儲存過程是一組SQL查詢,它們在資料庫中編譯,可以從JDBC API執行。JDBC CallableStatement可用於在資料庫中執行儲存過程。初始化CallableStatement的語法是;
CallableStatement stmt = con.prepareCall("{call insertEmployee(?,?,?,?,?,?)}");stmt.setInt(1, id);stmt.setString(2, name);stmt.setString(3, role);stmt.setString(4, city);stmt.setString(5, country);//我們需要在呼叫儲存過程之前註冊外部引數stmt.registerOutParameter(6, java.sql.Types.VARCHAR);stmt.executeUpdate();
我們需要在執行CallableStatement之前註冊OUT引數。
18.
什麼是JDBC批處理,它有什麼好處?
有時我們需要為資料庫執行類似的批量查詢,例如將資料從CSV檔案載入到關係資料庫表。我們知道我們可以選擇使用Statement或PreparedStatement來執行查詢。除此之外,JDBC API還提供了批處理功能,通過該功能,我們可以一次性為資料庫執行大量查詢。
JDBC API支援通過Statement和PreparedStatement addBatch()以及executeBatch()方法進行批處理。
批處理比一次執行一個語句更快,因為資料庫呼叫的數量較少。
19.
什麼是JDBC事務管理?我們為什麼需要它?
預設情況下,當我們建立資料庫連線時,它以自動提交模式執行。這意味著無論何時執行查詢並完成查詢,都會自動觸發提交。因此,我們觸發的每個SQL查詢都是一個事務,如果我們執行一些DML或DDL查詢,則每個SQL語句完成後,更改都會儲存到資料庫中。
有時我們希望一組SQL查詢成為事務的一部分,以便我們可以在所有查詢執行正常時提交它們,如果我們得到任何異常,我們可以選擇回滾作為事務的一部分執行的所有查詢。
JDBC API提供了一種方法,setAutoCommit(boolean flag)通過該方法我們可以禁用連線的自動提交功能。我們應該僅在需要時禁用自動提交,因為除非我們在連線上呼叫commit()方法,否則不會提交事務。資料庫伺服器使用表鎖來實現事務管理,這是資源密集型過程。所以我們應該在完成交易後立即提交交易。
20.
如何回滾JDBC事務?
我們可以使用Connection物件rollback()方法來回滾事務。它將回滾事務所做的所有更改,並釋放此Connection物件當前持有的所有資料庫鎖。
21.
什麼是JDBC Savepoint?如何使用它?
有時,事務可以是多個語句的組,我們希望回滾到事務中的特定點。JDBC Savepoint幫助我們在事務中建立檢查點,並且我們可以回滾到該特定檢查點。
為事務建立的任何儲存點都會自動釋放,並在提交事務時或在回滾整個事務時變為無效。將事務滾動回儲存點會自動釋放並使在相關儲存點之後建立的任何其他儲存點無效。
22.
什麼是JDBC DataSource?它的好處是什麼?
JDBC DataSource是javax.sql包中定義的介面,它比DriverManager更強大,可用於資料庫連線。我們可以使用DataSource來建立資料庫連線,而Driver實現類可以用來獲取連線的實際工作。除了獲取資料庫連線外,DataSource還提供了一些其他功能,例如:
快取PreparedStatement以加快處理速度 連線超時設定 記錄功能 ResultSet最大大小閾值 使用JNDI支援在servlet容器中連線池 在JDBC DataSource上閱讀有關DataSource的更多資訊。
23.
如何在Apache Tomcat Server中使用JDBC DataSource和JNDI實現JDBC連線池?
對於部署在servlet容器中的Web應用程式,建立JDBC連線池非常簡單,只需要幾個步驟。
在容器配置檔案中建立JDBC JNDI資源,通常是server.xml或context.xml。例如
server.xml
context.xml在Web應用程式中,使用InitialContext查詢在第一步中配置的JNDI資源,然後獲取連線。
Context ctx = new InitialContext();DataSource ds = (DataSource) ctx.lookup("java:/comp/env/jdbc/MyLocalDB");24.
什麼是Apache DBCP API?
如果您使用DataSource獲取資料庫連線,通常用於獲取連線的程式碼與特定於驅動程式的DataSource實現緊密耦合。除了選擇DataSource實現類之外,大多數程式碼都是樣板程式碼。
Apache DBCP通過提供DataSource實現來幫助我們擺脫這些問題,DataSource實現充當我們的程式和不同JDBC驅動程式之間的抽象層。Apache DBCP庫依賴於Commons Pool庫,因此請確保它們都在構建路徑中。
25.
什麼是JDBC連線隔離級別?
當我們使用JDBC事務來實現資料完整性時,DBMS使用鎖來阻止其他人訪問事務所訪問的資料。DBMS使用鎖來防止髒讀,不可重複讀和幻像讀問題。
DBMS使用JDBC事務隔離級別來使用鎖定機制,我們可以通過Connection getTransactionIsolation()方法獲取隔離級別資訊,並使用setTransactionIsolation()方法設定它。
26.
什麼是JDBC RowSet?RowSet有哪些型別?
JDBC RowSet以更靈活的方式儲存表格資料,即ResultSet。所有RowSet物件都是從ResultSet派生的,因此它們具有ResultSet的所有功能以及一些其他功能。RowSet介面在javax.sql包中定義。
RowSet提供的一些附加功能包括:
具有屬性的Java Bean及其getter-setter方法。RowSet使用JavaBeans事件模型,它們可以向任何已註冊的元件傳送通知,用於事件,例如游標移動,更新/插入/刪除行以及更改為RowSet內容。
預設情況下,RowSet物件是可滾動和可更新的,因此如果DBMS不支援可滾動或可更新的ResultSet,我們可以使用RowSet來獲取這些功能。
RowSet大致分為兩種型別:
已連線的RowSet物件 - 這些物件連線到資料庫,與ResultSet物件最相似。JDBC API僅提供一個連線的RowSet物件javax.sql.rowset.JdbcRowSet,它的標準實現類是com.sun.rowset.JdbcRowSetImpl 斷開連線的RowSet物件 - 這些RowSet物件不需要連線到資料庫,因此它們更輕量級且可序列化。它們適合通過網路傳送資料。有四種類型的斷開連線的RowSet實現。
CachedRowSet - 它們可以獲取連線並執行查詢並讀取ResultSet資料以填充RowSet資料。我們可以在資料斷開連線時操作和更新資料,並重新連線到資料庫並寫入更改。 WebRowSet派生自CachedRowSet - 它們可以讀寫XML文件。 JoinRowSet派生自WebRowSet - 它們可以形成SQL JOIN而無需連線到資料來源。 從WebRowSet派生的FilteredRowSet - 我們可以應用過濾條件,以便只有選定的資料可見。
27.
ResultSet和RowSet有什麼不同?
RowSet物件派生自ResultSet,因此它們具有ResultSet的所有功能以及一些附加功能。RowSet的一大好處是它們可以斷開連線,使其輕量級,並且易於通過網路傳輸。
是否使用ResultSet或RowSet取決於您的要求,但如果您計劃使用ResultSet更長的持續時間,則斷開連線的RowSet是釋放資料庫資源的更好選擇。
28.
常見的JDBC異常有哪些?
一些常見的JDBC異常是:
java.sql.SQLException - 這是JDBC異常的基本異常類。 java.sql.BatchUpdateException - 當Batch操作失敗時丟擲此異常,但它依賴於JDBC驅動程式是否丟擲此異常或基本SQLException。 java.sql.SQLWarning - 用於SQL操作中的警告訊息。 java.sql.DataTruncation - 當資料值因超出MaxFieldSize而被意外截斷時。
29.
JDBC中的CLOB和BLOB資料型別是什麼?
字元大物件(CLOB)是由具有關聯內碼表的單位元組字元組成的字串。此資料型別適用於儲存面向文字的資訊,其中資訊量可能超出常規VARCHAR資料型別的限制(上限為32K位元組)。
二進位制大物件(BLOB)是由位元組組成的二進位制字串,沒有關聯的內碼表。此資料型別可以儲存大於VARBINARY(32K限制)的二進位制資料。此資料型別適用於儲存影象,語音,圖形和其他型別的業務或特定於應用程式的資料。
30.
什麼是JDBC中的“髒讀”?哪個隔離級別可防止髒讀?
當我們處理事務時,有可能更新行,同時其他查詢可以讀取更新的值。這會導致髒讀,因為更新後的值不是永久性的,已更新行的事務可以回滾到先前的值,從而導致無效資料。
隔離級別TRANSACTIONREADCOMMITTED,TRANSACTION_REPEATABLEREAD和TRANSACTIONSERIALIZABLE阻止了髒讀。
31.
什麼是2階段提交?
當我們在涉及多個數據庫的分散式系統中工作時,我們需要使用2階段提交協議。2階段提交協議是分散式系統的原子承諾協議。在第一階段,事務管理器向所有事務資源傳送commit-request。如果所有事務資源都正常,則事務管理器將為所有資源提交事務更改。如果任何事務資源響應為Abort,則事務管理器可以回滾所有事務更改。
32.
JDBC中有哪些不同型別的鎖定?
從廣義上講,有兩種型別的鎖定機制可以防止資料損壞,因為多個使用者使用相同的資料。
樂觀鎖定 - 使用程式碼實現此鎖定。表中引入了一個額外的列以保持更新計數。當您選擇該行時,您也會閱讀此列,比如“version”。現在,當您嘗試更新/刪除行時,將在where子句中傳遞此“version”。因此,如果在其間執行其他執行緒的更新,則更新將失敗。這是避免資料損壞的好方法,但如果有人錯過更新其更新語句中的“version”,則可能容易出錯。通過這種鎖定方式,更新查詢看起來如下所示。
mysql> update emp SET name = 'David', version = 5 WHERE id = 10 and version = 4;悲觀鎖定 - 將記錄從選擇鎖定到讀取,更新和提交階段。這通常由資料庫供應商軟體完成,並通過使用SELECT FOR UPDATE查詢觸發。如果執行緒處理鎖定較長時間,則這種鎖定行的方式可能導致效能降低和死鎖。
除此之外,一些DBMS系統提供鎖定機制來鎖定單行,表或資料庫。
33.
你對DDL和DML語句有什麼瞭解?
資料定義語言(DDL)語句用於定義資料庫模式。建立,更改,刪除,截斷,重新命名語句屬於DDL語句,通常它們不返回任何結果。
資料操作語言(DML)語句用於操縱資料庫模式中的資料。選擇,插入,更新,刪除,呼叫等是DML語句的示例。
34.
java.util.Date和java.sql.Date有什麼區別?
java.util.Date包含有關日期和時間的資訊,而java.sql.Date包含僅有關日期的資訊,它沒有時間資訊。因此,如果您必須在資料庫中保留時間資訊,建議使用Timestamp或DateTime欄位。
35.
如何將影象或原始資料插入資料庫?
我們可以使用BLOB將影象或原始二進位制資料插入資料庫。
36.
什麼是幻像讀取以及哪種隔離級別阻止了它?
虛擬讀取是指事務多次執行查詢並獲取不同資料的情況。假設事務正在執行查詢以根據條件獲取資料,然後另一個事務插入與條件匹配的行。現在,當同一事務再次執行查詢時,新行將成為結果集的一部分。這個新行被稱為Phantom Row,這種情況稱為Phantom Read。
只有使用TRANSACTION_SERIALIZABLE隔離級別才能阻止幻像讀取。
37.
什麼是SQL警告?如何在JDBC程式中檢索SQL警告?
SQLWarning是SQLException的子類,我們可以通過在Connection,Statement和ResultSet物件上呼叫getWarnings()方法來檢索它。SQL警告不會停止指令碼的執行,但會警告使用者警告。
38.
如何使用資料庫物件作為IN / OUT呼叫Oracle儲存過程?
如果Oracle儲存過程具有作為資料庫物件的IN / OUT引數,那麼我們需要在程式中建立相同大小的Object陣列,然後使用它來建立Oracle STRUCT物件。然後我們可以通過呼叫setSTRUCT()方法為資料庫物件設定此STRUCT物件並使用它。
39.
我們什麼時候得到java.sql.SQLException:找不到合適的驅動程式?
當SQL URL字串格式不正確時,您將得到沒有合適的驅動程式發現異常。您可以在使用DriverManager的簡單Java應用程式或使用DataSource的JNDI資源中獲取此異常。異常堆疊跟蹤如下所示。
org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot create JDBC driver of class 'com.mysql.jdbc.Driver' for connect URL ''jdbc:mysql://localhost:3306/UserDB' at org.apache.tomcat.dbcp.dbcp.BasicDataSource.createConnectionFactory(BasicDataSource.java:1452) at org.apache.tomcat.dbcp.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:1371) at org.apache.tomcat.dbcp.dbcp.BasicDataSource.getConnection(BasicDataSource.java:1044)java.sql.SQLException: No suitable driver found for 'jdbc:mysql://localhost:3306/UserDB at java.sql.DriverManager.getConnection(DriverManager.java:604) at java.sql.DriverManager.getConnection(DriverManager.java:221) at com.journaldev.jdbc.DBConnection.getConnection(DBConnection.java:24) at com.journaldev.jdbc.DBConnectionTest.main(DBConnectionTest.java:15)Exception in thread "main" java.lang.NullPointerException at com.journaldev.jdbc.DBConnectionTest.main(DBConnectionTest.java:16)在除錯此異常時,只需檢查日誌中列印的URL,如上面的日誌中URL URL是'jdbc:mysql:// localhost:3306 / UserDB,而它應該是jdbc:mysql:// localhost:3306 / UserDB 。
40
JDBC有哪些最佳實踐?
一些JDBC最佳實踐是:
- 資料庫資源很重,因此請確保在完成後立即關閉它。Connection,Statement,ResultSet和所有其他JDBC物件都定義了close()方法來關閉它們。
- 始終在程式碼中顯式關閉結果集,語句和連線,因為如果您在連線池環境中工作,則可能會將連線返回到池,從而導致開啟的結果集和語句物件導致資源洩漏。
- 關閉finally塊中的資源,以確保即使在異常情況下它們也會關閉。
- 使用批處理進行類似的批量操作。
- 始終對Statement使用PreparedStatement以避免SQL注入並獲得PreparedStatement的預編譯和快取優勢。
- 如果要將批量資料檢索到結果集中,則為fetchSize設定最佳值有助於獲得良好的效能。
- 資料庫伺服器可能不支援所有隔離級別,因此請在假設之前進行檢查。
- 更嚴格的隔離級別會導致效能降低,因此請確保為資料庫連線設定了最佳隔離級別。
- 如果要在Web應用程式中建立資料庫連線,請嘗試使用JNDI上下文使用JDBC DataSource資源來重用連線。
- 當您需要長時間使用ResultSet時,請嘗試使用斷開連線的RowSet。