de.huberlin.hiwaydb.useDB.HiwayDB.java Source code

Java tutorial

Introduction

Here is the source code for de.huberlin.hiwaydb.useDB.HiwayDB.java

Source

/*******************************************************************************
 * In the Hi-WAY project we propose a novel approach of executing scientific
 * workflows processing Big Data, as found in NGS applications, on distributed
 * computational infrastructures. The Hi-WAY software stack comprises the func-
 * tional workflow language Cuneiform as well as the Hi-WAY ApplicationMaster
 * for Apache Hadoop 2.x (YARN).
 *
 * List of Contributors:
 *
 * Hannes Schuh (HU Berlin)
 * Marc Bux (HU Berlin)
 * Jrgen Brandt (HU Berlin)
 * Ulf Leser (HU Berlin)
 *
 * Jrgen Brandt is funded by the European Commission through the BiobankCloud
 * project. Marc Bux is funded by the Deutsche Forschungsgemeinschaft through
 * research training group SOAMED (GRK 1651).
 *
 * Copyright 2014 Humboldt-Universitt zu Berlin
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 ******************************************************************************/
package de.huberlin.hiwaydb.useDB;

import java.io.PrintWriter;
import java.io.StringWriter;
import java.io.Writer;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.criterion.Projections;
import org.json.JSONObject;

import de.huberlin.hiwaydb.dal.Accesstime;
import de.huberlin.hiwaydb.dal.File;
import de.huberlin.hiwaydb.dal.Hiwayevent;
import de.huberlin.hiwaydb.dal.Inoutput;
import de.huberlin.hiwaydb.dal.Invocation;
import de.huberlin.hiwaydb.dal.Task;
import de.huberlin.hiwaydb.dal.Workflowrun;
import de.huberlin.wbi.cuneiform.core.semanticmodel.JsonReportEntry;

public class HiwayDB implements HiwayDBI {

    private static <T> List<T> castList(Class<? extends T> clazz, Collection<?> c) {
        List<T> r = new ArrayList<>(c.size());
        for (Object o : c)
            r.add(clazz.cast(o));
        return r;
    }

    private final String configFile = "hibernate.cfg.xml";

    private SessionFactory dbSessionFactory = null;
    private SessionFactory dbSessionFactoryMessung = null;

    private final String dbURL;
    private final String password;
    private final String username;
    private long dbVolume;
    private final String config;
    private String wfName;
    private String runIDat;

    public HiwayDB(String username, String password, String dbURL) {
        this.username = username;
        this.password = password;
        this.dbURL = dbURL;
        this.wfName = "";
        this.runIDat = "";

        this.config = "nix";

        dbSessionFactory = getSQLSession();
        dbSessionFactoryMessung = getSQLSessionMessung();

        Session session = dbSessionFactory.openSession();
        Transaction tx = null;

        try {
            tx = session.beginTransaction();

            dbVolume = (long) session.createCriteria(Workflowrun.class).setProjection(Projections.rowCount())
                    .uniqueResult();

            tx.commit();
        } catch (RuntimeException e) {
            if (tx != null)
                tx.rollback();
            throw e; // or display error message
        } finally {
            if (session.isOpen()) {
                session.close();
            }

        }

    }

    @Override
    public void logToDB(JsonReportEntry entry) {

        lineToDB(entry);
    }

    @Override
    public Set<String> getHostNames() {
        Long tick = System.currentTimeMillis();
        if (dbSessionFactory == null) {
            dbSessionFactory = getSQLSession();
        }

        Set<String> tempResult = new HashSet<>();

        Session sessAT = dbSessionFactoryMessung.openSession();
        Transaction txMessung = null;
        Session sess = dbSessionFactory.openSession();

        // Non-managed environment idiom with getCurrentSession()
        try {

            txMessung = sessAT.beginTransaction();
            Accesstime at = new Accesstime();

            at.setTick(tick);
            at.setFunktion("getHostNames");
            at.setInput("SQL");
            at.setConfig(config);
            at.setDbvolume(dbVolume);

            Query query = null;

            String hql = "SELECT I.hostname FROM Invocation I where I.hostname!=null";
            query = sess.createQuery(hql);

            for (Object i : query.list()) {
                tempResult.add((String) i);
            }

            Long x = (long) tempResult.size();

            at.setReturnvolume(x);
            Long tock = System.currentTimeMillis();
            at.setTock(tock);
            at.setTicktockdif(tock - tick);
            at.setRunId(this.runIDat);
            at.setWfName(this.wfName);
            sessAT.save(at);
            txMessung.commit();
        } catch (RuntimeException e) {
            throw e; // or display error message
        } finally {
            if (sess.isOpen()) {
                sess.close();
            }

            if (sessAT.isOpen()) {
                sessAT.close();
            }
        }

        return tempResult;

    }

    @Override
    public Collection<InvocStat> getLogEntriesForTasks(Set<Long> taskIds) {
        Long tick = System.currentTimeMillis();

        if (dbSessionFactory == null) {
            dbSessionFactory = getSQLSession();
        }
        List<Invocation> resultsInvoc = new ArrayList<>();
        Collection<InvocStat> resultList;
        Session sess = dbSessionFactory.openSession();
        Session sessAT = dbSessionFactoryMessung.openSession();
        Transaction txMessung = null;

        Accesstime at = new Accesstime();

        try {
            txMessung = sessAT.beginTransaction();

            at.setTick(tick);
            at.setFunktion("getLogEntriesForTasks");
            at.setInput("SQL");
            at.setConfig(config);
            at.setDbvolume(dbVolume);

            Query query = null;

            String queryString = "FROM Invocation I  WHERE ";

            for (Long l : taskIds) {
                queryString += " I.task = " + l.toString() + " or ";
            }

            query = sess.createQuery(queryString.substring(0, queryString.length() - 4));

            // join I.invocationId
            resultsInvoc = castList(Invocation.class, query.list());
            Long x = (long) resultsInvoc.size();

            at.setReturnvolume(x);
            resultList = createInvocStat(resultsInvoc, null);

        } catch (RuntimeException e) {
            throw e; // or display error message
        } finally {
            if (sess.isOpen()) {
                sess.close();
            }

        }

        Long tock = System.currentTimeMillis();
        at.setTock(tock);
        at.setTicktockdif(tock - tick);
        at.setRunId(this.runIDat);
        at.setWfName(this.wfName);
        sessAT.save(at);

        txMessung.commit();

        if (sessAT.isOpen()) {
            sessAT.close();
        }

        return resultList;

    }

    @Override
    public Set<Long> getTaskIdsForWorkflow(String workflowName) {
        Long tick = System.currentTimeMillis();
        if (dbSessionFactory == null) {
            dbSessionFactory = getSQLSession();
        }

        Set<Long> tempResult = new HashSet<>();

        Session sess = dbSessionFactory.openSession();
        Session sessAT = dbSessionFactoryMessung.openSession();

        Accesstime at = new Accesstime();

        Transaction txMessung = null;
        try {
            txMessung = sessAT.beginTransaction();

            at.setTick(tick);
            at.setFunktion("getTaskIdsForWorkflow");
            at.setInput("SQL");
            at.setConfig(config);
            at.setDbvolume(dbVolume);

            Query query = null;

            query = sess.createQuery("FROM Workflowrun W WHERE W.wfname ='" + workflowName + "'");

            for (Object w : query.list()) {
                for (Invocation i : ((Workflowrun) w).getInvocations()) {
                    tempResult.add(i.getTask().getTaskId());
                }
            }

            Long x = (long) tempResult.size();

            at.setReturnvolume(x);

            // tx.commit();

        } catch (RuntimeException e) {
            // if (tx != null)
            // tx.rollback();
            throw e; // or display error message
        } finally {
            if (sess.isOpen()) {
                sess.close();
            }

        }

        Long tock = System.currentTimeMillis();
        at.setTock(tock);
        at.setTicktockdif(tock - tick);
        at.setRunId(this.runIDat);
        at.setWfName(this.wfName);
        sessAT.save(at);

        txMessung.commit();

        if (sessAT.isOpen()) {
            sessAT.close();
        }

        return tempResult;
    }

    @Override
    public String getTaskName(long taskId) {
        Long tick = System.currentTimeMillis();
        if (dbSessionFactory == null) {
            dbSessionFactory = getSQLSession();
        }

        Session sess = dbSessionFactory.openSession();
        // Transaction tx = null;
        String result = "";
        Session sessAT = dbSessionFactoryMessung.openSession();
        Transaction txMessung = null;
        Accesstime at = new Accesstime();

        try {
            // tx = sess.beginTransaction();
            txMessung = sessAT.beginTransaction();

            at.setTick(tick);
            at.setFunktion("getTaskName");
            at.setWfName(wfName);
            at.setConfig(config);
            at.setInput("SQL");
            at.setDbvolume(dbVolume);

            Query query = null;

            query = sess.createQuery("FROM Task T  WHERE T.taskid =" + taskId);
            // join I.invocationId

            Long x = (long) query.list().size();

            at.setReturnvolume(x);

            if (!query.list().isEmpty()) {
                result = ((Task) query.list().get(0)).getTaskName();
            }

        } catch (RuntimeException e) {
            throw e; // or display error message
        } finally {
            if (sess.isOpen()) {
                sess.close();
            }

        }

        Long tock = System.currentTimeMillis();
        at.setTock(tock);
        at.setTicktockdif(tock - tick);
        at.setRunId(this.runIDat);
        at.setWfName(this.wfName);
        sessAT.save(at);

        txMessung.commit();

        if (sessAT.isOpen()) {
            sessAT.close();
        }

        return result;

    }

    private static Collection<InvocStat> createInvocStat(List<Invocation> invocations, Session sess) {

        Set<InvocStat> resultList = new HashSet<>();
        Invocation tempInvoc;

        for (int i = 0; i < invocations.size(); i++) {
            tempInvoc = invocations.get(i);

            InvocStat invoc = new InvocStat(tempInvoc.getWorkflowrun().getRunId(), tempInvoc.getTask().getTaskId());

            if (tempInvoc.getHostname() != null && tempInvoc.getTask().getTaskId() != 0
                    && tempInvoc.getRealTime() != null) {
                invoc.setHostName(tempInvoc.getHostname());
                invoc.setRealTime(tempInvoc.getRealTime(), tempInvoc.getTimestamp());

                Set<FileStat> iFiles = new HashSet<>();
                Set<FileStat> oFiles = new HashSet<>();

                // Files
                for (File f : tempInvoc.getFiles()) {

                    FileStat iFile = new FileStat();
                    iFile.setFileName(f.getName());

                    FileStat oFile = new FileStat();
                    oFile.setFileName(f.getName());

                    if (f.getRealTimeIn() != null) {
                        iFile.setRealTime(f.getRealTimeIn());
                        iFile.setSize(f.getSize());
                        iFiles.add(iFile);
                    }

                    if (f.getRealTimeOut() != null) {
                        oFile.setRealTime(f.getRealTimeOut());
                        oFile.setSize(f.getSize());
                        oFiles.add(oFile);
                    }
                }

                invoc.setInputfiles(iFiles);
                invoc.setOutputfiles(oFiles);

                resultList.add(invoc);
            }
        }
        if (sess != null && sess.isOpen()) {
            sess.close();

            System.out.println("hiwayDB | Close Session  -> CreateInvocStat DONE ->Size: " + resultList.size());
        }

        return resultList;
    }

    @Override
    public Collection<InvocStat> getLogEntriesForTaskOnHostSince(long taskId, String hostName, long timestamp) {
        Long tick = System.currentTimeMillis();
        if (dbSessionFactory == null) {
            dbSessionFactory = getSQLSession();
        }

        List<Invocation> resultsInvoc = new ArrayList<>();
        Collection<InvocStat> resultList;

        Session sess = dbSessionFactory.openSession();
        Session sessAT = dbSessionFactoryMessung.openSession();
        Transaction txMessung = null;
        Accesstime at = new Accesstime();

        try {
            txMessung = sessAT.beginTransaction();

            at.setTick(tick);
            at.setFunktion("getLogEntriesForTaskOnHostSince");
            at.setInput("SQL");
            at.setConfig(config);
            at.setDbvolume(dbVolume);

            Query query = null;

            query = sess.createQuery("FROM Invocation I  WHERE I.hostname ='" + hostName + "' and I.Timestamp >"
                    + timestamp + " and I.task = " + taskId);

            resultsInvoc = castList(Invocation.class, query.list());

            Long x = (long) resultsInvoc.size();

            at.setReturnvolume(x);

            resultList = createInvocStat(resultsInvoc, null);

        } catch (RuntimeException e) {
            throw e; // or display error message
        } finally {
            if (sess.isOpen()) {
                sess.close();
            }

        }

        Long tock = System.currentTimeMillis();
        at.setTock(tock);
        at.setTicktockdif(tock - tick);
        at.setRunId(this.runIDat);
        at.setWfName(this.wfName);
        sessAT.save(at);

        txMessung.commit();

        if (sessAT.isOpen()) {
            sessAT.close();
        }

        return resultList;
    }

    private void lineToDB(JsonReportEntry logEntryRow) {

        Long tick = System.currentTimeMillis();

        Session oneSession = dbSessionFactory.openSession();

        Transaction tx = oneSession.getTransaction();
        Session sessAT = dbSessionFactoryMessung.openSession();
        Transaction txMessung = null;
        try {

            System.out.println("hiwayDB | start adding Entry time: " + tick);

            tx = oneSession.beginTransaction();
            txMessung = sessAT.beginTransaction();

            Accesstime at = new Accesstime();

            at.setTick(tick);
            at.setFunktion("JsonReportEntryToDB");
            at.setInput("SQL");
            at.setDbvolume(dbVolume);

            Query query = null;

            String runID = null;
            Long wfId = null;

            Workflowrun wfRun = null;
            if (logEntryRow.getRunId() != null) {
                runID = logEntryRow.getRunId().toString();

                query = oneSession.createQuery("FROM Workflowrun E WHERE E.runid='" + runID + "'");

                if (query.list() != null && !query.list().isEmpty()) {

                    wfRun = (Workflowrun) query.list().get(0);
                    wfId = wfRun.getId();
                }
            }

            long taskID = 0;
            Task task = null;
            if (logEntryRow.getTaskId() != null) {
                taskID = logEntryRow.getTaskId();

                query = oneSession.createQuery("FROM Task E WHERE E.taskid =" + taskID);
                if (query.list() != null && !query.list().isEmpty()) {
                    task = (Task) query.list().get(0);
                }
            }

            Long invocID = (long) 0;

            if (logEntryRow.hasInvocId()) {
                invocID = logEntryRow.getInvocId();
                System.out.println("Has InvovID: " + invocID);
            }

            query = oneSession.createQuery(
                    "FROM Invocation E WHERE E.invocationid =" + invocID + " and E.workflowrun='" + wfId + "'");
            List<Invocation> resultsInvoc = castList(Invocation.class, query.list());

            Long timestampTemp = logEntryRow.getTimestamp();

            Invocation invoc = null;
            if (resultsInvoc != null && !resultsInvoc.isEmpty()) {
                invoc = resultsInvoc.get(0);
                System.out.println("invoc gefunden: ID " + invoc.getInvocationId());
            }

            if (wfRun == null && runID != null) {

                wfRun = new Workflowrun();
                wfRun.setRunId(runID);
                oneSession.save(wfRun);
                System.out.println("hiwayDB | save WfRun: " + runID);
                this.runIDat = runID;
            }

            if (taskID != 0 && (task == null)) {
                task = new Task();

                task.setTaskId(taskID);
                task.setTaskName(logEntryRow.getTaskName());
                task.setLanguage(logEntryRow.getLang());

                oneSession.save(task);
                System.out.println("hiwayDB | save Task: " + taskID + " - " + task.getTaskName());
            }

            if (invocID != 0 && (invoc == null)) {
                invoc = new Invocation();
                invoc.setTimestamp(timestampTemp);
                invoc.setInvocationId(invocID);
                invoc.setTask(task);
                invoc.setWorkflowrun(wfRun);
                oneSession.save(invoc);
                System.out.println("hiwayDB | save Invoc: " + invocID);
            }

            String filename = null;

            File file = null;
            if (logEntryRow.getFile() != null && invoc != null) {
                filename = logEntryRow.getFile();

                query = oneSession.createQuery(
                        "FROM File E WHERE E.name='" + filename + "' AND E.invocation=" + invoc.getId());

                System.out.println("File Query:" + query.toString());
                if (query.list() != null && !query.list().isEmpty()) {
                    file = (File) query.list().get(0);
                    System.out.println("File haben wir:" + file.getName() + file.getId());
                }
            }

            if (file == null && filename != null) {

                file = new File();
                file.setName(filename);
                file.setInvocation(invoc);
                oneSession.save(file);
                System.out.println("hiwayDB | save File: " + filename);
            }

            String key = logEntryRow.getKey();

            System.out.println("hiwayDB | save KEY: " + key);

            at.setKeyinput(key);

            JSONObject valuePart;
            switch (key) {
            case HiwayDBI.KEY_INVOC_HOST:
                if (invoc != null)
                    invoc.setHostname(logEntryRow.getValueRawString());
                break;
            case "wf-name":
                if (wfRun != null)
                    wfRun.setWfName(logEntryRow.getValueRawString());
                this.wfName = logEntryRow.getValueRawString();
                break;
            case "wf-time":
                String val = logEntryRow.getValueRawString();
                Long test = Long.parseLong(val, 10);
                if (wfRun != null)
                    wfRun.setWfTime(test);
                break;
            case HiwayDBI.KEY_INVOC_TIME_SCHED:
                valuePart = logEntryRow.getValueJsonObj();
                if (invoc != null)
                    invoc.setScheduleTime(GetTimeStat(valuePart));
                break;
            case JsonReportEntry.KEY_INVOC_STDERR:
                if (invoc != null)
                    invoc.setStandardError(logEntryRow.getValueRawString());
                break;
            case JsonReportEntry.KEY_INVOC_SCRIPT:
                Inoutput input = new Inoutput();
                input.setKeypart("invoc-exec");
                input.setInvocation(invoc);
                input.setContent(logEntryRow.getValueRawString());
                input.setType("input");
                oneSession.save(input);
                break;
            case JsonReportEntry.KEY_INVOC_OUTPUT:
                valuePart = logEntryRow.getValueJsonObj();
                Inoutput output = new Inoutput();
                output.setKeypart("invoc-output");
                output.setInvocation(invoc);
                output.setContent(valuePart.toString());
                output.setType("output");
                oneSession.save(output);
                break;
            case JsonReportEntry.KEY_INVOC_STDOUT:
                if (invoc != null)
                    invoc.setStandardOut(logEntryRow.getValueRawString());
                break;
            case "invoc-time-stagein":
                valuePart = logEntryRow.getValueJsonObj();
                if (invoc != null)
                    invoc.setRealTimeIn(GetTimeStat(valuePart));
                break;
            case "invoc-time-stageout":
                valuePart = logEntryRow.getValueJsonObj();
                if (invoc != null)
                    invoc.setRealTimeOut(GetTimeStat(valuePart));
                break;
            case HiwayDBI.KEY_FILE_TIME_STAGEIN:
                valuePart = logEntryRow.getValueJsonObj();
                if (file != null)
                    file.setRealTimeIn(GetTimeStat(valuePart));
                break;
            case HiwayDBI.KEY_FILE_TIME_STAGEOUT:
                valuePart = logEntryRow.getValueJsonObj();
                if (file != null)
                    file.setRealTimeOut(GetTimeStat(valuePart));
                break;

            case JsonReportEntry.KEY_INVOC_TIME:
                valuePart = logEntryRow.getValueJsonObj();
                try {
                    if (invoc != null)
                        invoc.setRealTime(GetTimeStat(valuePart));
                } catch (NumberFormatException e) {
                    if (invoc != null)
                        invoc.setRealTime(1L);
                }

                break;
            case "file-size-stagein":
                if (file != null)
                    file.setSize(Long.parseLong(logEntryRow.getValueRawString(), 10));
                break;
            case "file-size-stageout":
                if (file != null)
                    file.setSize(Long.parseLong(logEntryRow.getValueRawString(), 10));
                break;
            case HiwayDBI.KEY_HIWAY_EVENT:
                valuePart = logEntryRow.getValueJsonObj();
                Hiwayevent he = new Hiwayevent();
                he.setWorkflowrun(wfRun);
                he.setContent(valuePart.toString());
                he.setType(valuePart.get("type").toString());
                oneSession.save(he);
                break;
            default:
            }

            tx.commit();

            at.setReturnvolume((long) logEntryRow.toString().length());
            Long tock = System.currentTimeMillis();
            at.setTock(tock);
            at.setTicktockdif(tock - tick);
            at.setWfName(this.wfName);
            at.setRunId(this.runIDat);

            sessAT.save(at);

            txMessung.commit();

        } catch (org.hibernate.exception.ConstraintViolationException e) {

            System.out.println("hiwayDB FEHLER | ConstraintViolationException: " + e.getConstraintName());
            String message = e.getSQLException().getMessage();

            if (message.contains("RundID_UNIQUE")) {
                System.out.println("hiwayDB FEHLER | runIDUnique");
            } else if ((message.contains("JustOneFile"))) {
                System.out.println("hiwayDB FEHLER | JustOneFile");
            }
            logStackTrace(e);

            if (tx != null) {
                System.out.println("hiwayDB Rollback");
                tx.rollback();
            }
            System.exit(1);

        } catch (Exception e) {
            if (tx != null) {
                System.out.println("hiwayDB Rollback");
                tx.rollback();
            }
            System.out.println("hiwayDB FEHLER | " + e);

            logStackTrace(e);
            System.exit(1);

        } finally {
            if (oneSession.isOpen()) {
                oneSession.close();
            }
            if (sessAT.isOpen()) {
                sessAT.close();
            }
        }
    }

    private static Long GetTimeStat(JSONObject valuePart) {
        return Long.parseLong(valuePart.get("realTime").toString(), 10);
    }

    private SessionFactory getSQLSession() {
        try {

            if (dbURL != null && username != null) {

                Configuration configuration = new Configuration();

                configuration.setProperty("hibernate.connection.url", dbURL);
                configuration.setProperty("hibernate.connection.username", username);
                if (this.password != null) {
                    configuration.setProperty("hibernate.connection.password", this.password);
                } else {
                    configuration.setProperty("hibernate.connection.password", "");
                }

                configuration.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQLInnoDBDialect");
                configuration.setProperty("hibernate.connection.driver_class", "com.mysql.jdbc.Driver");

                configuration.setProperty("connection.provider_class",
                        "org.hibernate.connection.C3P0ConnectionProvider");

                configuration.setProperty("hibernate.transaction.factory_class",
                        "org.hibernate.transaction.JDBCTransactionFactory");

                configuration.setProperty("hibernate.current_session_context_class", "thread");

                configuration.setProperty("hibernate.initialPoolSize", "20");
                configuration.setProperty("hibernate.c3p0.min_size", "5");
                configuration.setProperty("hibernate.c3p0.max_size", "1000");

                configuration.setProperty("hibernate.maxIdleTime", "3600");
                configuration.setProperty("hibernate.c3p0.maxIdleTimeExcessConnections", "300");

                configuration.setProperty("hibernate.c3p0.timeout", "330");
                configuration.setProperty("hibernate.c3p0.idle_test_period", "300");

                configuration.setProperty("hibernate.c3p0.max_statements", "13000");
                configuration.setProperty("hibernate.c3p0.maxStatementsPerConnection", "30");

                configuration.setProperty("hibernate.c3p0.acquire_increment", "10");

                configuration.addAnnotatedClass(de.huberlin.hiwaydb.dal.Hiwayevent.class);
                configuration.addAnnotatedClass(de.huberlin.hiwaydb.dal.File.class);
                configuration.addAnnotatedClass(de.huberlin.hiwaydb.dal.Inoutput.class);
                configuration.addAnnotatedClass(de.huberlin.hiwaydb.dal.Invocation.class);
                configuration.addAnnotatedClass(de.huberlin.hiwaydb.dal.Task.class);
                configuration.addAnnotatedClass(de.huberlin.hiwaydb.dal.Userevent.class);
                configuration.addAnnotatedClass(de.huberlin.hiwaydb.dal.Workflowrun.class);
                configuration.addAnnotatedClass(de.huberlin.hiwaydb.dal.Accesstime.class);

                StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder()
                        .applySettings(configuration.getProperties());
                SessionFactory sessionFactory = configuration.buildSessionFactory(builder.build());
                System.out.println(
                        "Session Factory Starten!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! NEUE Tocks gesetzt");
                return sessionFactory;

            }

            java.io.File f = new java.io.File(configFile);

            Configuration configuration = new Configuration().configure(f);
            StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder()
                    .applySettings(configuration.getProperties());
            SessionFactory sessionFactory = configuration.buildSessionFactory(builder.build());
            return sessionFactory;

        } catch (Throwable ex) {
            System.err.println("Failed to create sessionFactory object." + ex);
            throw new ExceptionInInitializerError(ex);
        }

    }

    private static void logStackTrace(Throwable e) {
        Writer writer = new StringWriter();
        PrintWriter printWriter = new PrintWriter(writer);
        e.printStackTrace(printWriter);
        System.err.println(writer.toString());
    }

    private SessionFactory getSQLSessionMessung() {
        try {

            String url = dbURL.substring(0, dbURL.lastIndexOf("/")) + "/messungen";

            Configuration configuration = new Configuration();

            configuration.setProperty("hibernate.connection.url", url);
            configuration.setProperty("hibernate.connection.username", username);
            if (this.password != null) {
                configuration.setProperty("hibernate.connection.password", this.password);
            } else {
                configuration.setProperty("hibernate.connection.password", "");
            }

            configuration.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQLInnoDBDialect");
            configuration.setProperty("hibernate.connection.driver_class", "com.mysql.jdbc.Driver");

            configuration.setProperty("connection.provider_class",
                    "org.hibernate.connection.C3P0ConnectionProvider");

            configuration.setProperty("hibernate.transaction.factory_class",
                    "org.hibernate.transaction.JDBCTransactionFactory");

            configuration.setProperty("hibernate.current_session_context_class", "thread");

            configuration.setProperty("hibernate.initialPoolSize", "20");
            configuration.setProperty("hibernate.c3p0.min_size", "5");
            configuration.setProperty("hibernate.c3p0.max_size", "1000");

            configuration.setProperty("hibernate.maxIdleTime", "3600");
            configuration.setProperty("hibernate.c3p0.maxIdleTimeExcessConnections", "300");

            configuration.setProperty("hibernate.c3p0.timeout", "330");
            configuration.setProperty("hibernate.c3p0.idle_test_period", "300");

            configuration.setProperty("hibernate.c3p0.max_statements", "13000");
            configuration.setProperty("hibernate.c3p0.maxStatementsPerConnection", "30");

            configuration.setProperty("hibernate.c3p0.acquire_increment", "10");

            configuration.addAnnotatedClass(de.huberlin.hiwaydb.dal.Accesstime.class);

            StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder()
                    .applySettings(configuration.getProperties());
            SessionFactory sessionFactory = configuration.buildSessionFactory(builder.build());

            return sessionFactory;

        } catch (Throwable ex) {
            System.err.println("Failed to create sessionFactory object." + ex);
            throw new ExceptionInInitializerError(ex);
        }

    }

}