2012-03-26 14 views
6

मुझे वर्तमान में एक दिलचस्प समस्या का सामना करना पड़ रहा है।वाडिन और हाइबरनेट - डेटाबेस से कनेक्शन बंद करें

मेरी स्थिति:

  • मैं वर्तमान में एक वेब सेवा
  • मेरे डेटाबेस के पीछे जावा डर्बी
  • मैं उपयोग कर रहा हूँ (मैं ग्रहण में जावा के साथ प्रोग्रामिंग के लिए VAADIN उपयोग कर रहा हूँ) के विकास कर रहा हूँ मेरी डेटाबेस
  • मैं वर्तमान में बिलाव v7.0 पर उसे लागू करने से कर रहा हूँ के लिए हाइबरनेट

मेरे समस्या:

  • जब मैं अपने कोड में कुछ बदलने (क्या कोई फर्क नहीं पड़ता), सर्वर को पुनः आरंभ किया जा रहा है की आवश्यकता के बिना यह फिर से लोड करना चाहिए - मुझे लगता है कि है कि कुल मिलाकर अपेक्षित व्यवहार है
  • सर्वर अनुप्रयोग को पुनः लोड करता है, लेकिन अगर मैं कुछ पर क्लिक करने की कोशिश करता हूं (इसलिए पुनः लोड करने के बाद), उदाहरण के लिए प्रवेश-बटन, मैं कोई त्रुटि मिलती है

त्रुटि संदेश:

कारण: org.hibernate.exception.GenericJDBCException: मूल कारण त्रुटि XSDB6 साथ कनेक्शन] नहीं खोल सका: एक और उदाहरण डर्बी का पहले ही डेटाबेस सी: \ HTML-Ausgabe \ डेटाबेस \ DocumentDB बूट कर चुका है। org.apache.derby.iapi.error.StandardException.newException (अज्ञात स्रोत) पर ...

इस

पर मेरे विचार ऐसा लगता है कि किसी भी तरह से reloading की प्रक्रिया पर कनेक्शन/संदर्भ नष्ट हो नहीं करता है/बंद हाइबरनेट करने के लिए और इतने त्रुटि 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, जिसमें मैं के लिए एक "श्रोता" जोड़ा ऊपरी HibernateListener (श्रोता पर पाठ की जाँच करें) दिखाया गया है:

<?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> 

मैं था अनुसंधान, भी हाइबरनेट मंच पर पोस्ट (अब भी एक भी उत्तर के बिना :() और अब इस w पर उससे मिलते-जुलते विषय नहीं मिला ebsite। तो मुझे आशा है कि मैंने कुछ गलत नहीं किया है।

यदि आप में से कोई भी मेरी मदद कर सकता है, तो मैं वास्तव में खुश रहूंगा। वर्तमान में मुझे नहीं पता कि इस त्रुटि को रोकने के लिए क्या बदलना है। और, ज़ाहिर है, अगर मैं इंटरनेट पर इंटरनेट पर हूं, तो मैं हमेशा पूरे सर्वर को पुनरारंभ नहीं कर सकता, अगर मैं कोड की एक पंक्ति बदलता हूं।

धन्यवाद हर जवाब के लिए एक बहुत और सोचा था कि तुम मेरे साथ साझा कर रहे हैं।

उत्तर

4

मैं मेरी समस्या का हल मिल गया।

सबसे पहले, यह एक अपाचे डर्बी समस्या थी के रूप में मैं इसे मजबूर साथ

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

यह मेरे लिए ठीक काम किया बंद हुआ।

अब मैं अपने डेटाबेस वोम अपाचे डर्बी MySQL के लिए swichted और पाया है कि समस्या, ऊपर मेरे सवाल में वर्णित है, अब और नहीं होती है।

तो, सबक सीखा: अपाचे डर्बी प्रयोग न करें। मुझे उम्मीद है कि यह किसी और की मदद करेगा। आपकी सहायता के लिए धन्यवाद।

+0

हाँ मैं हाइपरएसक्यूएल का उपयोग करता हूं जब मुझे देव के दौरान स्मृति में डीबी की आवश्यकता होती है। मुझे कभी समस्या नहीं दी है। – anataliocs

2

त्वरित और गंदे समाधान: एक त्वरित और गंदे अस्थायी समाधान केवल जोड़ना पड़ सकता है? पुनरारंभ करें हर जगह आपके वैडिन एप्लिकेशन से जुड़ा हुआ है।

बेहतर समाधान: मैं हाइबरनेट के साथ सत्र-प्रति-अनुरोध पैटर्न का उपयोग करने की सलाह देता हूं। वाडिन के लेनदेन श्रोता का उपयोग करके आप आसानी से यह सुनिश्चित कर सकते हैं कि अतिरिक्त तर्क के साथ हमारे प्रोग्राम कोड को प्रदूषित किए बिना प्रत्येक अनुरोध पर सत्र बंद हो गया है।

आप अपने मुख्य आवेदन विधि में इन तरीकों जगह और फिर अपने 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

संबंधित मुद्दे