dk.dma.ais.abnormal.event.db.jpa.JpaSessionFactoryFactory.java Source code

Java tutorial

Introduction

Here is the source code for dk.dma.ais.abnormal.event.db.jpa.JpaSessionFactoryFactory.java

Source

/* Copyright (c) 2011 Danish Maritime Authority
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 3 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this library.  If not, see <http://www.gnu.org/licenses/>.
 */

package dk.dma.ais.abnormal.event.db.jpa;

import dk.dma.ais.abnormal.event.db.domain.Behaviour;
import dk.dma.ais.abnormal.event.db.domain.CloseEncounterEvent;
import dk.dma.ais.abnormal.event.db.domain.CourseOverGroundEvent;
import dk.dma.ais.abnormal.event.db.domain.DriftEvent;
import dk.dma.ais.abnormal.event.db.domain.ShipSizeOrTypeEvent;
import dk.dma.ais.abnormal.event.db.domain.SpeedOverGroundEvent;
import dk.dma.ais.abnormal.event.db.domain.SuddenSpeedChangeEvent;
import dk.dma.ais.abnormal.event.db.domain.TrackingPoint;
import dk.dma.ais.abnormal.event.db.domain.Vessel;
import dk.dma.ais.abnormal.event.db.domain.Zone;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.File;

/**
 * JpaSessionFactoryFactory builds and delivers Hibernate SessionFactory objects that can
 * be used to connect to a relational database.
 */
public final class JpaSessionFactoryFactory {

    private static final Logger LOG = LoggerFactory.getLogger(JpaSessionFactoryFactory.class);
    {
        LOG.info(this.getClass().getSimpleName() + " created (" + this + ").");
    }

    /**
     * Create a new SessionFactory which can be used to connect to an H2 file based database.
     */
    public static SessionFactory newH2SessionFactory(File dbFilename) {
        LOG.debug("Loading Hibernate configuration.");

        Configuration configuration = new Configuration()
                .setProperty("hibernate.connection.driver_class", "org.h2.Driver")
                .setProperty("hibernate.connection.url", buildH2ConnectionUrl(dbFilename))
                .setProperty("hibernate.connection.username", "sa").setProperty("hibernate.connection.password", "")
                .setProperty("hibernate.default_schema", "PUBLIC")
                .setProperty("hibernate.dialect", "org.hibernate.dialect.H2Dialect")
                //.setProperty("hibernate.show_sql", "true")
                .setProperty("hibernate.hbm2ddl.auto", "update").setProperty("hibernate.order_updates", "true")
                .setProperty("hibernate.cache.provider_class", "org.hibernate.cache.EhCacheProvider")
                .setProperty("hibernate.cache.use_second_level_cache", "true")
                .setProperty("hibernate.cache.use_query_cache", "true")
                .setProperty("hibernate.cache.region.factory_class",
                        "org.hibernate.cache.ehcache.EhCacheRegionFactory")
                .setProperty("hibernate.connection.provider_class",
                        "org.hibernate.c3p0.internal.C3P0ConnectionProvider")
                .setProperty("hibernate.c3p0.min_size", "1").setProperty("hibernate.c3p0.max_size", "32")
                .setProperty("hibernate.c3p0.initialPoolSize", "1").setProperty("hibernate.c3p0.timeout", "5000")
                .setProperty("hibernate.c3p0.acquire_increment", "1")
                .setProperty("hibernate.c3p0.max_statements", "50")
                .setProperty("hibernate.c3p0.idle_test_period", "300")
                .setProperty("hibernate.c3p0.numHelperThreads", "4").addAnnotatedClass(CourseOverGroundEvent.class)
                .addAnnotatedClass(SpeedOverGroundEvent.class).addAnnotatedClass(ShipSizeOrTypeEvent.class)
                .addAnnotatedClass(SuddenSpeedChangeEvent.class).addAnnotatedClass(DriftEvent.class)
                .addAnnotatedClass(CloseEncounterEvent.class).addAnnotatedClass(Zone.class)
                .addAnnotatedClass(Vessel.class).addAnnotatedClass(Behaviour.class)
                .addAnnotatedClass(TrackingPoint.class);

        StandardServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder()
                .applySettings(configuration.getProperties()).build();

        LOG.info("Starting Hibernate.");
        SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry);
        testConnection(sessionFactory);
        LOG.info("Hibernate started.");

        return sessionFactory;
    }

    /**
     * Create a new SessionFactory which can be used to connect to a Postgresql database
     * via TCP/IP.
     *
     * @param dbHost
     * @param dbPort
     * @param dbName
     * @param dbUsername
     * @param dbPassword
     * @return
     */
    public static SessionFactory newPostgresSessionFactory(String dbHost, int dbPort, String dbName,
            String dbUsername, String dbPassword) {
        LOG.debug("Loading Hibernate configuration.");

        Configuration configuration = new Configuration()
                .setProperty("hibernate.connection.driver_class", "org.postgresql.Driver")
                .setProperty("hibernate.connection.url", buildPgsqlConnectionUrl(dbHost, dbPort, dbName))
                .setProperty("hibernate.connection.username", dbUsername)
                .setProperty("hibernate.connection.password", dbPassword)
                .setProperty("hibernate.default_schema", "PUBLIC")
                .setProperty("hibernate.dialect", "org.hibernate.dialect.PostgreSQLDialect")
                //.setProperty("hibernate.show_sql", "true")
                .setProperty("hibernate.hbm2ddl.auto", "update").setProperty("hibernate.order_updates", "true")
                .setProperty("hibernate.connection_pool_size", "1")
                .setProperty("hibernate.cache.provider_class", "org.hibernate.cache.EhCacheProvider")
                .setProperty("hibernate.cache.use_second_level_cache", "true")
                .setProperty("hibernate.cache.use_query_cache", "true")
                .setProperty("hibernate.cache.region.factory_class",
                        "org.hibernate.cache.ehcache.EhCacheRegionFactory")
                .setProperty("hibernate.connection.provider_class",
                        "org.hibernate.c3p0.internal.C3P0ConnectionProvider")
                .setProperty("hibernate.c3p0.min_size", "2").setProperty("hibernate.c3p0.max_size", "32")
                .setProperty("hibernate.c3p0.initialPoolSize", "4").setProperty("hibernate.c3p0.timeout", "5000")
                .setProperty("hibernate.c3p0.acquire_increment", "2")
                .setProperty("hibernate.c3p0.max_statements", "50")
                .setProperty("hibernate.c3p0.idle_test_period", "300")
                .setProperty("hibernate.c3p0.numHelperThreads", "16")
                .setProperty("hibernate.c3p0.unreturnedConnectionTimeout", "55")
                //.setProperty("hibernate.c3p0.debugUnreturnedConnectionStackTraces", "true")
                .addAnnotatedClass(CourseOverGroundEvent.class).addAnnotatedClass(SpeedOverGroundEvent.class)
                .addAnnotatedClass(ShipSizeOrTypeEvent.class).addAnnotatedClass(SuddenSpeedChangeEvent.class)
                .addAnnotatedClass(DriftEvent.class).addAnnotatedClass(CloseEncounterEvent.class)
                .addAnnotatedClass(Zone.class).addAnnotatedClass(Vessel.class).addAnnotatedClass(Behaviour.class)
                .addAnnotatedClass(TrackingPoint.class);

        StandardServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder()
                .applySettings(configuration.getProperties()).build();

        LOG.info("Starting Hibernate.");
        SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry);
        testConnection(sessionFactory);
        LOG.info("Hibernate started.");

        return sessionFactory;
    }

    private static void testConnection(SessionFactory sessionFactory) {
        Session session = null;
        try {
            session = sessionFactory.openSession();
            session.beginTransaction();
            session.getTransaction().rollback();
        } finally {
            if (session != null) {
                session.close();
            }
        }
    }

    private static String buildH2ConnectionUrl(File dbFilename) {
        StringBuffer connectionUrl = new StringBuffer();
        connectionUrl.append("jdbc:h2:");
        connectionUrl.append(dbFilename.getAbsolutePath());
        connectionUrl.append(";");
        connectionUrl.append("TRACE_LEVEL_FILE=0");
        connectionUrl.append(";");
        connectionUrl.append("TRACE_LEVEL_SYSTEM_OUT=1");
        LOG.debug("Using connectionUrl=" + connectionUrl.toString());
        return connectionUrl.toString();
    }

    private static String buildPgsqlConnectionUrl(String host, int port, String dbname) {
        StringBuffer connectionUrl = new StringBuffer();
        connectionUrl.append("jdbc:postgresql://");
        connectionUrl.append(host);
        connectionUrl.append(":");
        connectionUrl.append(port);
        connectionUrl.append("/");
        connectionUrl.append(dbname);
        LOG.debug("Using connectionUrl=" + connectionUrl.toString());
        return connectionUrl.toString();
    }

}