2017-01-26 9 views
6

मुझे यह त्रुटि मिल रही है भले ही मैंने मैन्युअल रूप से लेनदेन शुरू कर दिया हो।प्राप्त सक्रिय लेनदेन के बिना मान्य नहीं है - हाइबरनेट 5

Session session = HibernateUtil.getSessionFactory().getCurrentSession(); 
transaction = session.getTransaction(); 
if(!transaction.isActive()) 
{ 
    transaction = session.beginTransaction(); 
} 

accessToken = session.get(OAuthAccessToken.class, token); 

hibernate.cfg.xml

<property name="hibernate.connection.autoReconnect">true</property> 

    <!-- Use the C3P0 connection pool. --> 
    <property name="hibernate.c3p0.min_size">5</property> 
    <property name="hibernate.c3p0.max_size">20</property> 
    <property name="hibernate.c3p0.timeout">300</property> 
    <property name="hibernate.c3p0.max_statements">50</property> 
    <property name="hibernate.c3p0.idle_test_period">3000</property> 

    <!-- Disable second-level cache. --> 
    <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property> 
    <property name="cache.use_query_cache">false</property> 
    <property name="cache.use_minimal_puts">false</property> 
    <property name="max_fetch_depth">3</property> 

    <!-- Bind the getCurrentSession() method to the thread. --> 
    <property name="current_session_context_class">thread</property> 

    <property name="hibernate.jdbc.batch_size">30</property> 

HibernateUtils

public class HibernateUtil 
{ 
private static final SessionFactory sessionFactory; 

static 
{ 
    try 
    { 
     // Create the SessionFactory from hibernate.cfg.xml 
     Configuration config = new Configuration().configure(); 
     config.setProperty("hibernate.show_sql", String.valueOf(ConfigManager.getInstance().getBoolean(Consts.CONFIG_DB_SHOW_SQL, false))); 
     config.setProperty("hibernate.format_sql", String.valueOf(ConfigManager.getInstance().getBoolean(Consts.CONFIG_DB_FORMAT_SQL, false))); 

     config.setProperty("hibernate.dialect", ConfigManager.getInstance().getString(Consts.CONFIG_DB_DIALECT, "org.hibernate.dialect.MySQLDialect")); 
     config.setProperty("hibernate.connection.driver_class", ConfigManager.getInstance().getString(Consts.CONFIG_DB_DRIVER_CLASS, "com.mysql.jdbc.Driver")); 
     config.setProperty("hibernate.connection.url", ConfigManager.getInstance().getString(Consts.CONFIG_DB_URL, "jdbc:mysql://localhost/photometo")); 
     config.setProperty("hibernate.connection.useUnicode", "true"); 
     config.setProperty("hibernate.connection.characterEncoding", "UTF-8"); 
     config.setProperty("hibernate.connection.username", ConfigManager.getInstance().getString(Consts.CONFIG_DB_USERNAME, "root")); 
     config.setProperty("hibernate.connection.password", ConfigManager.getInstance().getString(Consts.CONFIG_DB_PASSWORD, "")); 
     config.setProperty("hibernate.hbm2ddl.auto", ConfigManager.getInstance().getString(Consts.CONFIG_DB_HBMDDL_AUTO, "update")); 
     sessionFactory = config.buildSessionFactory(); 
    } 
    catch (Throwable ex) 
    { 
     throw new ExceptionInInitializerError(ex); 
    } 
} 

public static SessionFactory getSessionFactory() 
{ 
    return sessionFactory; 
} 

} 

मैंने देखा यह कुछ समय के बाद हो रहा शुरू होता है कि। अगर मैं टॉमकैट को फिर से शुरू करता हूं या फिर से तैनात करता हूं, समस्या

+1

दिए गए कॉन्फ़िगरेशन ठीक दिखते हैं। क्या कोड के न्यूनतम व्यवहार्य संस्करण को धक्का देना संभव है जो गितहब पर इस मुद्दे को प्रदर्शित कर सकता है? या कम से कम स्टैक ट्रेस को प्रश्न में जोड़ें। – skadya

उत्तर

2

आपने कभी लेनदेन शुरू नहीं किया है और आप दूसरे का लेनदेन नहीं प्राप्त कर सकते हैं। यही कारण है कि आप इसे कॉल करते समय एक त्रुटि प्राप्त कर रहे हैं:

Session session = HibernateUtil.getSessionFactory().getCurrentSession(); 
    transaction = session.getTransaction(); // Here is the error! You can't get an active transaction, becasue there isn't even started 
    if(!transaction.isActive()) // transaction.isActive() is usually for closing a transction in the end 
    { 
     transaction = session.beginTransaction(); // You are starting the transaction! 
    } 

accessToken = session.get(OAuthAccessToken.class, token); 

आपको सक्रिय लेनदेन नहीं मिल सकता है क्योंकि यहां तक ​​कि शुरू भी नहीं हुआ है। यह करने के लिए कोड में परिवर्तित करें: क्यों एक गैर-प्रबंधित परिवेश में लेन-देन शुरू करने का सही

// Non-managed environment idiom with getCurrentSession() 
try { 
    factory.getCurrentSession().beginTransaction(); 

    // do some work 
    ... 

    factory.getCurrentSession().getTransaction().commit(); 
} 
catch (RuntimeException e) { 
    factory.getCurrentSession().getTransaction().rollback(); 
    throw e; // or display error message 
} 

Documentation of Hibernate से यह है:

// Non-managed environment idiom with getCurrentSession() 
try { 
    factory.getCurrentSession().beginTransaction(); 

    // do some work 
    ... 

    factory.getCurrentSession().getTransaction().commit(); 
} 
catch (RuntimeException e) { 
    factory.getCurrentSession().getTransaction().rollback(); 
    throw e; // or display error message 
} 

// Non-managed environment idiom with getCurrentSession() try { 
    factory.getCurrentSession().beginTransaction(); 

    // do some work 
    ... 

    factory.getCurrentSession().getTransaction().commit(); } catch (RuntimeException e) { 
    factory.getCurrentSession().getTransaction().rollback(); 
    throw e; // or display error message } 

getTransaction() के प्रलेखन के बाद, अपने वर्तमान सत्र नहीं है एक लेनदेन शुरू किया।

getTransaction() 
     Get the Transaction instance associated with this session. 

और यहाँ कारण है कि एक सौदे 11.2 Database Transaction demarcation शुरू:

डाटाबेस, या प्रणाली, लेन-देन सीमाओं हमेशा जरूरी हैं। डेटाबेस के साथ संचार डेटाबेस लेनदेन के बाहर हो सकता है (ऐसा लगता है कि ऑटो-प्रतिबद्ध मोड में उपयोग किए जाने वाले कई डेवलपर्स को भ्रमित कर रहा है)। केवल-पढ़ने के लिए भी, स्पष्ट लेनदेन सीमाओं का उपयोग करें।

और लंबे समय लेन-देन होने, क्योंकि आपके डीबी में ताले का एक बहुत उत्पन्न DB के लिए बुरा है, Session and transaction scopes

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

+0

मैंने लेनदेन शुरू किया है, यदि आप मेरे प्रश्न को देखते हैं तो आप यह भी देखेंगे: 'लेनदेन = session.beginTransaction();' – pedja

+0

लेकिन आप इसे शुरू करने से पहले 'लेनदेन = session.getTransaction();' कॉल करने का प्रयास कर रहे हैं, यही कारण है कि त्रुटि। – Gatusko

+0

नहीं, 'session.get' पर त्रुटि फेंक दी गई है 'getTransaction' – pedja

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