On Feb 13, 2010, at 6:29 PM, Sergiu Dumitriu wrote:
On 02/13/2010 04:40 PM, vmassol (SVN) wrote:
Author: vmassol Date: 2010-02-13 16:40:57 +0100 (Sat, 13 Feb 2010) New Revision: 27004
Modified: platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/store/hibernate/DefaultHibernateSessionFactory.java Log: XWIKI-4893: Make XWiki support recovering from a connection problem with the database
Modified: platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/store/hibernate/DefaultHibernateSessionFactory.java =================================================================== --- platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/store/hibernate/DefaultHibernateSessionFactory.java 2010-02-13 12:09:34 UTC (rev 27003) +++ platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/store/hibernate/DefaultHibernateSessionFactory.java 2010-02-13 15:40:57 UTC (rev 27004) @@ -19,7 +19,9 @@ */ package com.xpn.xwiki.store.hibernate;
+import java.io.File; import java.io.InputStream; +import java.net.URL;
import org.hibernate.HibernateException; import org.hibernate.SessionFactory; @@ -33,8 +35,8 @@ * * @version $Id$ * @since 2.0M1 - * @todo this was coded by Artem. Find out why we need this as a component. */ +// TODO: This was coded by Artem. Find out why we need this as a component. @Component public class DefaultHibernateSessionFactory implements HibernateSessionFactory { @@ -45,6 +47,78 @@ { private static final long serialVersionUID = 1L;
+ /** + * Whether the Hibernate Configuration has alreayd been initialized or not. We do this so that the + * Hibernate {@link org.hibernate.cfg.Configuration#configure()} methods can be called several times in a + * row without causing some Duplicate Mapping errors, see our overridden + * {@link #getConfigurationInputStream(String)} below. + */ + private boolean isConfigurationInitialized; + + /** + * {@inheritDoc} + * @see org.hibernate.cfg.Configuration#configure() + */
Are you sure there's no need for synchronized? Same for all the others.
Actually I think the synchronized should be added to the initHibernate() method. But maybe to both. Synchronized should hurt anyway so yes probably best to add them everywhere. -Vincent
+ @Override public Configuration configure() throws HibernateException + { + Configuration configuration; + if (this.isConfigurationInitialized) { + configuration = this; + } else { + configuration = super.configure(); + this.isConfigurationInitialized = true; + } + return configuration; + } + + /** + * {@inheritDoc} + * @see org.hibernate.cfg.Configuration#configure(String) + */ + @Override public Configuration configure(String resource) throws HibernateException + { + Configuration configuration; + if (this.isConfigurationInitialized) { + configuration = this; + } else { + configuration = super.configure(resource); + this.isConfigurationInitialized = true; + } + return configuration; + } + + /** + * {@inheritDoc} + * @see org.hibernate.cfg.Configuration#configure(java.net.URL) + */ + @Override public Configuration configure(URL url) throws HibernateException + { + Configuration configuration; + if (this.isConfigurationInitialized) { + configuration = this; + } else { + configuration = super.configure(url); + this.isConfigurationInitialized = true; + } + return configuration; + } + + /** + * {@inheritDoc} + * @see org.hibernate.cfg.Configuration#configure(java.io.File) + */ + @Override public Configuration configure(File configFile) throws HibernateException + { + Configuration configuration; + if (this.isConfigurationInitialized) { + configuration = this; + } else { + configuration = super.configure(configFile); + this.isConfigurationInitialized = true; + } + return configuration; + } + // there is no #configure(InputStream) so we use #configure(String) and override #getConfigurationInputStream @Override protected InputStream getConfigurationInputStream(String resource) throws HibernateException