我使用 c3p0 作为连接池,使用 ebean 作为 ORM 实现。目前我正在 c3p0 池中设置以下属性:
minPoolSize
maxPoolSize
maxIdleTime
preferredTestQuery
但是我想知道如何设置查询超时,即假设如果查询花费超过 200 毫秒,那么就放弃而不是无限等待。您将如何通过 c3p0 实现这一目标?我知道如何通过普通 JDBC 进行设置,即 Statement.setQueryTimeout()
但如何通过 c3p0 进行相同的操作。或者还有其他办法吗?
是maxIdleTime
,我提到的查询超时会做同样的事情,即在一段时间后如果我们没有得到响应就会终止连接?
提前致谢。
最佳答案
不,maxIdleTime
与查询可以运行的时间无关。它定义了连接在过期和被销毁之前允许在池中闲置的时间。
c3p0 是普通的 JDBC。根据 JDBC 规范,它提供透明连接池。透明意味着在这种情况下 API 不会改变,无论有没有池,您的代码都应该基本相同。欢迎您对从 c3p0 管理的连接派生的语句调用 Statement.setQueryTimeout()
,就像调用任何其他语句一样。
一般来说,c3p0 在 check out 连接时不会干扰连接。一旦客户端应用程序使用连接,c3p0 就会观察但不会干扰客户端应用程序的操作。主要的异常(exception)是配置参数 unreturnedConnectionTimeout ,旨在帮助调试或解决连接泄漏。 [参见here ] 在真正的紧要关头,您可以使用 unreturnedConnectionTimeout 来做您想做的事情,强制放弃较慢的查询,尽管是以相当残酷的方式。 unreturnedConnectionTimeout
将强制未返回的 Connection 在设定的时间段后关闭,并且池通常必须获取替换连接。不过,在尝试“unreturnedConnectionTimeout”之前,我会先从 Statement.setQueryTimeout
开始。
关于java - 通过c3p0在mysql中查询超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27135123/