2010-08-30 49 views
13

Apache Commons DBCP kullanıyorum. DBCP'nin iç davranışını - aktif ve boşta bağlantıların sayısını izlemek için bir görev vardır.DBCP'de oturum açma

Ben DBCP hiç böyle bir günlüğü yoksun olduğunu öğrendim. Evet, bağlantı havuzdan ödünç verildiğinde BasicDataSource durumunu veren kodu yazmak mümkündür. Ancak, bağlantı döndürüldüğünde veya kapatıldığında BasicDataSource'ın durumunu izlemek için bir yol yoktur, çünkü bağlantı nesnesi havuz hakkında hiçbir şey bilmiyordur.

Herhangi bir fikrin var mı?

cevap

7

Ben hususların quandry çözüm olabilir düşünüyorum. Check out:

Temel olarak, DBCP içindeki bazı yöntemlerin yürütülmesi "üzerine mandalı" olacak bir yönünü ya da iki yazabilir. gibi

şey:

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; 
    } 

} 

sadece küçük bir örnek. Unsurlar gerçekten güçlü ve istediğiniz şeyi yapmak için bir sürü farklı yol var. Kod, Bahar kullanıp kullanmadığınıza ve tam olarak ne yapmak istediğinize bağlıdır.

P.S. Yukarıdaki kodu test etmedim.

1

DBCP en BasicDataSource aslında havuzları ve havuz fabrikaları oluşturmak birkaç korumalı yöntemleri içerir. Davranışı değiştirmek için alt sınıfı kullanabilir ve bu yöntemleri geçersiz kılabilirsiniz; Örneğin, havuz fabrikasını ele geçirmek veya kendi ile değiştirmek. Bu havuza sahip olduğunuzda, kodunuzdaki havuz durumuna geçebilirsiniz.

0

AOP havuzdan bağlantı kullanımını izlemek için gitmek yoludur. Ancak, çok ileri değil.

  1. ek bağlantı kimliği, iplik kimliği ve 'kapat' eylemi
  2. Intercept log yakın() yöntemini bir sarar ConnectionWrapper sınıfını (Dekoratör desen) Bağlantısı Oluşturma ve geçersiz kılabilir: Aşağıdaki yapmak gerekir Veri kaynağının getConnection() yöntemi. Bu yöntemde
  3. , bu kurulum ile kendi ConnectionWrapper örneği

, aynı yöntemde

  • 'açık' bağlantı id, iplik kimliği ve eylemi log orijinal bağlantı süslemeleri ve dönüş, her iki izleyebilirsiniz & borcunun havuza/havuzuna geri dönüşü. DataSource nesnesi erişiminiz varsa

  • 0

    , sen BasicDataSource için döküm ve getNumActive() ve getNumIdle() yöntemleri kullanarak maxIdle ve maxActive bağlantıları alabilirsiniz.

    +0

    connection.close() çağrıldığında, DataSource nesnesine erişim yoktur. Bu yüzden onu BasicDataSource'a dökmek ve maxIdle ve maxActive almak mümkün değildir. – kachanov

    +0

    Connection.close(), Veri Kaynağına eşit değildir.close() –

    +0

    Referansı Veritabanına bir yerde tutabilirsiniz ve bunu yapmalısınız. –