MySQL, Grails 2 ऐप के लिए लंबे निष्क्रियता के दौरान पूल किए गए कनेक्शन को जीवित रखने के लिए सही तरीका(या उन्हें बाहर निकालें और ताजा प्राप्त करें)




connection-pooling connector-j (2)

एप्लिकेशन को पास होने से पहले कनेक्शन का परीक्षण करने के लिए चलाने के लिए क्वेरी निर्दिष्ट करने के लिए कनेक्शन पूल को कॉन्फ़िगर करना सबसे आसान है:

validationQuery="select 1 as dbcp_connection_test"
testOnBorrow=true

यह वही "कनेक्शन सत्यापन" क्वेरी अन्य घटनाओं पर चलाया जा सकता है। मुझे इनके लिए डिफ़ॉल्ट के बारे में निश्चित नहीं है:

testOnReturn=true
testWhileIdle=true

विन्यास सेटिंग्स भी हैं जो पूल में निष्क्रिय कनेक्शन की "आयु" को सीमित करती हैं, जो सर्वर अंत में निष्क्रिय कनेक्शन बंद होने पर उपयोगी हो सकती हैं।

minEvictableIdleTimeMillis
timeBetweenEvictionRunsMillis

http://commons.apache.org/dbcp/configuration.html

मेरे पास एक ग्रेल्स ऐप है जिसमें उच्च गतिविधि की झड़प होती है, लेकिन फिर अक्सर निष्क्रियता की अवधि होती है जो रात में कई घंटे तक चल सकती है। मैंने देखा है कि सुबह के पहले उपयोगकर्ताओं को निम्नलिखित प्रकार का अपवाद मिलता है, और मेरा मानना ​​है कि पूल में कनेक्शन के चलते कनेक्शन और MYSQL डेटाबेस उन्हें बंद कर रहा है।

मुझे Googling में विरोधाभासी जानकारी मिली है कि कनेक्टर / जे कनेक्शन प्रॉपर्टी 'autoReconnect = true' का उपयोग करना एक अच्छा विचार है (और कनेक्शन को फिर से बहाल करने के बावजूद क्लाइंट को अपवाद भी मिलेगा या नहीं), या सेट करना है या नहीं अन्य गुण जो निष्क्रिय कनेक्शन को समय-समय पर बेदखल या ताज़ा कर देंगे, उधार पर परीक्षण आदि। Grails नीचे डीबीसीपी का उपयोग करता है। मेरे पास वर्तमान में नीचे एक सरल कॉन्फ़िगरेशन है, और मैं यह सुनिश्चित करने के लिए एक उत्तर की तलाश कर रहा हूं कि लंबे निष्क्रिय निष्क्रिय अवधि के बाद पूल से बाहर निकाला गया कोई भी कनेक्शन मान्य है और बंद नहीं है।

dataSource {
        pooled = true
        dbCreate = "update"
        url = "jdbc:mysql://my.ip.address:3306/databasename"
        driverClassName = "com.mysql.jdbc.Driver"
        dialect = org.hibernate.dialect.MySQL5InnoDBDialect
        username = "****"
        password = "****"
        properties {
          //what should I add here?
          }
    }

अपवाद

    2012-06-20 08:40:55,150 [http-bio-8443-exec-1] ERROR transaction.JDBCTransaction  - JDBC begin failed
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: The last packet successfully received from the server was 64,129,968 milliseconds ago.  The last packet sent successfully to the server was 64,129,968 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 com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
    at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1116)
    at com.mysql.jdbc.MysqlIO.send(MysqlIO.java:3851)
    ...... Lots more .......
Caused by: java.sql.SQLException: Already closed.
    at org.apache.commons.dbcp.PoolableConnection.close(PoolableConnection.java:114)

मुझे नहीं पता कि डेटाबेस कनेक्शन को संभालने का यह सबसे अच्छा तरीका है, लेकिन मुझे वही समस्याएं थीं जैसे आप चाहते थे। मैंने बहुत कोशिश की और सी 3 पी 0 कनेक्शन पूल के साथ समाप्त हो गया।

C3p0 का उपयोग करके आप अपने ऐप को एक निश्चित समय के बाद डेटाबेस कनेक्शन रीफ्रेश करने के लिए मजबूर कर सकते हैं।

c3p0.jar को अपने lib फ़ोल्डर में रखें और अपनी कॉन्फ़िगरेशन को conf/spring/resources.groovy

मेरे resources.groovy groovy इस तरह दिखता है:

import com.mchange.v2.c3p0.ComboPooledDataSource
import org.codehaus.groovy.grails.commons.ConfigurationHolder as CH

beans = {
    /**
    * c3P0 pooled data source that forces renewal of DB connections of certain age
    * to prevent stale/closed DB connections and evicts excess idle connections
    * Still using the JDBC configuration settings from DataSource.groovy
    * to have easy environment specific setup available
    */
    dataSource(ComboPooledDataSource) { bean ->
        bean.destroyMethod = 'close'
        //use grails' datasource configuration for connection user, password, driver and JDBC url
        user = CH.config.dataSource.username
        password = CH.config.dataSource.password
        driverClass = CH.config.dataSource.driverClassName
        jdbcUrl = CH.config.dataSource.url
        //force connections to renew after 4 hours
        maxConnectionAge = 4 * 60 * 60
        //get rid too many of idle connections after 30 minutes
        maxIdleTimeExcessConnections = 30 * 60
    }
 }  




connector-j