2013-01-22 19 views
20

Chcę użyć Apache Commons DBCP, aby włączyć łączenie połączeń w aplikacji Java (w tym przypadku nie ma źródła danych dostarczanego z kontenerami). W wielu miejscach w internecie-w tym Apache site - z wykorzystaniem biblioteki opiera się w tym fragmencie:Pule połączeń z Apache DBCP

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

Zwracamy Ci połączenia DB dzięki metodzie getConnection(). Ale na innych stronach -I Apache Site also - instancja DataSource jest dokonywane za pośrednictwem tego:

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

Jaka jest różnica między nimi? Używam łączenia połączeń z BasicDataSource lub potrzebuję instancji PoolingDataSource do pracy z pulą połączeń? Czy BasicDataSource wątku bezpieczne (czy mogę używać go jako atrybut klasy) lub muszę zsynchronizować jego dostęp?

Odpowiedz

22

BasicDataSource to wszystko dla podstawowych potrzeb. Tworzy wewnętrznie PoolableDataSource i ObjectPool.

PoolableDataSource implementuje interfejs DataSource przy użyciu dostarczonego ObjectPool. PoolingDataSource przejmuje troskę o powiązania, a ObjectPool bierze pod uwagę zatrzymywanie i liczenie tego obiektu.

Polecam przy użyciu BasicDataSource. Tylko, jeśli naprawdę potrzebujesz czegoś wyjątkowego, możesz użyć PoolingDatasource z inną implementacją ObjectPool, ale będzie to bardzo rzadkie i specyficzne.

BasicDataSource jest bezpieczny dla wątków, ale należy zadbać o to, aby używać odpowiednich akcesorów zamiast uzyskiwać bezpośredni dostęp do chronionych pól, aby zapewnić bezpieczeństwo wątków.

+0

Co masz na myśli z "odpowiednimi akcesoriami"? Zsynchronizowane bloki? –

+0

BasicDataSource jest bezpieczny dla wątków, ponieważ wszystkie zmienne są odczytywane/zapisywane przez synchronizację. Nie sądzę, że musisz użyć bloku synchronizacji. Jeśli rozszerzasz tę klasę, powinieneś po prostu zadbać o używanie odpowiednich akcesorów, zamiast uzyskiwać bezpośredni dostęp do chronionych pól, aby zapewnić bezpieczeństwo wątków, ale nie musisz używać bloków synchronizacji. – ivi

23

To jest bardziej (duży) komentarz popierający powyższą odpowiedź Ivi, ale zamieszczam ją jako odpowiedź z powodu konieczności dodawania migawek.

BasicDataSource to wszystko dla podstawowych potrzeb. Tworzy wewnętrznie PoolableDataSource i ObjectPool.

Chciałem spojrzeć na kod w BasicDataSource, aby uzasadnić to oświadczenie (co okazało się prawdą). Mam nadzieję, że poniższe migawki pomogą przyszłym czytelnikom.


Poniższe czynności występują, gdy po raz pierwszy wykonano basicDatasource.getConnection(). Po raz pierwszy po DataSource jest tworzony w następujący sposób:

enter image description here


  1. Jest to surowy ConnectionFactory.

  2. To jest ogólna Pula obiektów ('connectionPool') używana w pozostałych krokach. enter image description here

  3. Spowoduje to połączenie powyższych dwóch elementów (connectionFactory + Pula obiektów) w celu utworzenia obiektu PoolableConnectionFactory.
    enter image description here

    Co istotne, podczas tworzenia PoolableConnectionFactory The pula połączeń jest powiązana z ConnectionFactory tak:
    enter image description here

  4. Wreszcie PoolingDataSource tworzony jest z pula połączeń
    enter image description here