0

目前我正在为事务管理做的是:

Connection connection = getConnection();
connection.setAutoCommit(false);
updateTableX ( connection, ... );
updateTableY ( connection, ... );
connection.commit();
closeConnection();

我想知道,是否可以避免在我的“updateTableX”方法中关闭连接。因为如果有人不小心关闭了连接,那么我的 updateTableY 将没有连接,它会抛出异常。

4

4 回答 4

4

只是纪律。一般来说,方法不应该尝试负责关闭作为参数传递给它们的东西——除了创建一个新对象来包装现有对象的情况。

避免关闭连接的updateTableX方法只是确保您不调用close()代码。这实际上与任何其他错误没有什么不同。您如何停止updateTableX任意更新不同的表,或抛出异常,或做任何其他不该做的事情?代码审查、单元测试、集成测试、手动测试等...

我的意思是你可以编写一个Connection实现来包装另一个连接并通过except close()代理所有方法,但这听起来像浪费时间 - 如果你不相信所涉及的开发人员不会关闭连接,你相信他们会得到其余的吗代码对吗?

于 2009-07-01T06:08:51.840 回答
2

就像乔恩说的那样,如果你真的想禁止调用close(),你可以编写一个装饰器实现来转发你的“真实”Connection对象。我不贴代码示例,因为Connection接口太大。然而,使用现代 IDE 生成代码是没有问题的。

配方(假设您使用的是 Eclipse):

  1. 创建一个实现Connection但不实现方法的类
  2. 创建一个字段private Connection delegate;
  3. 选择字段名称 -> 源(菜单) -> “使用字段生成构造函数” -> 确保选中该字段并按确定
  4. 选择字段名称 -> 源(菜单) -> “生成委托方法...” -> 检查字段上的每个方法
  5. 更改close()方法的实现以抛出UnsupportedOperationException

然而就像乔恩说的那样,我真的会考虑做这样的事情。也许您只是使用 Object-Relational-Mapper(例如Hiberate)来封装您的所有数据库访问逻辑。在这方面另一个非常有用的框架是Spring,特别是如果你不想关心ConnectionDataSource处理。

于 2009-07-01T06:22:05.953 回答
0

(我特别不熟悉Java)

假设您有某种数据库管理对象,您可以让它在尝试任何操作之前确保它已连接。

您可以尝试限制访问以关闭连接,但您将如何决定是否应该关闭它,或者它是否是“意外的”(但是您定义它)​​?

于 2009-07-01T06:08:03.837 回答
0

我不认为你在问什么是可能的。

从技术上讲,您可以复制您的连接对象,但是如果客户端程序员关闭连接会发生什么?

于 2009-07-01T06:09:31.637 回答