【问题标题】:Java, JDBC connection pool, JDBC connection rollbackJava、JDBC连接池、JDBC连接回滚
【发布时间】:2011-10-10 02:21:52
【问题描述】:

我们有一个数据库连接池(java JDBC)。每次结账时,我们先做抢占式连接回滚,避免连接异常。请忽略商业案例。单从技术角度来看,JDBC连接回滚对应用性能影响很大吗(因为我们的应用是毫秒级业务)?

【问题讨论】:

    标签: java jdbc rollback


    【解决方案1】:

    我不明白为什么直接来自连接池的连接需要回滚。它们的状态必须是空闲的,否则你将无法从池中获取它们?!

    事务对性能有影响。 因此,如果存在无法回滚的事务,则可能有一些查询无法执行,因为悬空事务阻塞了它们。

    因此,如果您的应用程序对时间要求很高 - 您应该投入一些时间来优化您的代码。仅在必要时使用交易。

    【讨论】:

      【解决方案2】:

      没有连接回滚之类的东西。也许您的意思是事务回滚。除非您打算丢失在事务中对数据库所做的任何更改,否则您不应回滚,除非您打算提交事务中所做的所有更改,否则您不应提交。

      话虽如此,但我不明白“我们首先进行抢先式连接回滚以避免连接异常”这一术语,以及您为什么首先要这样做。假设您指的是 Connection.rollback() 方法调用,我认为这是一种不好的做法。这实际上会导致性能损失,因为它需要网络调用,并强制数据库丢弃关联事务的状态(这在这种情况下没有意义,因为尚未完成任何工作)。

      如果您打算避免涉及从连接池中检索到死连接的异常,则必须在将连接返回给应用程序之前配置连接池以检查连接是否过时(通常通过执行测试 SQL 语句)。一旦应用程序获得了连接,它不应该在不再需要连接后保留它;理想情况下,应用程序应该将连接返回到池。如果您发现自己保留了连接对象,则底层物理连接无法供其他请求使用,并且实际上可能会被配置为关闭超过特定持续时间的连接的防火墙关闭。

      【讨论】:

        【解决方案3】:

        完全同意法力。

        您从池中“签出”一个连接,然后使用它,然后在完成后将其返回给池。

        请查看 JBoss 连接池逻辑,或者直接使用生产级连接池包。

        Connection pooling options with JDBC: DBCP vs C3P0有讨论

        【讨论】:

          【解决方案4】:

          验证来自池的连接的适当方法是使用validation query。如果回滚是因为有人担心可能有一个“脏”连接返回到池中,那么您需要使用real resource management framework

          【讨论】:

            猜你喜欢
            • 2016-07-06
            • 2011-03-06
            • 1970-01-01
            • 1970-01-01
            • 2018-09-10
            • 2014-08-15
            • 1970-01-01
            • 2013-05-01
            • 1970-01-01
            相关资源
            最近更新 更多