2014-10-27 10 views
5

मैं मारिया डीबी डेटाबेस के साथ संचार के लिए हाइबरनेट 4 और सी 3 पी 0 का उपयोग कर जावा एसई अनुप्रयोग के साथ विकास कर रहा हूं। यह लंबे समय तक चलने वाला एप्लिकेशन है, बाहर से संकेतों की प्रतीक्षा कर रहा है, इसलिए कभी-कभी डाटाबेस 8 घंटे निष्क्रियता के बाद मेरे कनेक्शन बंद कर देता है। मैंने c3p0 कनेक्शन को कॉन्फ़िगर करने की कोशिश की लेकिन यह काम नहीं कर रहा है। क्या तुम मेरी मदद कर सकते हो?कनेक्शन c3p0 पूल में जांच

त्रुटि लॉग (नाम क्वेरी निष्पादन के दौरान फेंक दिया):

2014-10-27 08:10:19.062 ERROR [trans] com.example.runnable.T1 - Exception thrown during event processing, rollbacking transaction: org.hibernate.exception.JDBCConnectionException: could not extract ResultSet 
     at org.hibernate.exception.internal.SQLStateConversionDelegate.convert(SQLStateConversionDelegate.java:132) 
     at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:49) 
     at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:126) 
     at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:112) 
     at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:91) 
     at org.hibernate.loader.Loader.getResultSet(Loader.java:2065) 
     at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1862) 
     at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1838) 
     at org.hibernate.loader.Loader.doQuery(Loader.java:909) 
     at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:354) 
     at org.hibernate.loader.Loader.doList(Loader.java:2553) 
     at org.hibernate.loader.Loader.doList(Loader.java:2539) 
     at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2369) 
     at org.hibernate.loader.Loader.list(Loader.java:2364) 
     at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:496) 
     at org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:387) 
     at org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:231)                                      
     at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1264)                                          
     at org.hibernate.internal.QueryImpl.list(QueryImpl.java:103)                                           
     at com.example.runnable.T1.find(EventsTransmitter.java:140)                               
     at com.example.runnable.T1.run(EventsTransmitter.java:86)                                 
     at java.lang.Thread.run(Thread.java:745)                                                
Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: The last packet successfully received from the server was 108,132,692 milliseconds ago. The last packet sent successfully to the server was 108,132,692 milliseconds ago. is longer than the server configured value of 'wait_timeout'. You should consider either expiring and/or testing connection validity before use in your application, increasing the server configured values for client timeouts, or using the Connector/J connection property 'autoReconnect=true' to avoid this problem.                                        
     at sun.reflect.GeneratedConstructorAccessor30.newInstance(Unknown Source)                                        
     at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)                                
     at java.lang.reflect.Constructor.newInstance(Constructor.java:408)                                         
     at com.mysql.jdbc.Util.handleNewInstance(Util.java:377)                                            
     at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1036)                                       
     at com.mysql.jdbc.MysqlIO.send(MysqlIO.java:3661)                                              
     at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2417)                                            
     at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2582)                                           
     at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2530)                                         
     at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1907)                                      
     at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:2030)                                       
     at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:82)                                  
     ... 17 more                                                       
Caused by: java.net.SocketException: Broken pipe                                                
     at java.net.SocketOutputStream.socketWrite0(Native Method)                                           
     at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:109) 
     at java.net.SocketOutputStream.write(SocketOutputStream.java:153) 
     at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:82) 
     at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:140) 
     at com.mysql.jdbc.MysqlIO.send(MysqlIO.java:3643) 
     ... 23 more 

pom.xml:

<dependency> 
    <groupId>mysql</groupId> 
    <artifactId>mysql-connector-java</artifactId> 
    <version>5.1.33</version> 
</dependency> 
<dependency> 
    <groupId>org.hibernate</groupId> 
    <artifactId>hibernate-core</artifactId> 
    <version>4.3.6.Final</version> 
</dependency> 
<dependency> 
    <groupId>org.hibernate</groupId> 
    <artifactId>hibernate-validator</artifactId> 
    <version>5.1.2.Final</version> 
</dependency> 
<dependency> 
    <groupId>org.hibernate</groupId> 
    <artifactId>hibernate-entitymanager</artifactId> 
    <version>4.3.1.Final</version> 
</dependency> 
<dependency> 
    <groupId>org.hibernate</groupId> 
    <artifactId>hibernate-ehcache</artifactId> 
    <version>4.3.6.Final</version> 
</dependency> 
<dependency> 
    <groupId>org.hibernate</groupId> 
    <artifactId>hibernate-c3p0</artifactId> 
    <version>4.3.6.Final</version> 
</dependency> 

src/मुख्य/संसाधन/hibernate.cfg.xml:

<?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> 
    <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> 
    <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> 
    <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/MyBase?zeroDateTimeBehavior=convertToNull&amp;autoReconnect=true</property> 
    <property name="hibernate.connection.username">user</property> 
    <property name="hibernate.connection.password">pass</property> 

    <property name="hibernate.current_session_context_class">thread</property> 

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

    <property name="hibernate.cache.use_second_level_cache">true</property> 
    <property name="hibernate.cache.use_query_cache">true</property> 
    <property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property> 

    <property name="hibernate.c3p0.min_size">5</property> 
    <property name="hibernate.c3p0.max_size">10</property> 
    <property name="hibernate.c3p0.timeout">300</property> 
    <property name="hibernate.c3p0.max_statements">30</property> 

    <mapping class="com.example.domain.E" /> 
    </session-factory> 
</hibernate-configuration> 

src/main/resource /c3p0-config.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<c3p0-config> 
    <default-config> 
    <property name="preferredTestQuery">SELECT 1 FROM DUAL</property> 
    <property name="testConnectionOnCheckin">true</property> 
    <property name="idleConnectionTestPeriod">1800</property> <!-- 30 minutes --> 
    </default-config> 
</c3p0-config> 

संपादित

स्टार्टअप पर लॉग मैं c3p0 विन्यास (Netbeans से Maven द्वारा क्रियान्वित) हो रही है में:

... 
INFO: Initializing c3p0 pool... [email protected] 
[ connectionPoolDataSource -> [email protected] [ acquireIncrement -> 3, acquireRetryAttempts -> 30, acquireRetryDelay -> 1000, 
autoCommitOnClose -> false, automaticTestTable -> null, breakAfterAcquireFailure -> false, checkoutTimeout -> 0, connectionCustomizerClassName -> null, 
connectionTesterClassName -> com.mchange.v2.c3p0.impl.DefaultConnectionTester, debugUnreturnedConnectionStackTraces -> false, factoryClassLocation -> null, 
forceIgnoreUnresolvedTransactions -> false, identityToken -> z8kflt95n558v5xddgsj|2cf3d63b, idleConnectionTestPeriod -> 1800, initialPoolSize -> 5, 
maxAdministrativeTaskTime -> 0, maxConnectionAge -> 0, maxIdleTime -> 300, maxIdleTimeExcessConnections -> 0, maxPoolSize -> 10, maxStatements -> 30, 
maxStatementsPerConnection -> 0, minPoolSize -> 5, nestedDataSource -> [email protected] [ description -> null, driverClass -> null, 
factoryClassLocation -> null, identityToken -> z8kflt95n558v5xddgsj|1e6a3214, jdbcUrl -> jdbc:mysql://localhost:3306/MyBase?zeroDateTimeBehavior=convertToNull&autoReconnect=true, 
properties -> {user=******, password=******} ], preferredTestQuery -> SELECT 1 FROM DUAL, propertyCycle -> 0, statementCacheNumDeferredCloseThreads -> 0, 
testConnectionOnCheckin -> true, testConnectionOnCheckout -> false, unreturnedConnectionTimeout -> 0, usesTraditionalReflectiveProxies -> false; userOverrides: {} ], 
dataSourceName -> null, factoryClassLocation -> null, identityToken -> z8kflt95n558v5xddgsj|7161d8d1, numHelperThreads -> 3 ] 
... 

संपादित 2

मैवेन-शेड-प्लगइन द्वारा बनाए गए जार को निष्पादित करते समय मुझे मिल रहा है:

पाज़ 27, 2014 10:56:22 org.hibernate.engine.jdbc.connections.internal.ConnectionProviderInitiator चेतावनी instantiateC3p0Provider: HHH000022: c3p0 गुण का सामना करना पड़ा रहे थे, लेकिन c3p0 प्रदाता वर्ग पर नहीं मिला था क्लासपाथ; इन गुणों को अनदेखा किया जा रहा है। पाज़ 27, 2014 22:56:22 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl कॉन्फ़िगर चेतावनी देते हैं: HHH000402: का उपयोग कर हाइबरनेट में निर्मित कनेक्शन पूल (! नहीं उत्पादन उपयोग के लिए) 27, 2014 पाज़ 22:56:22 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator

या जब मैं org.hibernate.connection.C3P0ConnectionProvider गुण में इंगित करने के लिए करने की कोशिश की:

जानकारी: HHH000130: स्पष्ट instantiating कनेक्शन पी rovider: org.hibernate.connection.C3P0ConnectionProvider प्रारंभिक SessionFactory निर्माण failed.org.hibernate.service.spi.ServiceException: करने में असमर्थ सेवा के लिए अनुरोध बनाने [org.hibernate.engine.jdbc.connections.spi.ConnectionProvider] अपवाद थ्रेड "मुख्य" java.lang.ExceptionInInitializerError com.example.util.HibernateUtil। (HibernateUtil.java:27) com.example.App.run (App.java:31) com.example.App पर .main (App.java:25)
कारण: org.hibernate.service.spi.ServiceException: में असमर्थ अनुरोधित सेवा [org.hibernate.engine.jdbc.connections.spi।ConnectionProvider]

at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:261) 

    at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:225) 

    at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:206) 

    at org.hibernate.engine.jdbc.internal.JdbcServicesImpl.buildJdbcConnectionAccess(JdbcServicesImpl.java:260) 

    at org.hibernate.engine.jdbc.internal.JdbcServicesImpl.configure(JdbcServicesImpl.java:94) 

    at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.configureService(StandardServiceRegistryImpl.java:111) 

    at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:234) 

    at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:206) 

    at org.hibernate.cfg.Configuration.buildTypeRegistrations(Configuration.java:1885) 

    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1843) 

    at com.example.util.HibernateUtil.<clinit>(HibernateUtil.java:24) 

    ... 2 more                                                    Caused by: org.hibernate.HibernateException: Could not instantiate 

कनेक्शन प्रदाता [org.hibernate.connection.C3P0ConnectionProvider]

at org.hibernate.engine.jdbc.connections.internal.ConnectionProviderInitiator.instantiateExplicitConnectionProvider(ConnectionProviderInitiator.java:197) 

    at org.hibernate.engine.jdbc.connections.internal.ConnectionProviderInitiator.initiateService(ConnectionProviderInitiator.java:120) 
    at org.hibernate.engine.jdbc.connections.internal.ConnectionProviderInitiator.initiateService(ConnectionProviderInitiator.java:55) 
    at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.initiateService(StandardServiceRegistryImpl.java:105) 
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:251) 
    ... 12 more Caused by: org.hibernate.boot.registry.selector.spi.StrategySelectionException: 

असमर्थ हल करने नाम [org.hibernate.connection.C3P0ConnectionProvider] रणनीति के रूप में [org.hibernate.engine .jdbc.connections.spi.ConnectionProvider] org.hibernate.boot.registry.selector.internal.StrategySelectorImpl.selectStrategyImplementor (StrategySelectorImpl.java:128) org.hibernate.engine.jdbc.connections.internal.ConnectionProviderInitiator पर .instantiateExplicitConnectionProvider (ConnectionProviderInitiator.java:194) ... 16 अधिक

लेकिन सब कुछ अच्छा है जब Maven द्वारा शुरू। दुर्भाग्य से मुझे सिंगल जार से काम करने की ज़रूरत है। कोई विचार क्यों org.hibernate.connection.C3P0ConnectionProvider छायांकित जार में नहीं पाया जा सकता है?

उत्तर

4

ठीक है, मैं सभी समस्याओं को ठीक करने में कामयाब रहे। यहाँ आत्मा है।

सबसे पहले, जैसे स्टीव वाल्डमैन ने सुझाव दिया था, सी 3 पी 0 वास्तव में प्रारंभ नहीं किया गया था, लेकिन हाइबरनेट 4.3 hibernate.connection.provider_class पैरामीटर में होना चाहिए: org.hibernate.c3p0.internal.C3P0ConnectionProviderdocumentation में आप पढ़ सकते हैं:

एक कनेक्शन प्रदाता जो C3P0 कनेक्शन पूल का उपयोग करता है। Hibernate डिफ़ॉल्ट रूप से इसका उपयोग करेगा यदि hibernate.c3p0। * गुण सेट हैं।

लेकिन मेरी राय में यह अपने आप से इस पैरामीटर डाल करने के लिए अच्छा है, और यदि आप c3p0 कॉन्फ़िग फ़ाइल, नहीं hibernate.c3p0.* गुण का उपयोग कर रहे यह आवश्यक है।


दूसरा समस्या धागा की शुरुआत में SessionFactory.openSession() बुला और बाद में हमेशा एक ही सत्र वस्तु का उपयोग करके सत्र प्राप्त किया गया था। मुझे लगता है कि डेटाबेस कनेक्शन टूटने के बाद पुराने और टूटे कनेक्शन का उपयोग करने वाले पुराने सत्र का उपयोग करके पूल में नया बनाया गया था। कनेक्शन संचार को पकड़ने के बाद या SessionFactory.getCurrentSession() का उपयोग करके प्रत्येक संचार की शुरुआत में SessionFactory.openSession() तक नए सत्र प्राप्त हो रहे थे। मैंने दूसरे विकल्प का उपयोग करने का निर्णय लिया है (इस मामले में मेरा आवेदन बाहरी सिग्नल के लिए इंतजार कर रहा है, कभी-कभी घंटों के लिए, इसलिए मैं प्रत्येक सिग्नल के बाद वर्तमान सत्र प्राप्त कर रहा हूं)।


मेरे अंतिम विन्यास:

hibernate.cfg।xml:

<?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> 
    <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> 
    <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> 
    <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/MyBase?zeroDateTimeBehavior=convertToNull&amp;autoReconnect=true</property> 
    <property name="hibernate.connection.username">user</property> 
    <property name="hibernate.connection.password">pass</property> 
    <property name="hibernate.connection.provider_class">org.hibernate.c3p0.internal.C3P0ConnectionProvider</property> 

    <property name="hibernate.current_session_context_class">thread</property> 

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

    <property name="hibernate.cache.use_second_level_cache">true</property> 
    <property name="hibernate.cache.use_query_cache">true</property> 
    <property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property> 
    </session-factory> 
</hibernate-configuration> 

c3p0-config.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<c3p0-config> 
    <default-config> 
    <property name="initialPoolSize">5</property> 
    <property name="minPoolSize">5</property> 
    <property name="maxPoolSize">10</property> 
    <property name="checkoutTimeout">3000</property> 
    <property name="maxStatementsPerConnection">30</property> 

    <property name="preferredTestQuery">SELECT 1 FROM DUAL</property> 
    <property name="testConnectionOnCheckin">true</property> 
    <property name="testConnectionOnCheckout">false</property> 
    <property name="idleConnectionTestPeriod">300</property> <!-- 5 minutes --> 
    </default-config> 
</c3p0-config> 
इस c3p0 विन्यास के साथ

:

  • हर 5 यह परीक्षण किया जाएगा कनेक्शन पर किसी भी प्रश्न प्रदर्शन नहीं कर के कार्यवृत्त, तो यह डीबी द्वारा कभी भी अमान्य नहीं किया जाएगा (मानक कॉन्फ़िगरेशन में MySQL निष्क्रियता के 8 घंटे बाद कनेक्शन को अमान्य करता है),
  • यदि डीबी को पुनरारंभ किया जाएगा या कनेक्शन (वाई) वाई मैन्युअल रूप से मारे जायेंगे हमारे पास दो विकल्प होंगे: ए) अधिकतम 5 मिनट कनेक्शन के बाद, पुनः स्थापित किया जाएगा, बी) यदि स्वचालित कनेक्शन से पहले क्वेरी करने की कोशिश करता है HibernateException फेंक दिया जाएगा, तो कनेक्शन फिर से स्थापित किया जाएगा और अगली क्वेरी सफल होगी।

वैकल्पिक रूप से testConnectionOnCheckout अपवादों को रोकने के लिए सही पर सेट किया जा सकता है, लेकिन यह कारण प्रदर्शन मुसीबतों (documentation देखें) होगा।

0

testConnectionOncheckout को अपने c3p0-config में सही करने की कोशिश करें।

0

क्या आप वाकई c3p0 वास्तव में प्रारंभ किए गए हैं, और यह कि आपके पास कॉन्फ़िगरेशन की अपेक्षा है?

आपके लॉग में, INFO स्तर पर, आपको पूल प्रारंभिकरण पर अपने c3p0 डेटासोर्स की कॉन्फ़िगरेशन का डंप देखना चाहिए। सत्यापित करें कि यह वहां है, और यह वह कॉन्फ़िगरेशन है जिसे आप उम्मीद करते हैं।

अगर यह वहाँ नहीं है, अपने hibernate.cfg.xml में निम्न पंक्ति जोड़कर पर विचार करें:

<property name="hibernate.connection.provider_class" value="org.hibernate.connection.C3P0ConnectionProvider" /> 
+0

आप सही हैं, c3p0 प्रारंभ नहीं किया गया था जब मैं कंसोल से अपने वसा जार निष्पादित कर रहा हूं - अद्यतन प्रश्न देखें। मुझे पता चला कि हाइबरनेट-सी 3 पी 0 पैकेज v4.3.6 में कोई org.hibernate.connection.C3P0ConnectionProvider क्लास नहीं है, लेकिन इसके बजाय org.hibernate.c3p0.internal.C3P0ConnectionProvider है। मैंने इसका इस्तेमाल किया और यह अच्छा लग रहा है, c3p0 प्रारंभ किया गया है, मैं केवल यह जांचने का इंतजार कर रहा हूं कि कनेक्शन जांच के साथ समस्या हल हो गई है या नहीं। – Radzikowski

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