2012-03-26 12 views
6

私は現在面白い問題が発生しています。VaadinとHibernate - データベースへの接続を正しく閉じる

私の状況:

  • 私は現在
  • (私はEclipseでJAVAを使用したプログラミングのためのVAADINを使用しています)は、Webサービスを開発しています後ろの私のデータベースは、私が使用していたJavaダービー
  • です私は現在のTomcat V7.0上で、それを展開しています
  • 私のデータベースのために冬眠

私の問題:私は(何を重要ではありません)私のコードで何かを変更すると

  • 、サーバーが再起動されているのを必要とせず、それをリロードする必要があります - 私はそれが全体的に予想される動作
  • だと思いますサーバーはアプリケーションの成功をリロードしますが、何かをクリックしようとすると(リロード後に)、例えばログイン-ボタン、私はエラー

エラーメッセージを取得:

原因:org.hibernate.exception.GenericJDBCException:別のインスタンス:根本原因エラーXSDB6と 接続]を開くことができませんでしたがDerbyの は既にデータベースC:\ HTML-Ausgabe \ database \ DocumentDBを起動している可能性があります。 org.apache.derby.iapi.error.StandardException.newException(不明 出典)で ...この

私の考えに思えその何とかリロードプロセスの接続/

を/クローズ破壊しますdoesntの休止状態とサーバーがデータベースへの再接続しようとしたときにエラーがoccures

マイコードするコンテキスト210

私は休止状態リスナーと呼ばれるクラス、持っている:

public class HibernateListener implements ServletContextListener { 

    public void contextInitialized(ServletContextEvent event) { 
     HibernateUtil.getSessionFactory(); // Just call the static initializer of that class  
    } 

    public void contextDestroyed(ServletContextEvent event) { 
     HibernateUtil.getSessionFactory().close(); // Free all resources 
    } 
} 

私はhibernate.cfg.xml:私は "リスナー" を追加した

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE hibernate-configuration PUBLIC 
     "-//Hibernate/Hibernate Configuration DTD 3.0//EN" 
     "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> 
<hibernate-configuration> 
    <session-factory> 
     <property name="hibernate.connection.driver_class">org.apache.derby.jdbc.EmbeddedDriver</property> 
     <property name="hibernate.connection.url">jdbc:derby:C:\HTML-Ausgabe\database\DocumentDB;create=true</property> 
     <property name="hibernate.dialect">org.hibernate.dialect.DerbyDialect</property> 
     <property name="hibernate.current_session_context_class">thread</property> 
     <property name="hibernate.hbm2ddl.auto">create-drop</property> 
     <property name="hibernate.show_sql">true</property> 

     <mapping class="view.model.database.User"/> 
     <mapping class="view.model.database.Document"/> 
     <mapping class="view.model.database.Version"/> 
     <mapping class="view.model.database.VersionData"/> 
    </session-factory> 
</hibernate-configuration> 

マイ(VAADIN)のweb.xmlを、私は、研究をしました(まだ1つも答えずに:()Hibernateのフォーラムにも掲載され、現在、このワットに一致するテーマを見つけることができませんでした

<?xml version="1.0" encoding="UTF-8"?> 
<web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> 
    <display-name>Bachelorprojekt</display-name> 
    <context-param> 
     <description>Vaadin production mode</description> 
     <param-name>productionMode</param-name> 
     <param-value>false</param-value> 
    </context-param> 
    <servlet> 
     <servlet-name>Bachelorprojekt Application</servlet-name> 
     <servlet-class>com.vaadin.terminal.gwt.server.ApplicationServlet</servlet-class> 
     <init-param> 
      <description>Vaadin application class to start</description> 
      <param-name>application</param-name> 
      <param-value>view.view.WebsiteFrame</param-value> 
     </init-param> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>Bachelorprojekt Application</servlet-name> 
     <url-pattern>/*</url-pattern> 
    </servlet-mapping> 

    <listener> 
     <listener-class>view.model.database.HibernateListener</listener-class> 
    </listener> 
    <welcome-file-list> 
     <welcome-file>index.html</welcome-file> 
     <welcome-file>index.htm</welcome-file> 
     <welcome-file>index.jsp</welcome-file> 
     <welcome-file>default.html</welcome-file> 
     <welcome-file>default.htm</welcome-file> 
     <welcome-file>default.jsp</welcome-file> 
    </welcome-file-list> 
</web-app> 

:アッパーHibernateListenerを(リスナーのテキストを確認してください)に示しますebsite。だから私は間違ったことをしなかったことを願っています。

あなたの誰かが何とか私を助けてくれたら、本当にうれしいです。現在、私はこのエラーが発生するのを止めるために何を変えるべきかを知らない。もちろん、1行のコードを変更すると、アプリケーションがインターネットに接続されているときに、後でサーバー全体を再起動することはできません。

すべての回答に感謝し、あなたが私と共有していると思いました。

答えて

4

私は私の問題への解決策を見つけました。すべての

まず私は

public void contextDestroyed(ServletContextEvent event) { 
    HibernateUtil.getSessionFactory().close(); // Free all resources 
    try { 
      DriverManager.getConnection("jdbc:derby:;shutdown=true"); 
    } catch (SQLException e) {} 
    } 
} 

を閉じるには、それを強制として、それは私のためにうまく働いた、Apacheのダービーの問題でした。

私のデータベースvom apache derbyをmysqlにswichtedし、上の質問で説明した問題がもう発生しなかったことに気付きました。

したがって、学んだこと:apache derbyを使用しないでください。私はこれがいつか誰かを助けることを願っています。あなたの助けに感謝します。

+0

そう、私はHyperSQLを使用していますが、私は開発中にインメモリDBが必要です。決して私に問題を与えたことはありません。 – anataliocs

2

迅速かつ汚いソリューション:?迅速かつ汚い一時的な解決策は自分Vaadinアプリケーションがリンクされているすべての箇所にrestartApplicationを追加するかもしれません。

もっと良い解決策:私は、Hibernateでsession-per-requestパターンを使用することをお勧めします。 Vaadinのトランザクションリスナを使用することで、余分なロジックでプログラムコードを汚染することなく、各リクエストでセッションが閉じられることを容易に確認できます。

メインアプリケーションのメソッドにこれらのメソッドを配置し、init()メソッドでattachVaadinTransactionListener()を実行します。以下の詳細な記事にリンクしてください。

private void attachVaadinTransactionListener() { 
    getContext().addTransactionListener(new TransactionListener() { 
     public void transactionEnd(Application application, 
       Object transactionData) { 
      // Transaction listener gets fired for all (Http) sessions 
      // of Vaadin applications, checking to be this one. 
      if (application == EnpApplication.this) { 
       closeSession(); 
      } 
     }   

     public void transactionStart(Application application, 
       Object transactionData) { 
     } 
    }); 
} 

private void closeSession() { 
    Session sess = HibernateUtil.getSessionFactory().getCurrentSession(); 
    if (sess.getTransaction().isActive()) {   
     sess.getTransaction().commit(); 

     if(sess.isOpen()) { sess.flush(); } 
    } 
    if(sess.isOpen()) {   
     sess.close(); 
    } 
} 

Hibernate with Vaadin

+0

一時的な解決策は、Vaadinアプリケーションがリンクされているすべての場所に?restartApplicationを追加することです。 – anataliocs

関連する問題