Hat c3p0 Verbindungs-pooling sorgt für die max pool size?
Ich durchgemacht habe mehrere Frage, diese ist etwas verwandt, aber beantwortet nicht meine Frage.
Macht die c3p0 Verbindungs-pooling maxPoolSize
sorgt dafür, dass die Anzahl der verbindungen zu einem bestimmten Zeitpunkt nie diese Grenze überschreitet? Was ist, wenn die maxPoolSize=5
- und 10-Anwender-start der app-Nutzung genau in der gleichen Zeit?
Meine app. Konfigurationen
<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>
Du musst angemeldet sein, um einen Kommentar abzugeben.
ist es wichtig zu unterscheiden zwischen Datenquellen und Connection-pools.
maxPoolSize durchgesetzt von c3p0 auf eine pro pool basis. aber eine einzelne Datenquelle kann mehrere Connection-pools, wie es ist (und sein muss) eine deutliche pool für jeden Satz von Anmeldeinformationen für die Authentifizierung. wenn nur die Standard -
dataSource.getConnection()
Methode wird immer aufgerufen, dann maxPoolSize die maximale Anzahl der Verbindungen, die der pool erwirbt und verwaltet. Allerdings, wenn Verbindungen erworben werden, die mitdataSource.getConnection( user, password )
, dann die Datenquelle kann bis zu(maxPoolSize * num_distinct_users)
Verbindungen.beantworten Ihre spezifische Frage, wenn
maxPoolSize
5 und 10 clients Treffer ein c3p0 DataSource gleichzeitig nicht mehr als 5 von Ihnen bekommen-Verbindungen auf den ersten. die restlichen clientswait()
bis Verbindungen zurückgegeben werden (oderc3p0.checkoutTimeout
abgelaufen ist).einige Nachteile mit sich: c3p0 erzwingt
maxPoolSize
wie oben beschrieben. aber es gibt keine Garantie, dass, wenn auch nur ein einziges pro-auth-pool verwendet wird, werden Sie nicht gelegentlich mehr alsmaxPoolSize
Verbindungen ausgecheckt. zum Beispiel, c3p0 abläuft und zerstört die Verbindungen asynchron. soweit c3p0 betroffen ist, eine Verbindung Weg ist, sobald es gemacht wurde kann nicht von clients und markiert für die Zerstörung, nicht, wenn es tatsächlich zerstört worden. so ist es möglich, dass, wennmaxPoolSize
ist 5, Sie würde gelegentlich beobachten 6 offene Verbindungen an die Datenbank. 5 verbindungen aktiv sein möchte in den pool, während die 6. wird in der Warteschlange für die Zerstörung aber noch nicht vernichtet.ein weiterer Umstand, wo sehen Sie möglicherweise unerwartet viele Verbindungen offen ist, wenn Sie ändern Connection pool-Eigenschaften zur Laufzeit. in der Tat, die Konfiguration der inneren Verbindungs-pools ist unveränderlich. wenn Sie "ändern", eine pool-parameter zur Laufzeit, was eigentlich passiert ist, einen neuen pool gestartet wird mit der neuen Konfiguration, und das alte Schwimmbad ist in einen "wind-down" - Modus. Anschlüsse überprüft, aus dem alten pool live bleiben und gültig sind, aber wenn Sie eingecheckt sind, werden Sie zerstört. nur wenn alle alten-pool Verbindungen wurden wieder eingecheckt ist der pool wirklich tot.
also, wenn Sie einen pool mit
maxPoolSize
Verbindungen überprüft, und dann ändern Sie einen Konfigurations-parameter, die Sie vielleicht kurzzeitig sehen eine Spitze von bis zu(2 * maxPoolSize)
, wenn der neue pool ist ein hit mit viel Verkehr vor Verbindungen überprüft, aus dem alten pool zurückgegeben wurden. in der Praxis ist dies sehr selten ein Problem, wie dynamische Rekonfiguration ist nicht so Häufig, und die Verbindung der Kassen werden sollte und in der Regel sehr kurz, so dass die alten-pool-Verbindungen schnell wieder verschwinden. aber es kann passieren!ich hoffe, das hilft.
ps
acquireIncrement
ist der beste Satz, etwas größer als 1.acquireIncrement
1 bedeutet, dass keine Verbindungen sind zuvor abgerufener Voraus verlangen, so dass, wenn die Last zunimmt Faden wird direkt erleben Sie die Latenz der Verbindung Erwerb.getConnection()
), und ich habe insgesamt 10 hosts für meinen Dienst. Bedeutet dies, dass die maximale Anzahl der Verbindung zum DB-10*100? Ich sah, weit mehr als die Anzahl von verbindungen im Leerlauf (läuftSELECT 1
oderSHOW TRANSACTION ISOLATION LEVEL
) inpg_stat_activity
, ist das normal?maxPoolSize
von 100, Ihre Anwendung sollte in der Regel nicht mehr als 1000 verbindungen bei serverside. Es kann vorübergehend überschreiten, dass, wie die Verbindungen sindclose()
ed asynchron. Aber wenn es nicht dramatisch oder dauerhaft überschreiten, dass Sie etwas zu versuchen zu erklären.numHelperThreads
also asynchrone Verbindung close() in den threadpool ist weniger wahrscheinlich zu fallen hinter.