2013-01-22 8 views
20

Ich möchte Apache Commons DBCP verwenden, um Verbindungspooling in einer Java-Anwendung zu aktivieren (keine Container-bereitgestellten DataSource in diesem). In vielen Stellen des Web -einschließlich Apache site - die Nutzung der Bibliothek ist in diesem Snippet basiert:Verbindungspooling mit Apache DBCP

BasicDataSource ds = new BasicDataSource(); 
ds.setDriverClassName("oracle.jdbc.driver.OracleDriver"); 
ds.setUsername("scott"); 
ds.setPassword("tiger"); 
ds.setUrl(connectURI); 

Dann erhalten Sie Ihre DB-Verbindungen durch den getConnection() -Methode. Aber auf anderen Seiten -und Apache Site also - die Datasource-Instanz wird durch diese gemacht:

ConnectionFactory connectionFactory = new DriverManagerConnectionFactory(connectURI,null); 
PoolableConnectionFactory poolableConnectionFactory = new PoolableConnectionFactory(connectionFactory); 
ObjectPool objectPool = new GenericObjectPool(poolableConnectionFactory); 
PoolingDataSource dataSource = new PoolingDataSource(objectPool); 

Was ist der Unterschied zwischen ihnen? Ich verwende Verbindungspooling mit BasicDataSource, oder ich benötige eine Instanz PoolingDataSource, um mit Verbindungspooling zu arbeiten? Ist BasicDataSource threadsicher (kann ich es als Klassenattribut verwenden) oder muss ich den Zugriff synchronisieren?

Antwort

22

BasicDataSource ist alles für grundlegende Bedürfnisse. Es erstellt intern eine PoolableDataSource und einen ObjectPool.

PoolableDataSource implementiert die DataSource-Schnittstelle mit einem bereitgestellten ObjectPool. PoolingDataSource kümmert sich um Verbindungen und ObjectPool kümmert sich darum, dieses Objekt zu halten und zu zählen.

Ich würde die Verwendung von BasicDataSource empfehlen. Nur, wenn Sie wirklich etwas Besonderes brauchen, dann können Sie PoolingDatasource mit einer anderen Implementierung von ObjectPool verwenden, aber es wird sehr selten und spezifisch sein.

BasicDataSource ist Thread-sicher, aber Sie sollten darauf achten, geeignete Accessoren zu verwenden, anstatt direkt auf geschützte Felder zuzugreifen, um die Thread-Sicherheit zu gewährleisten.

+0

erstellt Was Sie tut bedeuten mit "geeigneten Accessoren"? Synchronisierte Blöcke? –

+0

BasicDataSource ist Thread-sicher, weil alle Variablen über synchronisiert gelesen/geschrieben werden. Also, ich glaube nicht, dass Sie Synchronisierungsblock verwenden müssen. Wenn Sie diese Klasse erweitern, sollten Sie nur darauf achten, geeignete Accessoren zu verwenden, anstatt direkt auf geschützte Felder zuzugreifen, um die Thread-Sicherheit zu gewährleisten, aber Sie müssen keine Synchronisationsblöcke verwenden. – ivi

23

Dies ist eher ein (großer) unterstützender Kommentar zu ibis Antwort oben, aber ich poste es als eine Antwort wegen der Notwendigkeit zum Hinzufügen von Snapshots.

BasicDataSource ist alles für grundlegende Bedürfnisse. Es erstellt intern eine PoolableDataSource und einen ObjectPool.

Ich wollte den Code in BasicDataSource betrachten, um diese Aussage zu untermauern (was sich als richtig herausstellt). Ich hoffe, die folgenden Schnappschüsse helfen zukünftigen Lesern.


Das geschieht folgendes, wenn das erste Mal, wenn einer eine basicDatasource.getConnection() tut. Das erste Mal, um die Datasource wird wie folgt erstellt:

enter image description here


  1. Dies ist die rohe connection.

  2. Dies ist der generische Objektpool ('connectionPool'), der in den verbleibenden Schritten verwendet wird. enter image description here

  3. Dies kombiniert die beiden oben genannten (connectionFactory + ein Object Pool), um eine PoolableConnectionFactory zu erstellen.
    enter image description here

    Bezeichnenderweise bei der Erstellung des PoolableConnectionFactory wird die Connection mit der connection wie so verbunden:
    enter image description here

  4. Schließlich wird ein PoolingDataSource aus der Connection
    enter image description here
Verwandte Themen