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?
erstellt Was Sie tut bedeuten mit "geeigneten Accessoren"? Synchronisierte Blöcke? –
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