2010-08-30 10 views
13

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

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

कोई विचार?

उत्तर

7

मुझे लगता है कि पहलुओं को आपके विवाद का समाधान हो सकता है। देखें:

मूल रूप से, आप एक या दो पहलू यह है कि DBCP अंदर कुछ तरीकों के निष्पादन "पर कड़ी" होगा लिख ​​सकते हैं।

कुछ की तरह:

import org.aspectj.lang.annotation.Aspect; 
import org.aspectj.lang.annotation.Around; 
import org.aspectj.lang.ProceedingJoinPoint; 

@Aspect 
public class AroundExample { 

    @Around("org.apache.commons.dbcp.PoolingDataSource.getConnection()") 
    public Object doBasicPStuff(ProceedingJoinPoint pjp) throws Throwable { 
    // write code to do what you want 
    final PoolingDataSource ds = (PoolingDataSource) pjp.getThis(); 
    // log whatever you want 

    // let it finish 
    Object retVal = pjp.proceed(); 
    // stop stopwatch 
    return retVal; 
    } 

} 

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

पीएस मैंने उपर्युक्त कोड का परीक्षण नहीं किया है।

1

डीबीसीपी के बेसिकडाटासोर्स में कुछ संरक्षित विधियां हैं जो वास्तव में पूल और पूल कारखानों का निर्माण करती हैं। आप इसे बदल सकते हैं और व्यवहार को बदलने के लिए उन तरीकों को ओवरराइड कर सकते हैं; उदाहरण के लिए, पूल फैक्ट्री को पकड़ने या इसे अपने आप से बदलने के लिए। एक बार आपके पास पूल हो जाने के बाद, आप अपने कोड के भीतर पूल स्टेटस पर जा सकते हैं।

0

एओपी पूल से कनेक्शन उपयोग को ट्रैक करने का तरीका है। हालांकि, यह बहुत सीधे आगे नहीं है।

  1. एक ConnectionWrapper वर्ग (डेकोरेटर पैटर्न) कनेक्शन है कि लपेटता बनाएँ और करीब() विधि अतिरिक्त कनेक्शन आईडी, धागा आईडी और कार्रवाई 'बंद'
  2. अवरोधन लॉग इन करने ओवरराइड: आप निम्न कार्य करने होंगे डेटा स्रोत के getConnection() विधि।
  3. कि विधि में, कनेक्शन आईडी, धागा आईडी और कार्रवाई 'खुला'
  4. एक ही विधि में प्रवेश करें, तो मूल कनेक्शन सजाने और वापस लौटकर अपना ConnectionWrapper उदाहरण

इस स्थापना के साथ, आप दोनों ट्रैक कर सकते हैं उधार & पूल से/कनेक्शन से कनेक्शन की वापसी।

0

आप डेटा स्रोत वस्तु की पहुंच है, तो आप इसे BasicDataSource लिए डाली और getNumActive() और getNumIdle() तरीकों का उपयोग कर maxIdle और maxActive कनेक्शन प्राप्त कर सकते हैं।

+0

जहां कनेक्शन.क्लोस() कहा जाता है वहां डेटासोर्स ऑब्जेक्ट तक कोई पहुंच नहीं है। इसलिए इसे BasicDataSource पर डालना संभव नहीं है और maxIdle और maxActive प्राप्त करना संभव नहीं है। – kachanov

+0

कनेक्शन.क्लोज़() डेटास्रोत के बराबर नहीं है।बंद करें() –

+0

आप कहीं भी डेटास्रोत का संदर्भ रख सकते हैं और ऐसा करना चाहिए। –

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