Java 使用者没有返回到my DB连接池的连接

Java 使用者没有返回到my DB连接池的连接,java,database,algorithm,c#-4.0,Java,Database,Algorithm,C# 4.0,我有一个数据库连接池。有些消费者从该池中获取连接。 但我不能信任这些消费者,因为他们中的很多人都不回我的连接。因此,池饥饿,许多消费者被迫等待无限。 例如: class Consumer{ void someMethod(){ Connection con=Pool.getConnection(); //some bloody steps which throws exception con.goodBye();//giving back

我有一个数据库连接池。有些消费者从该池中获取连接。 但我不能信任这些消费者,因为他们中的很多人都不回我的连接。因此,池饥饿,许多消费者被迫等待无限。 例如:

class Consumer{
    void someMethod(){
        Connection con=Pool.getConnection();
        //some bloody steps which throws exception
        con.goodBye();//giving back the connection to the pool
    }
}
因为例外,也可能是因为傲慢,连接并不总是返回。我没有办法限制消费者类中池api的使用

如何恢复连接?(我无法强迫消费者) 我相信没有傻瓜式的解决办法(也许我没那么聪明)。仍然可以,任何人都可以想出一个很好的解决方案。 我得到的一个解决方案是检查Consumer类中是否发生任何异常,如果发生异常,则完全收回连接力


或者是否有任何新的革命性的DBPool设计模式不太受这类典型场景的欢迎(尽管我认为我的案例非常通用,但任何人都可能忘记将连接返回池。)

您是否尝试在catch子句中捕获异常并关闭连接

class Consumer{
    void someMethod(){
        Connection con=Pool.getConnection();
        try{
             //some bloody steps which throws exception
        }catch(Exception e){
             con.goodBye();
        }
        con.goodBye();//giving back the connection to the pool
    }
}

编辑:您还可以使用
finally
块删除冗余代码,并确保在任何情况下都关闭连接。我假设这是java代码,没有使用C#的经验

您是否尝试在catch子句中捕获异常并关闭连接

class Consumer{
    void someMethod(){
        Connection con=Pool.getConnection();
        try{
             //some bloody steps which throws exception
        }catch(Exception e){
             con.goodBye();
        }
        con.goodBye();//giving back the connection to the pool
    }
}

编辑:您还可以使用
finally
块删除冗余代码,并确保在任何情况下都关闭连接。我假设这是java代码,没有使用C#的经验

我能想到的唯一方法不是让消费者直接访问连接池,而是让他们拥有自己的连接列表。然后在超时后(比如60秒)恢复连接。

我能想到的唯一方法不是让使用者直接访问连接池,而是让他们拥有自己的连接列表。然后在超时后(比如60秒)恢复连接。

这是错误的客户端代码。代码应该处理异常情况,并在完成时关闭连接

但是,如果不这样做,您无法从代码中知道。如果不这样做,那就是客户机代码的错误和问题

有一个合理的超时时间是限制这一点的唯一方法,但最终它仍然不能“解决”它

--

您在评论中提到此池在多个客户端之间共享。当然,这会把责任推回给你

能否将每个客户端限制为一次仅使用X个连接?这样,至少他们一次只能绑这么多人


否则,您可以为每个客户端创建单独的池。这种做法只是将问题向下推,但可能是适当的,这取决于所涉及的物流。

这是糟糕的客户机代码。代码应该处理异常情况,并在完成时关闭连接

但是,如果不这样做,您无法从代码中知道。如果不这样做,那就是客户机代码的错误和问题

有一个合理的超时时间是限制这一点的唯一方法,但最终它仍然不能“解决”它

--

您在评论中提到此池在多个客户端之间共享。当然,这会把责任推回给你

能否将每个客户端限制为一次仅使用X个连接?这样,至少他们一次只能绑这么多人


否则,您可以为每个客户端创建单独的池。这可能只是将问题向下移动,但可能是适当的,这取决于所涉及的物流。

为什么不考虑使用
WeakReference
,在这里您可以调整代码以返回对连接的弱引用,当使用连接的线程死亡时,对象将没有引用(除了从
WeakHashMap
)中,然后可以定期识别这些对象,并使用线程调用
再见
方法

这篇文章可以帮助你更好地理解这一点


net还有一个
WeakReference
类,其行为与此非常类似。

为什么不看看使用
WeakReference
,在这里您可以调整代码以返回对连接的弱引用,当使用连接的线程终止时,对象将没有引用(除了
WeakHashMap
),然后可以定期识别这些对象,并使用线程调用
再见
方法

这篇文章可以帮助你更好地理解这一点


.net还有一个行为与此非常类似的
WeakReference
类。

不返回连接对象,而是返回代表连接的代理对象。这些代理对象在最终确定后,应该告别它们所代表的连接。如果代理未正确关闭,它最终将被垃圾收集,并在此时调整连接状态


这里有两个问题。第一,GC之前的时间是不可预测的。比永远好,但仍然可能很长。第二,要注意终结器中复杂调用的副作用,尤其是对象复活。有一些罕见但丑陋的场景阻止收集对象。

不要返回连接对象,返回pr代之以表示连接的oxy对象。这些代理对象在最终确定后,应该告别它们所代表的连接。如果代理未正确关闭,它最终将被垃圾收集,并在此时调整连接状态

这里有两个问题。第一,GC之前的时间是不可预测的。比永远好,但仍然可能很长。第二,注意终结器中复杂调用的副作用,尤其是对象复活。有一些罕见但丑陋的场景