Note that there are some explanatory texts on larger screens.

plurals
  1. POConnection drop problem with Hibernate-mysql-c3p0
    primarykey
    data
    text
    <p>This is an issue which I have seen all across the web. I will bring it up again as till now I don't have a fix for the same.</p> <pre><code> I am using hibernate 3. mysql 5 and latest c3p0 jar. I am getting a broken pipe exception. Following is my hibernate.cfg file. </code></pre> <p> com.mysql.jdbc.Driver org.hibernate.dialect.MySQLDialect</p> <pre><code> &lt;property name="hibernate.show_sql"&gt;true&lt;/property&gt; &lt;property name="hibernate.use_sql_comments"&gt;true&lt;/property&gt; &lt;property name="hibernate.current_session_context_class"&gt;thread&lt;/property&gt; &lt;property name="connection.autoReconnect"&gt;true&lt;/property&gt; &lt;property name="connection.autoReconnectForPools"&gt;true&lt;/property&gt; &lt;property name="connection.is-connection-validation-required"&gt;true&lt;/property&gt; &lt;!--&lt;property name="c3p0.min_size"&gt;5&lt;/property&gt; &lt;property name="c3p0.max_size"&gt;20&lt;/property&gt; &lt;property name="c3p0.timeout"&gt;1800&lt;/property&gt; &lt;property name="c3p0.max_statements"&gt;50&lt;/property&gt; --&gt;&lt;property name="hibernate.connection.provider_class"&gt;org.hibernate.connection.C3P0ConnectionProvider &lt;/property&gt; &lt;property name="hibernate.c3p0.acquireRetryAttempts"&gt;30&lt;/property&gt; &lt;property name="hibernate.c3p0.acquireIncrement"&gt;5&lt;/property&gt; &lt;property name="hibernate.c3p0.automaticTestTable"&gt;C3P0TestTable&lt;/property&gt; &lt;property name="hibernate.c3p0.idleConnectionTestPeriod"&gt;36000&lt;/property&gt; &lt;property name="hibernate.c3p0.initialPoolSize"&gt;20&lt;/property&gt; &lt;property name="hibernate.c3p0.maxPoolSize"&gt;100&lt;/property&gt; &lt;property name="hibernate.c3p0.maxIdleTime"&gt;1200&lt;/property&gt; &lt;property name="hibernate.c3p0.maxStatements"&gt;50&lt;/property&gt; &lt;property name="hibernate.c3p0.minPoolSize"&gt;10&lt;/property&gt;--&gt; </code></pre> <p>My connection pooling is occurring fine. During the day it is fine , but once i keep it idle over the night ,next day I find it giving me broken connection error.</p> <p>public class HibernateUtil {</p> <pre><code>private static Logger log = Logger.getLogger(HibernateUtil.class); //private static Log log = LogFactory.getLog(HibernateUtil.class); private static Configuration configuration; private static SessionFactory sessionFactory; static { // Create the initial SessionFactory from the default configuration files try { log.debug("Initializing Hibernate"); // Read hibernate.properties, if present configuration = new Configuration(); // Use annotations: configuration = new AnnotationConfiguration(); // Read hibernate.cfg.xml (has to be present) configuration.configure(); // Build and store (either in JNDI or static variable) rebuildSessionFactory(configuration); log.debug("Hibernate initialized, call HibernateUtil.getSessionFactory()"); } catch (Throwable ex) { // We have to catch Throwable, otherwise we will miss // NoClassDefFoundError and other subclasses of Error log.error("Building SessionFactory failed.", ex); throw new ExceptionInInitializerError(ex); } } /** * Returns the Hibernate configuration that was used to build the SessionFactory. * * @return Configuration */ public static Configuration getConfiguration() { return configuration; } /** * Returns the global SessionFactory either from a static variable or a JNDI lookup. * * @return SessionFactory */ public static SessionFactory getSessionFactory() { String sfName = configuration.getProperty(Environment.SESSION_FACTORY_NAME); System.out.println("Current s name is "+sfName); if ( sfName != null) { System.out.println("Looking up SessionFactory in JNDI"); log.debug("Looking up SessionFactory in JNDI"); try { System.out.println("Returning new sssion factory"); return (SessionFactory) new InitialContext().lookup(sfName); } catch (NamingException ex) { throw new RuntimeException(ex); } } else if (sessionFactory == null) { System.out.println("calling rebuild session factory now"); rebuildSessionFactory(); } return sessionFactory; } /** * Closes the current SessionFactory and releases all resources. * &lt;p&gt; * The only other method that can be called on HibernateUtil * after this one is rebuildSessionFactory(Configuration). */ public static void shutdown() { log.debug("Shutting down Hibernate"); // Close caches and connection pools getSessionFactory().close(); // Clear static variables sessionFactory = null; } /** * Rebuild the SessionFactory with the static Configuration. * &lt;p&gt; * Note that this method should only be used with static SessionFactory * management, not with JNDI or any other external registry. This method also closes * the old static variable SessionFactory before, if it is still open. */ public static void rebuildSessionFactory() { log.debug("Using current Configuration to rebuild SessionFactory"); rebuildSessionFactory(configuration); } /** * Rebuild the SessionFactory with the given Hibernate Configuration. * &lt;p&gt; * HibernateUtil does not configure() the given Configuration object, * it directly calls buildSessionFactory(). This method also closes * the old static variable SessionFactory before, if it is still open. * * @param cfg */ public static void rebuildSessionFactory(Configuration cfg) { log.debug("Rebuilding the SessionFactory from given Configuration"); if (sessionFactory != null &amp;&amp; !sessionFactory.isClosed()) sessionFactory.close(); if (cfg.getProperty(Environment.SESSION_FACTORY_NAME) != null) { log.debug("Managing SessionFactory in JNDI"); cfg.buildSessionFactory(); } else { log.debug("Holding SessionFactory in static variable"); sessionFactory = cfg.buildSessionFactory(); } configuration = cfg; } </code></pre> <p>}</p> <p>Above is my code for the session factory. And I have only select operations .</p> <p>And below is the method which is used most often to execute my select queries. One tricky thing which I am not understanding is in my findById method i am using this line of code getSession().beginTransaction(); without which it gives me an error saying that this cannot happpen without a transaction. But nowhere I am closing this transaction. And thers no method to close a transaction apart from commit or rollback (as far as i know) which are not applicable for select statements.</p> <p>public T findById(ID id, boolean lock) throws HibernateException, DAOException { log.debug("findNyId invoked with ID ="+id+"and lock ="+lock); T entity; getSession().beginTransaction();</p> <pre><code> if (lock) entity = (T) getSession().load(getPersistentClass(), id, LockMode.UPGRADE); else entity = (T) getSession().load(getPersistentClass(), id); return entity; } </code></pre> <p>Can anyone please suggest what can I do ? I have tried out almost every solution available via googling, on stackoverlow or on hibernate forums with no avail. (And increasing wait_timeout on mysql is not a valid option in my case).</p>
    singulars
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload