2016-08-15 55 views
7

私は大学のプロジェクトで初めてHibernateを使用しています。私は初心者です。私は私が私の教授で、私は読んでいくつかのチュートリアルによって与えられたすべての指示に従ったと思いますが、私はタイトルにある例外を取得しておいてください。Java/Hibernate - 例外:内部接続プールが最大サイズに達していて、現在接続できません。

Exception in thread "main" org.hibernate.HibernateException: The internal connection pool has reached its maximum size and no connection is currently available! 

私が何をしようとしているだけで(オブジェクトを格納していますAbitazioneDB)を既に作成したMySqlデータベースに追加します。

@Entity 
@Table(name="abitazioni") 
public class AbitazioneDB { 

    @Id 
    @GeneratedValue 
    @Column(name="id") 
    private Integer id; 

    @Column(name="indirizzo") 
    private String indirizzo; 

    @Column(name="nome_proprietario") 
    private String nomeProprietario; 

    @Column(name="tel_proprietario") 
    private String telProprietario; 

    public AbitazioneDB(){ 
     super(); 
    } 

    public AbitazioneDB save(){ 

     SessionFactory sf = HibernateUtil.getSessionFactory(); 
     Session session = sf.getCurrentSession(); 
     session.beginTransaction(); 

     Integer id = (Integer) session.save(this); 
     this.setId(id); 

     session.getTransaction().commit();  
     session.close(); 

     return this; 
    } 
} 

これは私のHibernateUtilのクラスです:

public class HibernateUtil { 

    private static SessionFactory sessionFactory; 

    private static SessionFactory createSessionFactory() { 
     sessionFactory = new Configuration().configure().buildSessionFactory(); 
     return sessionFactory; 
    } 

    public static SessionFactory getSessionFactory() { 
     if (sessionFactory == null) 
      sessionFactory = createSessionFactory(); 

     return sessionFactory; 
    } 
} 
これは私の AbitazioneDBクラス(私はゲッターとセッターをomittます)です

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE hibernate-configuration PUBLIC 
    "-//Hibernate/Hibernate Configuration DTD 3.0//EN" 
    "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> 

<hibernate-configuration> 
    <session-factory> 
     <!-- Connection to the database --> 
     <property name="connection.driver_class">com.mysql.jdbc.Driver</property> 
     <property name="connection.url">jdbc:mysql://localhost:3306/AllarmiDomesticiDB</property> 

     <!-- Credentials --> 
     <property name="hibernate.connection.username">root</property> 
     <property name="connection.password">password</property> 

     <!-- JDBC connection pool (use the built-in) --> 
     <property name="connection.pool_size">1</property> 

     <!-- SQL dialect --> 
     <property name="dialect">org.hibernate.dialect.MySQLDialect</property> 

     <!-- Enable Hibernate's automatic session context management --> 
     <property name="current_session_context_class">thread</property> 

     <!-- Disable the second-level cache --> 
     <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property> 

     <property name="show_sql">true</property> 

     <!-- Entity --> 

     <mapping class="it.allarmiDomestici.centraleOperativaRemota.dbWrapper.AbitazioneDB" /> 

    </session-factory> 
</hibernate-configuration> 

:これは私の設定ファイルです

これは私のTestHibernateクラスで、です方法:

public class TestHibernate { 

    public static void main(String[] args) { 
     AbitazioneDB ab = new AbitazioneDB(); 

     ab.setIndirizzo("Via Napoli, 29"); 
     ab.setNomeProprietario("Mario Rossi"); 
     ab.setTelProprietario("3333333333"); 

     ab.save(); 

     System.out.println("Ok!"); 

    } 
} 

私はTestHibernateを実行すると、私は常にその例外を取得し、私は理由は分かりません。たぶん私はconnection.pool_sizeプロパティを変更する必要がありますが、私はそれを行う場合、私はより多くのエラーを取得するようです。誰か助けてくれますか?

+0

getCurrentSession()でセッションを取得した場合は、 'session.close()'を使用しないでください。おそらく接続プールが枯渇している可能性があります。 – 11thdimension

+0

答えをありがとうが、それは動作しませんでした。まだ同じ例外が発生しています。 – Alessandro

+0

これは、接続プールが実際にすべての接続を使い果たしていることを意味します。長時間実行されているデータベース呼び出しが多すぎますか? – 11thdimension

答えて

7

これを試してみてください:

HibernateUtilの:

public static Session getHibernateSession() { 

    final SessionFactory sf = new Configuration() 
     .configure("yourConfig.cfg.xml").buildSessionFactory(); 

    // factory = new Configuration().configure().buildSessionFactory(); 
    final Session session = sf.openSession(); 
    return session; 
    } 

、代わりのSessionFactory利用のセッションを使用する:その後、

final Session session = HibernateUtil.getHibernateSession(); 

と使用:

Transaction tx = session.beginTransaction(); 
// all your methods 
tx.commit(); 
session.close(); 

これが役に立ちます。

また、必要がない場合は、実際に接続プールプロパティをhbmに設定することはできません。

+0

答えをありがとうが、まだ結果はありません。 – Alessandro

+0

@Alessandroあなたはconfig xmlからそのプロパティを削除しようとしましたか? –

+0

@Alessandroそして、POJOクラスの中にそのsaveメソッドを持たせる代わりに、mainメソッドでそれを試してみることができますか? –

8

プール内で単一接続を使用しているため、接続プールが接続を使い果たしました。 100

+1

もう一度お返事ありがとうございますが、私の元の投稿で言ったように、それは役に立たないようです。 – Alessandro

+0

これは実際に私のために働いた。 –

+0

ありがとう! –

5
<property name="connection.pool_size">1</property> 

のように100かそこらのように、大きなサイズに接続プールのサイズを変更してください、とあなたが快適になるだろう何かに

<property name="connection.pool_size">1</property> 

変更し、このプロパティ。

<property name="connection.pool_size">100</property> 
+1

これは[この既存の回答]の繰り返しのようです(http://stackoverflow.com/questions/38960921/java-hibernate-exception-the-internal-connection-pool-has-reached-its-maximum/38961145#38961145 )。 – Pang

関連する問題