分享
 
 
 

消除JDBC的瓶颈

王朝other·作者佚名  2008-05-31
窄屏简体版  字體: |||超大  

摘要

大部分的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数据库交互中三个不变的部分隔离开来。现在让我们讨论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()只是将参数对象数组中的每个对象放入到预处理语句中的相应位置。例如:

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有