java - c3p0 在无法到达主机时不会超时

标签 java sql-server hibernate jpa c3p0

我的程序在打开时做的第一件事是尝试连接数据库,如果 c3p0 无法连接,它会卡住并且不会引发任何错误消息。

奇怪的是,使用 MySql 我得到了 java.net.UnknownHostException,但是没有使用 SqlServer,它一直在尝试。

我想捕获错误并做一些事情。我尝试设置此属性,但没有成功。

<property name="hibernate.c3p0.timeout" value="60"/>
<property name="hibernate.c3p0.unreturnedConnectionTimeout" value="60"/>

我的persistence.xml

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
    <persistence-unit name="default" transaction-type="RESOURCE_LOCAL">
        <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
        <class>com.lala.Something</class>
        <shared-cache-mode>NONE</shared-cache-mode>
        <properties>
            <!-- connection -->
            <property name="javax.persistence.jdbc.url" value="jdbc:sqlserver://localhost\\\\SQLEXPRESS:1433;databaseName=str"/>
            <property name="javax.persistence.jdbc.driver" value="com.microsoft.sqlserver.jdbc.SQLServerDriver"/>
            <property name="javax.persistence.jdbc.user" value="teste"/>
            <property name="javax.persistence.jdbc.password" value="teste"/>
            <!-- hibernate -->
            <property name="hibernate.format_sql" value="false"/>
            <property name="hibernate.show_sql" value="false"/>
            <property name="hibernate.use_sql_comments" value="false"/>
            <!-- c3p0 -->
            <property name="hibernate.connection.provider_class" value="org.hibernate.connection.C3P0ConnectionProvider"/>
            <property name="hibernate.c3p0.min_size" value="1"/>
        </properties>
    </persistence-unit>
</persistence>

最佳答案

我决定添加这两个属性:

acquireRetryAttempts

定义 c3p0 在放弃之前尝试从数据库中获取新连接的次数。如果此值小于或等于零,c3p0 将无限期地继续尝试获取连接。

breakAfterAcquireFailure

如果为 true,如果在进行 acquireRetryAttempts 后无法从数据库中获取连接,则合并的数据源将声明自己已损坏并永久关闭。如果为 false,则获取连接失败将导致所有等待池获取连接的线程抛出异常,但数据源将保持有效,并将在调用 getConnection() 后再次尝试获取。

        <property name="hibernate.c3p0.acquireRetryAttempts" value="3"/>
        <property name="hibernate.c3p0.breakAfterAcquireFailure" value="true"/>

关于java - c3p0 在无法到达主机时不会超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29084475/

相关文章:

Java 10 巴拿马项目 - 将 JNI 解决方案移植到巴拿马

sql - 为什么我的整个表被锁定而不是行被锁定?

sql - 交叉应用与 UNPIVOT

sql-server - DECLARE TABLE和CREATE TABLE有什么区别?

performance - ORM 解决方案(JPA;Hibernate)与 JDBC

java - HashSet 中的 HashCode 行为

java - Camera2 和 Mediarecorder 输出高质量预览但低质量 mp4

java - Hibernate LockModeType.OPTIMISTIC_FORCE_INCREMENT 在其他实体上传播

hibernate - 奇怪的错误:通过客户堆栈跟踪关闭

java - 如何从另一个表中获取单个值作为字符串