麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學院 > 開發設計 > 正文

消除JDBC的瓶頸

2019-11-18 13:51:40
字體:
來源:轉載
供稿:網友

  摘要

  大部分的J2EE(java 2 Platform, EnterPRise Edition)和其它類型的Java應用都需要與數據庫進行交互。與數據庫進行交互需要反復地調用SQL語句、連接治理、事務生命周期、結果處理和異常處理。這些操作都是很常見的;不過這個重復的使用并不是必定需要的。在這篇文章中,我們將介紹一個靈活的架構,它可以解決與一個兼容JDBC的數據庫的重復交互問題。

  最近在為公司開發一個小的J2EE應用時,我對執行和處理SQL調用的過程感到很麻煩。我認為在Java開發者中一定有人已經開發了一個架構來消除這個流程。不過,搜索諸如"Java SQL framework" 或者 "JDBC [Java Database Connectivity] framework"等都沒有得到滿足的結果。

  問題的提出?

  在講述一個解決方法之前,我們先將問題描述一下。假如你要通過一個JDBC數據源執行SQL指令時,你通常需要做些什么呢?

  1、建立一個SQL字符串

  2、得到一個連接

  3、得到一個預處理語句(prepared statement)

  4、將值組合到預處理語句中

  5、執行語句

  6、遍歷結果集并且形成結果對象

  還有,你必須考慮那些不斷產生的SQLExceptions;假如這些步驟出現不同的地方,SQLExecptions的開銷就會復合在一起,因為你必須使用多個try/catch塊。

  不過,假如我們仔細地觀察一下這些步驟,就可以發現這個過程中有幾個部分在執行期間是不變的:你通常都使用同一個方式來得到一個連接和一個預處理語句。組合預處理語句的方式通常也是一樣的,而執行和處理查詢則是特定的。你可以在六個步驟中提取中其中三個。即使在有點不同的步驟中,我們也可以在其中提取出公共的功能。但是我們應該怎樣自動化及簡化這個過程呢?

  查詢架構

  我們首先定義一些方法的簽名,這些方法是我們將要用來執行一個SQL語句的。要注重讓它保持簡單,只傳送需要的變量,我們可以編寫一些類似下面簽名的方法:

public Object[] executeQuery(String sql, Object[] pStmntValues,
ResultProcessor processor);
  我們知道在執行期間有所不同的方面是SQL語句、預處理語句的值和結果集是如何分析的。很明顯,sql參數指的是SQL語句。pStmntValues對象數據包含有必須插入到預處理語句中的值,而processor參數則是處理結果集并且返回結果對象的一個對象;我將在后面更具體地討論這個對象。

  在這樣一個方法簽名中,我們就已經將每個JDBC數據庫交互中三個不變的部分隔離開來?,F在讓我們討論exeuteQuery()及其它支持的方法,它們都是SQLProcessor類的一部分:

public class SQLProcessor {

public Object[] executeQuery(String sql, Object[] pStmntValues,
ResultProcessor processor) {

//Get a connection (assume it's part of a ConnectionManager class)
Connection conn = ConnectionManager.getConnection();

//Hand off our connection to the method that will actually execute
//the call
Object[] results = handleQuery(sql, pStmntValues, processor, conn);

//Close the connection
closeConn(conn);

//And return its results
return results;
}

protected Object[] handleQuery(String sql, Object[] pStmntValues,
ResultProcessor processor, Connection conn) {

//Get a prepared statement to use
PreparedStatement stmnt = null;

try {

//Get an actual prepared statement
stmnt = conn.prepareStatement(sql);

//Attempt to stuff this statement with the given values. If
//no values were given, then we can skip this step.
if(pStmntValues != null) {
PreparedStatementFactory.buildStatement(stmnt, pStmntValues);
}

//Attempt to execute the statement
ResultSet rs = stmnt.executeQuery();

//Get the results from this query
Object[] results = processor.process(rs);

//Close out the statement only. The connection will be closed by the
//caller.
closeStmnt(stmnt);

//Return the results
return results;

//Any SQL exceptions that occur should be recast to our runtime query
//exception and thrown from here
} catch(SQLException e) {
String message = "Could not perform the query for " + sql;

//Close out all resources on an exception
closeConn(conn);
closeStmnt(stmnt);

//And rethrow as our runtime exception
throw new DatabaseQueryException(message);
}
}
}
...
}

  在這些方法中,有兩個部分是不清楚的:PreparedStatementFactory.buildStatement() 和 handleQuery()'s processor.process()方法調用。buildStatement()只是將參數對象數組中的每個對象放入到預處理語句中的相應位置。例如:



發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 黄色大片免费网站 | 全黄毛片 | 性爱在线免费视频 | 国产资源在线免费观看 | 亚州视频在线 | 日本欧美一区二区三区在线观看 | 久色婷婷| 国产1区在线观看 | 偿还电影免费看 | 久久国产精品影视 | 精品一二三区视频 | 深夜小视频在线观看 | 九九视频精品在线观看 | 中国免费一级毛片 | chengrenzaixian | 久久爽久久爽久久av东京爽 | 一区二区三区日韩电影 | 免费a级网站 | 一区二区免费看 | 特片网久久| 国产精品视频专区 | av国产在线被下药迷网站 | 精品国产91久久久久久浪潮蜜月 | 亚洲免费在线视频 | 欧美激情综合在线 | 久久精品成人影院 | 91麻豆蜜桃一区二区三区 | 性 毛片| 中文日韩| 男女无遮挡羞羞视频 | 国产精品久久久久av | 成人在线免费观看网址 | 国产超碰人人做人人爱ⅴa 国产精品久久久久久久hd | 毛片在线视频在线播放 | 欧美a∨一区二区三区久久黄 | 久色精品视频 | 欧美一区黄色 | 成av人在线观看 | 久久精品一级片 | 一级电影在线免费观看 | 超级av在线|