Łączenie połączeń z Apache DBCP

Chcę użyć Apache Commons DBCP , aby włączyć pooling połączeń w aplikacji Java (w tym przypadku nie ma źródła danych podanego w kontenerze). W wielu miejscach sieci-w tym Apache site- Użycie biblioteki opiera się na tym fragmencie:

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

Następnie otrzymujesz połączenia DB za pomocą metody getConnection (). Ale na innych stronach-i Apache również - instancja Datasource jest wykonana za pomocą 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 oni? Używam poolingu połączeń z BasicDataSource, Czy potrzebuję instancji PoolingDataSource do pracy z poolingiem połączeń? Czy BasicDataSource thread-safe (Czy Mogę używać go jako atrybutu klasy) Czy muszę zsynchronizować jego dostęp?

Author: Ashutosh Jindal, 2013-01-23

2 answers

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

PoolableDataSource implementuje interfejs DataSource używając dostarczonego obiektu. PoolingDataSource dbaj o połączenia i ObjectPool dbaj o trzymanie i liczenie tego obiektu.

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

BasicDataSource jest bezpieczne dla wątków, ale powinieneś zadbać o użycie odpowiednich accesorów, a nie uzyskiwanie dostępu do chronionych pól bezpośrednio w celu zapewnienia bezpieczeństwa wątków.

 22
Author: ivi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-17 17:06:32

Jest to bardziej (duży) komentarz wspierający do odpowiedzi ivi powyżej, ale zamieszczam go jako odpowiedź ze względu na potrzebę dodawania migawek.

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

Chciałem spojrzeć na kod w BasicDataSource, aby uzasadnić to stwierdzenie (które okazuje się prawdą). Mam nadzieję, że poniższe migawki pomogą przyszłym czytelnikom.


Następuje, gdy pierwszy raz robi basicDatasource.getConnection(). Pierwszy raz wokół źródła danych jest tworzony w następujący sposób:

Tutaj wpisz opis obrazka


  1. To jest raw connectionFactory.

  2. Jest to ogólna Pula obiektów ('connectionPool'), która jest używana w pozostałych krokach. Tutaj wpisz opis obrazka

  3. Łączy to powyższe dwa (connectionFactory + obiekt Pool) w celu utworzenia PoolableConnectionFactory.
    Tutaj wpisz opis obrazka

    znacząco, podczas tworzenia PoolableConnectionFactory, connectionPool jest połączony z connectionFactory tak:
    Tutaj wpisz opis obrazka

  4. PoolingDataSource jest tworzone z connectionPool
    Tutaj wpisz opis obrazka
 24
Author: Ashutosh Jindal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-02 12:45:47