如果Mysql端口被阻止,如何阻止应用程序(使用hibernate + c3po)挂起?

时间:2018-03-30 05:44:31

标签: java mysql hibernate c3p0 database-testing

我一直在尝试使我的Java应用程序db失败证明,因此如果数据库不可用,它们不会出现意外滞后。当数据库完全关闭时,我已经成功处理了这个简单的案例。

我遇到了一个案例,当我的机器阻止了mysql端口时,我尝试访问它。在这种情况下,应用程序永远挂起,c3po documentation中提到的超时配置似乎没有预测到这种情况。在调试时,我可以看到它挂起在mysql连接器的ReadAheadInputStream类中。该类的文档显示它仅阻塞以满足读取请求。

到目前为止,我已经使用了以下属性。

 <property name="hibernate.c3p0.validate" value="true"/>
 <property name="hibernate.c3p0.checkoutTimeout" value="5"/>
 <property name="hibernate.c3p0.preferredTestQuery" value="SELECT 1"/>

除此之外,配置连接池的其他属性如文档

中所述

版本:

 <dependency>
        <groupId>c3p0</groupId>
        <artifactId>c3p0</artifactId>
        <version>0.9.1.2</version>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-c3p0</artifactId>
        <version>4.2.12.Final</version>
    </dependency>

有人可以指导我吗?除了c3po doc中提到的还需要配置的那些之外,还有其他超时参数吗?

1 个答案:

答案 0 :(得分:0)

您可能需要为MySQL设置网络超时,默认情况下没有。使用connectTimeout进行初始连接,使用socketTimeout进行后续网络操作。例如:

jdbc:mysql://dbhost:3306/dbname?connectTimeout=1000&socketTimeout=200000

两者均以毫秒为单位。请参阅https://dev.mysql.com/doc/connector-j/5.1/en/connector-j-reference-configuration-properties.html