java - डीबीसीपी का इस्तेमाल करते हुए टॉमकेट कॉन्फ़िगरेशन




mysql jdbc (2)

चूंकि डीबीसीपी आगामी कनेक्शन अनुरोधों के लिए खुला mysql कनेक्शन रखता है, वे पीड़ितों को MySQL सर्वर टाइमआउट तक गिरते हैं।

डीबीसीपी में कई सुविधाएं हैं जो मदद कर सकती हैं (टॉमकेट 5.5 आईआईआरसी से शुरू किया जा सकता है)।

validationQuery="SELECT 1"
testOnBorrow="true"

सत्यापन सुनिश्चित करता है कि कनेक्शन 'उधार' विधि को निष्पादित करने वाले एक वेबएप पर लौटने से पहले एक वैध कनेक्शन है। पाठ्यक्रम का ध्वज, इस सुविधा को सक्षम करता है।

यदि टाइमआउट (8 घंटे मेरा मानना ​​है) समाप्त हो गया है और कनेक्शन मर चुका है, तो एक नया कनेक्शन परीक्षण किया जाता है (यदि कोई नहीं है, इसे बनाया गया है) और वेबएप को प्रदान किया गया है।

अन्य संभावित दृष्टिकोण:

  1. एक प्रभावी अनुरोध का पता लगाने से पहले बेकार कनेक्शनों की जांच करने के लिए अपनी संसाधन सेटिंग में testWhileIdle="true" DBCP का उपयोग करें।

  2. अपने MySQL कनेक्शन को कठोर करने के लिए 'कनेक्शन autoReconnect/autoReconnectForPools=true ' का उपयोग करें (जैसे autoReconnect/autoReconnectForPools=true )

थोड़ी देर के लिए (कुछ घंटों तक) हम एक संचार एक्सपेशेशन (डीबीसीपी से) प्राप्त कर रहे हैं त्रुटि संदेश (अपवाद में) इस प्रश्न के अंत में है - लेकिन मैं किसी भी विन्यास फाइल में wait_timeout परिभाषित नहीं करता (हम कहाँ दिखना चाहिए? कहीं बिलाव / कोंट निर्देशिका से बाहर?)।

दूसरे, जैसा अपवाद द्वारा सुझाया गया है, जहां एक को "कनेक्टर / जे कनेक्शन प्रॉपर्टी 'autoReconnect = true'" डालता है? फ़ाइल Conf / context.xml में टॉमकेट सेट अप में संसाधन परिभाषा यहां दी गई है:

<Resource name="jdbc/TomcatResourceName" auth="Container" type="javax.sql.DataSource"
           maxActive="100" maxIdle="30" maxWait="10000"
           removeAbandoned="true" removeAbandonedTimeout="60" logAbandoned="true"
           username="xxxx" password="yyyy"
           driverClassName="com.mysql.jdbc.Driver"
           url="jdbc:mysql://127.0.0.1:3306/dbname?autoReconnect=true"/>

तीसरा, क्यों JVM को अपवाद को फेंकने के लिए कॉल करने के लिए कॉल (executeQuery) का इंतजार क्यों करता है? यदि कनेक्शन का समय समाप्त हो गया है, तो getConnection विधि को अपवाद फेंक देना चाहिए, क्या यह नहीं? यह स्रोत कोड का अनुभाग है जिसके बारे में मैं बात कर रहा हूं:

        try {
                conn = getConnection (true);
                stmt = conn.createStatement (ResultSet.TYPE_SCROLL_INSENSITIVE,
                                                ResultSet.CONCUR_READ_ONLY);
                rset = stmt.executeQuery (bQuery);
                while (rset.next()) {
                     ....

अंत में, यहां स्टैक ट्रेस की पहली कुछ पंक्तियाँ हैं ...

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: The last packet successfully received from the server was 84,160,724 milliseconds ago.  The last packet sent successfully to the server was 84,160,848 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.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:532)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:406)
at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1074)
at com.mysql.jdbc.MysqlIO.send(MysqlIO.java:3291)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1938)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2107)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2642)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2571)
at com.mysql.jdbc.StatementImpl.executeQuery(StatementImpl.java:1451)
at org.apache.tomcat.dbcp.dbcp.DelegatingStatement.executeQuery(DelegatingStatement.java:208)

ये हम में से कुछ कारण सोच रहे हैं "डीबीसीपी भूल जाते हैं, यह आईडीई कॉन्फ़िगरेशन और अंडर-हूड जादू पर निर्भर हो सकता है कि DriverManager.getConnection (...) अधिक विश्वसनीय हो सकता है"। उस पर कोई टिप्पणी? आपकी अंतर्दृष्टि के लिए धन्यवाद, - एमएस






apache-commons-dbcp