我们有一个数据库连接池(java JDBC)。每次我们结账时,我们首先进行抢先连接回滚以避免连接异常。请忽略商业案例。仅从技术角度来看,JDBC连接回滚是否会影响应用程序性能(因为我们的应用程序是mili-second business)?
答案 0 :(得分:2)
我不明白为什么需要回滚直接来自连接池的连接。他们的州必须闲置,否则你将无法从游泳池中获得它们!!
交易对绩效有影响。 因此,如果存在可以回滚的事务,则可能存在一些无法执行的查询,因为悬空事务阻止了它们。
因此,如果您的应用程序对时间至关重要 - 您应该投入一些时间来优化代码。仅在必要时使用交易。
答案 1 :(得分:2)
没有连接回滚这样的东西。也许你的意思是事务回滚。除非您打算丢失事务中数据库中所做的任何更改,否则永远不应该回滚,除非您打算提交事务中所做的所有更改,否则不应该提交。
话虽如此,我不理解术语“我们首先做抢先连接回滚以避免连接异常”以及为什么你会首先这样做。假设您指的是Connection.rollback()
方法调用,我认为这是一个不好的做法。它实际上会导致性能损失,因为它需要网络调用,并强制数据库丢弃关联事务的状态(在这种情况下没有意义,因为还没有完成工作)。
如果要避免从连接池中检索到涉及死连接的异常,则必须先配置池以检查连接是否过时(通常通过执行测试SQL语句),然后再将连接返回到应用程序。一旦应用程序获得了连接,它就不应该在它不再需要之后保持连接;理想情况下,应用程序应返回到池的连接。如果您发现自己保留了连接对象,则其他请求无法使用基础物理连接,并且实际上可以通过配置为关闭超过特定持续时间的活动连接的防火墙来关闭它。
答案 2 :(得分:1)
完全同意法术力。
您“检查”来自池的连接,然后使用它,然后在完成后将其返回池中。
请查看JBoss连接池逻辑,或者使用生产级连接池包。
进行了讨论答案 3 :(得分:1)
验证来自池的连接的适当方法是使用validation query。如果回滚是因为有人担心可能会有一个“脏”连接返回到池中,那么您需要使用real resource management framework。