2011-02-09 5 views
1

Hibernateを使用してJava Webアプリケーションを開発していますが、ルックアップテーブルを動的に作成しているため、JDBCを使用する場所があります。Hibernateのsession.connectionエラー:「ユーザーが多すぎます」

私のWebアプリを使用して数分後、私はこのエラーを取得する:

com.mysql.jdbc.exceptions.MySQLNonTransientConnectionException: Data source rejected establishment of connection, message from server: "Too many connections"

私は(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); 
} 

データレイヤー:私は問題を修正任意の提案

+2

は、確かにあなたが何らかの形で接続をリークしているように思わ:あなたと仮定すると

fact.close(); 

実際、このようなそれを命名。これを確認するには、アプリケーションが使用している接続数を監視できますか?統計が有効な場合、セッションファクトリからこの値を取得できます。 session.getSessionFactory()。getStatistics()。getConnectionCount()。 – Pace

+0

コードにログインしている例外はありますか? – axtavt

+0

こんにちはPace、 私は統計情報を有効にしています。私はアプリケーションを使用しているので、一貫して1つの接続にとどまっています。 こんにちはaxtavt、例外がスローされるのは、「あまりにも多くのユーザー」の例外が発生した場合だけです。 – jondb

答えて

1

ため

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(); 
} 

おかげでここ

は、コードは次のようになります。

私は何度もセッションファクトリを作成していました。ここ

protected static SessionFactory sessionFactory = null; 

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

/** 
* Returns a Hibernate session factory 
* @return 
*/ 
protected static SessionFactory getSessionFactory() 
{  
    return sessionFactory; 
} 
2

同じ問題:

だから、私はこれをしませんでした。インターネット上の多くの例では、セッションファクトリを閉じることを忘れてしまいます。これを閉じなければ、mysqlに「接続が多すぎます」というエラーが表示されます。このコード行でそれを閉じます:

SessionFactory fact = new Configuration().configure().buildSessionFactory(); 
関連する問題