【问题标题】:Java JDBC Connection Sharing/relaying between methods方法之间的 Java JDBC 连接共享/中继
【发布时间】:2012-10-25 00:58:06
【问题描述】:

我正在开发一个 WebApp,想知道在方法之间共享 JDBC 连接对象是否有任何优点/缺点

所以情况是

  • 它是一个 WebApp 和多用户环境(大约 1000 个用户同时使用)
  • 我正在使用支持连接池的容器 (Weblogic Server)
  • 我在 JDBC 调用中使用事务
  • 我的大部分 JDBC 调用都是单记录插入/更新,但选择/删除可以批量发生

现在我有两种方法

方法 1 打开连接对象一次并在方法间中继它

// Just a Pseudo Code

Cn = OpenJDBConnection() // This will open up the  connection 
obj.Task1(Cn, Param1, Param2);
obj.Task2(Cn, Param1, Param2);
obj.Task3(Cn, Param1, Param2);
Cn.close();

方法 2 在每个方法中打开和关闭连接

我倾向于方法 1,因为这样我就可以避免一些样板代码。但我不确定它是否是线程安全的?我有一个 100 个连接的池大小,我认为这对于在给定时间活跃的 1000 个用户来说是可以的

在采用其中一种方法之前,我还有什么需要考虑的

【问题讨论】:

    标签: java jdbc


    【解决方案1】:

    考虑在连接级别管理事务。

    对于您的简单用例,方法 #1 可能有效,但很容易遇到这样的情况,例如,您在连接上有待处理的事务,并调用另一个在同一连接上执行选择的方法,这将导致您的事务提交(比您预期的要早)。

    使用正确配置的连接池,释放和重新获取连接的开销应该是最小的,所以我建议方法 #2。池化时,关闭连接并不会真正关闭它,而是让它保持打开状态并将其返回到池中。

    【讨论】:

    • 事务和连接的 1:1 相关性应该足以成为不共享连接的理由。很明显,它们应该附加到单个工作单元,因此不应该同时共享。
    • 谢谢,但您能否在causing a connection to commit earlier 上向我解释一下我正在管理连接级别的事务,但我确实启动并明确提交事务,是否有可能更早提交?考虑到我的交易不跨越我的方法
    • 对于大多数数据库,如果您在连接上打开了事务,然后在连接上发出 select 语句,事务将自动提交。
    猜你喜欢
    • 2010-11-23
    • 2012-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多