Hibernate, C3P0, Mysql — Broken Pipe

后端 未结 5 468
予麋鹿
予麋鹿 2020-12-08 16:46

MySQL seems to have an 8 hour time out on its connections. I\'m running multiple WARs in Tomcat utilizing Hibernate for ORM. After 8 hours (i.e. overnight), I get broken pip

相关标签:
5条回答
  • 2020-12-08 17:10

    There are two things going on here. You should read this article for more details, but the take-aways are:

    1. You can adjust the MySQL wait_timeout setting to something larger than 8 hours, if desired.
    2. The Hibernate settings should include "hibernate." before the "c3p0", e.g. hibernate.c3p0.idle_test_period instead of just c3p0.idle_test_period
    0 讨论(0)
  • 2020-12-08 17:14

    So it turns out I was missing a key line that enabled c3p0 (the c3p0 parameters I was tweaking were having no effect because Hibernate was using it's built in connection pool -- which it appropriately warns is not suitable for production). In hibernate 2.x, setting the hibernate.c3p0.max_size property enabled c3p0 connection pooling. However, in 3.x you must specify the following property --

    <property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
    

    Additionally, here are my final configuration parameters --

    <property name="hibernate.c3p0.min_size">3</property>
    <property name="hibernate.c3p0.max_size">5</property>
    <property name="hibernate.c3p0.timeout">1800</property>
    <property name="hibernate.c3p0.idle_test_period">100</property> <!-- seconds -->
    

    It's rather unfortunate that both Hibernate and c3p0 have abysmal documentation in this regard.

    0 讨论(0)
  • 2020-12-08 17:18

    This is a solution when you have a broken pipe because of combination of tomcat's wait_timeout=28800 sec(8h) and maxIdleTime=0 in c3p0:

    I've changed the local tomcat wait_timeout via my.ini file to 120sec (2 min). And I placed the following:
    maxIdleTime=100
    idleConnectionTestPeriod=0 (same as default/as if it didn't exist)
    other:
    acquireIncrement=2
    minPoolSize=2
    maxPoolSize=5
    maxIdleTimeExcessConnections=10

    I had no problems with this setup.

    I didn't need to use idleConnectionTestPeriod!

    If tomcat's wait_timeout is 28800 sec, and maxIdleTime is 25200, it means that c3p0 will close the idle connection in 3600sec (1h) earlier, before tomcat throws a "broken pipe" exception. Isn't that right?!

    As you can see I have no issues with providing only maxIdleTime.

    Unfortunately, these:
    maxIdleTime
    idleConnectionTestPeriod
    configuring_connection_testing
    testConnectionOnCheckin
    don't explain too much the corner cases.

    And, btw, here is how to open the tomcat's my.ini file with Notepad++: http://drupal.org/node/32715#comment-4907440

    Cheers,
    Despot

    0 讨论(0)
  • 2020-12-08 17:20

    I've several problem - - C3P0ConnectionProvider was not found - I solve it by using the hibernate c3p0 version

            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-entitymanager</artifactId>
            <version>3.5.6-Final</version>
        </dependency>
              <!-- c3p0 -->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-c3p0</artifactId>
            <version>3.3.1.GA</version>
        </dependency>
    

    - I have that wait_timeout issue on mysql. First I set /etc/my.cnf wait_timeout=10 then I changed the Idle time out value to lower than the wait_timeout value which < 10 That solved my problem.

        <property name="hibernate.connection.provider_class" value="org.hibernate.connection.C3P0ConnectionProvider" /> <property name="hibernate.c3p0.acquire_increment" value="1" />
            <property name="hibernate.c3p0.idle_test_period"  value="28690"/>
            <property name="hibernate.c3p0.timeout" value="1800" />
            <property name="hibernate.c3p0.max_size" value="5" />
            <property name="hibernate.c3p0.min_size" value="3" />
            <property name="hibernate.c3p0.max_statement" value="50" />
            <property name="hibernate.c3p0.preferredTestQuery" value="select 1;"/>
    
    0 讨论(0)
  • 2020-12-08 17:26

    I was getting the same problem and it took time to figure out the solution.

    I use Hibernate 4.0.1 and mysql 5.1(no spring framework) and I was facing the issue. First make sure that you configured the c3p0 jars properly which are essential.

    I used these properties in hibernate.cfg.xml

    <property name="hibernate.c3p0.validate">true</property>
    <property name="hibernate.connection.provider_class">org.hibernate.service.jdbc.connections.internal.C3P0ConnectionProvider</property>
    <property name="hibernate.c3p0.min_size">5</property>
    <property name="hibernate.c3p0.max_size">20</property>
    <property name="hibernate.c3p0.max_statements">50</property>
    <property name="hibernate.c3p0.preferredTestQuery">SELECT 1;</property>
    <property name="hibernate.c3p0.testConnectionOnCheckout">true</property>
    <property name="hibernate.c3p0.idle_test_period">10</property>
    <property name="hibernate.c3p0.acquireRetryAttempts">5</property>
    <property name="hibernate.c3p0.acquireRetryDelay">200</property>
    <property name="hibernate.c3p0.timeout">40</property>
    

    But it's of no use 'cause C3p0 was still taking the default properties not the properties which I set in hibernate.cfg.xml, You can check it in logs. So, I searched many websites for right solution and finally I came up with this. remove the C3p0 properties in cfg.xml and create c3p0-config.xml in the root path(along with cfg.xml) and set properties as follows.

    <c3p0-config>
    <default-config> 
    <property name="automaticTestTable">con_test</property>
    <property name="checkoutTimeout">40</property> 
    <property name="idleConnectionTestPeriod">10</property> 
    <property name="initialPoolSize">10</property>
    <property name="maxPoolSize">20</property> 
    <property name="minPoolSize">5</property> 
    <property name="maxStatements">50</property>
    <property name="preferredTestQuery">SELECT 1;</property>
    <property name="acquireRetryAttempts">5</property>
    <property name="acquireRetryDelay">200</property>
    <property name="maxIdleTime">30</property>
    </default-config>
    </c3p0-config>
    

    but if you run, ORM takes the jdbc connection but not C3p0 connection pool 'cause we should add these properties in hibernate.cfg.xml

    <property name="hibernate.c3p0.validate">true</property>
    
    <property name="hibernate.connection.provider_class">org.hibernate.service.jdbc.connections.internal.C3P0ConnectionProvider</property>
    

    now everything works fine(At least it worked fine for me) and the issue is solved.

    check the following for references.

    http://www.mchange.com/projects/c3p0/index.html#configuring_connection_testing

    https://community.jboss.org/wiki/HowToConfigureTheC3P0ConnectionPool

    I hope this solves your problem.

    0 讨论(0)
提交回复
热议问题