Łą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?
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.
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:
To jest raw connectionFactory.
Jest to ogólna Pula obiektów ('connectionPool'), która jest używana w pozostałych krokach.
Łączy to powyższe dwa (connectionFactory + obiekt Pool) w celu utworzenia PoolableConnectionFactory.
znacząco, podczas tworzenia PoolableConnectionFactory, connectionPool jest połączony z connectionFactory tak:
PoolingDataSource jest tworzone z connectionPool
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