快速业务通道

消除JDBC的瓶颈 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-23
get the results. If an update fails, then rollback //the transaction and rethrow the exception. try { sqlProcessor.handleUpdate(sql, pStmntValues, processor, conn); } catch(DatabaseUpdateException e) { rollbackTransaction(); throw e; } } public void commitTransaction() { //Try to commit and release all resources try { conn.commit(); sqlProcessor.closeConn(conn); //If something happens, then attempt a rollback and release resources } catch(Exception e) { rollbackTransaction(); throw new DatabaseUpdateException("Could not commit the current transaction."); } } private void rollbackTransaction() { //Try to rollback and release all resources try { conn.rollback(); conn.setAutoCommit(true); sqlProcessor.closeConn(conn); //If something happens, then just swallow it } catch(SQLException e) { sqlProcessor.closeConn(conn); } } }

SQLTransaction拥有许多新的方法,但是其中的大部分都是很简单的,并且只处理连接或者事务处理。在整个事务周期内,这个事务封装类只是在SQLProcessor中增加了一个简单的连接管理。当一个事务开始时,它接收一个新的连接,并且将其自动提交属性设置为false。其后的每个执行都是使用同一个连接(传送到SQLProcessor的handleUpdate()方法中),因此事务保持完整。

只有当我们的持久性对象或者方法调用commitTransaction()时,事务才被提交,并且关闭连接。如果在执行期间发生了异常,SQLTransaction可以捕捉该异常,自动进行回滚,并且抛出异常。

消除JDBC的瓶颈(7)

时间:2010-09-13

事务例子

让我们来看一个简单的事务

//Reuse the SQL_UPDATE_USER statement defined above public static void updateUsers(User[] users) { //Get our transaction SQLTransaction trans = sqlProcessor.startTransaction(); //For each user, update it User user = null; for(int i = 0; i < users.length; i++) { user = users[i]; trans.executeUpdate(SQL_UPDATE_USER, new Object[] {user.getUserName(), user.getFirstName(), user.getLastName(), user.getEmail(), new Integer(user.getId())}, new MandatoryUpdateProcessor()); } //Now commit the transaction trans.commitTransaction(); }

上面为我们展示了一个事务处理的例子,虽然简单,但我们可以看出它是如何工作的。如果在执行executeUpdate()方法调用时失败,这时将会回滚事务,并且抛出一个异常。调用这个方法的开发者从不需要担心事务的回滚或者连接是否已经关闭。这些都是在后台处理的。开发者只需要关心商业的逻辑。

事务也可以很轻松地处理一个查询,不过这里我没有提及,因为事务通常都是由一系列的更新组成的。

问题

在我写这篇文章的时候,对于这个架构,我提出了一些疑问。这里我将这些问题提出来,因为你们可能也会碰到同样的问题。

自定义连接

如果每个事务使用的连接不一样时会如何?如果ConnectionManager需要一些变量来告诉它从哪个连接池得到连接?你可以很容易就将这些特性集合到这个架构中。executeQuery() 和 executeUpdate()方法(属于SQLProcessor和SQLTransaction类)将需要接收这些自定义的连接参数,并且将他们传送到ConnectionManager。要记得所有的连接管理都将在执行的方法中发生。

此外,如果更面向对象化一点,连接制造者可以在初始化时传送到SQLProcessor中。然后,对于每个不同的连接制造者类型,你将需要一个SQLProcessor实例。根据你连接的可变性,这或许不是理想的做法。

ResultProcessor返回类型

为什么Result

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号