2013-06-05 15 views
5

Ben this şekilde alakalıdır ama soruma cevap vermez, birkaç soruya geçtiniz.c3p0 bağlantı havuzu maksimum havuz boyutunu sağlıyor mu?

c3p0 bağlantı maxPoolSize havuzu mu belirli bir zamanda bağlantı sayısı hiç bu sınırı aşarsa sağlar? maxPoolSize=5 ve 10 kullanıcıları uygulamayı tam olarak aynı anda kullanmaya başlarsa ne olur?

uygulamam. yapılandırmaları

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> 
     <property name="driverClass"><value>${database.driverClassName}</value>/property> 
     <property name="jdbcUrl"><value>${database.url}</value></property> 
     <property name="user"><value>${database.username}</value></property> 
     <property name="password"><value>${database.password}</value></property> 
     <property name="initialPoolSize"><value>${database.initialPoolSize}</value>/property> 
     <property name="minPoolSize"><value>${database.minPoolSize}</value></property> 
     <property name="maxPoolSize"><value>${database.maxPoolSize}</value></property> 
     <property name="idleConnectionTestPeriod"><value>200</value></property> 
     <property name="acquireIncrement"><value>1</value></property> 
     <property name="maxStatements"><value>0</value></property> 
     <property name="numHelperThreads"><value>3</value></property> 
    </bean> 

    <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
     <property name="dataSource" ref="dataSource"/>    
    </bean> 

    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> 
     <property name="entityManagerFactory" ref="entityManagerFactory"/> 
     <property name="dataSource" ref="dataSource"/> 
    </bean> 

cevap

11

o DataSources ve Bağlantı havuzları arasında ayrım yapmak önemlidir.

maxPoolSize, havuz başına temelindeki c3p0 tarafından zorunlu kılınmıştır. ancak her bir kimlik doğrulama bilgisi kümesi için ayrı bir havuz olduğu (ve olması gerektiği gibi) tek bir DataSource birden çok Bağlantı havuzuna sahip olabilir. Yalnızca varsayılan dataSource.getConnection() yöntemi çağrılırsa, havuzun aldığı ve yönetdiği maksimum Bağlantı sayısı maxPoolSize olacaktır. Ancak, Bağlantılar dataSource.getConnection(user, password) kullanılarak edinilirse, DataSource en çok (maxPoolSize * num_distinct_users) Bağlantıları tutabilir.

Özel sorunuzu yanıtlamak için, maxPoolSize 5 ve 10 istemciler aynı anda bir C3p0 DataSource'a çarptıysa, bunlardan en fazla 5'i Bağlantılar'ı alır. Kalan istemciler, Bağlantılar döndürülünceye kadar wait() olacaktır (veya c3p0.checkoutTimeout'un süresi doldu).

bazı uyarılar: c3p0 yürütmelidir maxPoolSize yukarıda tarif edildiği gibi. Ancak, yalnızca bir tek başına havuz kullanılsa bile, bazen maxPoolSize Bağlantıların teslim edildiğinden daha fazlasını görmeyeceğinizi garanti etmiyoruz. Örneğin, c3p0, Bağlantıları zaman uyumsuz olarak sona erer ve yok eder. c3p0 ile ilgili olarak, Müşteriler için kullanılamaz hale getirildikten ve imha için işaretlendiğinde, gerçekte yok edildiğinde değil, bir Bağlantı, bir kez daha gider. Bu nedenle, maxPoolSize 5 ise, veritabanında zaman zaman 6 açık Bağlantı gözlemlemeniz mümkündür. Havuzda 5 bağlantı aktif olurken, 6. sırada yıkım sıraya girmiş ancak henüz yok edilmemiştir. çalışma zamanında Bağlantı havuzu özelliklerini değiştirmek eğer

beklenmedik birçok Bağlantıları açık görebilirsiniz başka durumdur. Gerçekte, iç Bağlantı havuzlarının konfigürasyonu değişmezdir. Çalışma zamanında bir havuz parametresini "değiştirdiğinizde, gerçekte olan şey yeni yapılandırma ile yeni bir havuz başlatılır ve eski havuz" rüzgâr "moduna geçirilir. Eski havuzdan kontrol edilen bağlantılar canlı ve geçerli kalır ancak kontrol edildiklerinde yok edilir. sadece tüm eski havuz Bağlantıları tekrar kontrol edildiğinde havuz gerçekten öldü.

varsa, yani maxPoolSize Connections bir havuz teslim ve sonra yeni havuz dışında teslim Connections önce trafik çok isabet varsa, geçici olarak, yukarı (2 * maxPoolSize) kadar bir artış görüyor olabilecek bir yapılandırma parametresi değiştirmek eski havuz döndü. Pratik olarak, bu çok nadiren bir sorundur, dinamik yeniden yapılandırma çok yaygın değildir ve Bağlantı kontrolleri olmalı ve genellikle çok kısadır, bu yüzden eski havuz Bağlantıları hızla kaybolur. ama olabilir!

ben bu yardımcı olur umarım.

ps acquireIncrement iyi 1 acquireIncrement hiçbir bağlantıları öncesinde talebin prefetched demektir 1. daha büyük bir şey ayarlanır, bu nedenle yük artar zaman bazı Konu doğrudan bağlantı edinimi gecikme yaşayacaksınız.

İlgili konular