Ошибка session.connection в Hibernate: «Слишком много пользователей» - PullRequest
1 голос
/ 09 февраля 2011

Я занимаюсь разработкой веб-приложения на Java с использованием Hibernate, но есть часть, где я хочу использовать JDBC, потому что я динамически создаю справочные таблицы.

После нескольких минут использования моего веб-сайтаприложение получаю эту ошибку:

com.mysql.jdbc.exceptions.MySQLNonTransientConnectionException: источник данных отклонил установление соединения, сообщение от сервера: «Слишком много соединений»

Я знаю, что использование session.connection () устарело, но я просто хочу получить базовое соединение JDBC.Я экспериментировал с помощью session.doWork (), но ошибка все еще возникала, как и раньше.

Вот как выглядит код:

Уровень домена:

/**
 * Goes through the list of lookupTableAbstractions and persists each one
 * @param lookupData
 */
public void updateLookupValues( List<LookupTableAbstraction> lookupData )
{
    lookupTablesData.dropAllLookupTables(lookupData);

    lookupTablesData.createLookupTables(lookupData);

    for (LookupTableAbstraction lookupTable : lookupData)
        lookupTablesData.persistLookupTableValues(lookupTable);
}

Уровень данных:

public LookupTableAbstraction getLookupTable( String tableName )
{
    LookupTableAbstraction lookupTable = new LookupTableAbstraction();

    Session session = getSessionFactory().openSession();

    String sqlQuery = "select value from " + tableName;

    List<String> lookupTableValues = session.createSQLQuery(sqlQuery).list();

    session.close(); 

    lookupTable.setTableName(tableName);
    for (String value : lookupTableValues)
        lookupTable.addValue(value);

    return lookupTable;
}

/**
 * Persists the passed in lookup table.
 * The lookup table that is used is determine by
 * the tableName field of the passed in lookupTable
 * @param lookupTable
 */
public void persistLookupTableValues( LookupTableAbstraction lookupTable )
{
    Session session = getSessionFactory().openSession();
    Transaction tx = session.beginTransaction();
    Connection connection = null;
    try
    {
        connection = getJDBCConnectionFromHibernate(session);

        Statement stmt = connection.createStatement();

        String tableName = lookupTable.getTableName();
        for (String value : lookupTable.getValues() ) 
        {
            String sql = " insert into " + tableName + 
                         " (value) " +
                         " values " +
                         "('" + value + "')";

            System.out.println(sql);

            stmt.executeUpdate(sql);
        }
        stmt.close();
    }
    catch( Exception e )
    {
        System.out.println("Exception(persistLookupTableValues): " + e.getMessage());
        e.printStackTrace();
    }
    finally
    {

        try {
            tx.commit();
            connection.close();
            session.close();
        } catch (SQLException e) {
            System.out.println("Exception(persistLookupTableValues): " + e.getMessage());
            e.printStackTrace();
        }
    }
}

/**
 * Drop's all lookup tables.
 * It drops each table based off the lookupTableAbstractions in the passed in list
 * @param lookupData
 */
public void dropAllLookupTables( List<LookupTableAbstraction> lookupData )
{
    Session session = getSessionFactory().openSession();
    Transaction tx = session.beginTransaction();

    Connection connection = null;
    try
    {
        connection = getJDBCConnectionFromHibernate(session);

        Statement stmt = null;
        for (LookupTableAbstraction lookupTableAbstraction : lookupData) {
            stmt = connection.createStatement();
            stmt.executeUpdate("drop table " + lookupTableAbstraction.getTableName());
        }

        stmt.close();
    }
    catch( Exception e )
    {
        System.out.println("Exception(dropAllLookupTables): " + e.getMessage());
        e.printStackTrace();
    }
    finally
    {
        try {
            tx.commit();
            connection.close();
            session.close();
        } catch (SQLException e) {
            System.out.println("Exception(dropAllLookupTables): " + e.getMessage());
            e.printStackTrace();
        }
    }
}

/**
 * Creates all lookup tables, one for each lookupTableAbstraction
 * in the passed in list
 * @param lookupData
 */
public void createLookupTables( List<LookupTableAbstraction> lookupData )
{
    Session session = getSessionFactory().openSession();
    Transaction tx = session.beginTransaction();

    Connection connection = null;
    try
    {
        connection = getJDBCConnectionFromHibernate(session);

        Statement stmt = null;
        for (LookupTableAbstraction lookupTableAbstraction : lookupData) {
            stmt = connection.createStatement();
            stmt.executeUpdate("create table " + lookupTableAbstraction.getTableName() + 
                               " ( ID  int(11) auto_increment, " +
                               "  value text, " +
                               "  primary key (ID) )");
        }

        stmt.close();
    }
    catch( Exception e )
    {
        System.out.println("Exception(createLookupTables): " + e.getMessage());
        e.printStackTrace();
    }
    finally
    {
        try {
            tx.commit();
            connection.close();
            session.close();
        } catch (SQLException e) {
            System.out.println("Exception(createLookupTables): " + e.getMessage());
            e.printStackTrace();
        }
    }
}

protected Connection getJDBCConnectionFromHibernate( Session session )
{
    return session.connection();
}

Спасибо за любые предложения

Ответы [ 2 ]

2 голосов
/ 30 апреля 2012

Та же проблема здесь. Многие примеры в интернете забывают закрыть фабрику сессий. Если вы не закроете это, вы получите ошибку «слишком много соединений». Закройте это с помощью этой строки кода:

fact.close();

Предполагая, что вы назвали это факт как это:

SessionFactory fact = new Configuration().configure().buildSessionFactory();
1 голос
/ 11 февраля 2011

Я исправил проблему.

Я создавал фабрику сеансов снова и снова.

Итак, я сделал это:

protected static SessionFactory sessionFactory = null;

static 
{
    sessionFactory = new Configuration().configure().buildSessionFactory();
}

/**
 * Returns a Hibernate session factory
 * @return
 */
protected static SessionFactory getSessionFactory()
{       
    return sessionFactory;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...