Совместное использование пула соединений JDBC между многими классами - PullRequest
2 голосов
/ 22 ноября 2011

У меня есть некоторый пул c3p0, инкапсулированный в класс, который я использую для выполнения операторов SQL.Он инициализируется следующим образом:

public PooledQueryExecutor(String url, Properties connectionProperties) throws DALException {
        try {
            dataSource = new ComboPooledDataSource();
            dataSource.setDriverClass(DRIVER);
            dataSource.setJdbcUrl(url);
            dataSource.setProperties(connectionProperties);
        } catch (PropertyVetoException ve) {
            throw new DALException(ve);
        }
    }

Затем - внутри того же класса - я использую несколько методов для выполнения основных задач:

public CachedRowSet executeSelect(String sql) throws DALException {
        // Get a connection, execute the SQL, return the rows that match, return resources to the pool
    }

«Вопрос»:У меня есть много разных классов, которые представляют сетевые пакеты, которые я получаю.Большинству классов нужен этот PooledQueryExecutor для выполнения операций с БД, но некоторые этого не делают.Я передаю этот PooledQueryExecutor конструктору классов, которым он нужен (80% пакетов), или я делаю PooledQueryExecutor одиночным?Или, может быть, «что-то еще»?Я также хотел использовать ThreadLocal, чтобы не загрязнять мой конструктор, но я не думаю, что это хорошая идея, не так ли?б.

Спасибо за потраченное время!

Ответы [ 4 ]

2 голосов
/ 22 ноября 2011

Полагаю, вы не используете какую-либо DI-инфраструктуру?Если это так, у вас есть несколько вариантов:

  • Передать PooledQueryExecutor в конструктор классов, которые в этом нуждаются.На самом деле это довольно неплохо с точки зрения тестирования и архитектуры.

  • позволяет классам, требующим JDBC, реализовать некоторый простой интерфейс, например:


interface PooledQueryExecutorAware {

    void setPooledQueryExecutor(PooledQueryExecutor executor);

}

Затем вы можете даже перебирать классы и выяснять, кто их реализует, и вставлять PooledQueryExecutor, где это необходимо.Вы - один шаг к открытию DI здесь, но не берите в голову.

  • Подобный подход будет состоять в создании абстрактного базового класса, который потребовал бы PooledQueryExecutorAware в качестве зависимости и имел бы поле protected finalудерживая его.

  • Пусть каждый класс будет в курсе PooledQueryExecutor - не рекомендуется, ненужная связь

  • Singleton является худшее, что вы можете сделать , непроверяемый и сложный для понимания код.Пожалуйста, не надо.

  • ThreadLocal?Забудь об этом.Помните, ясность - король.

Также взгляните на JdbcTemplate .Это часть Spring, но вы можете включить только spring-jdbc.jar и немного других, не используя всю инфраструктуру.Я думаю, что он может легко заменить ваш PooledQueryExecutor.

0 голосов
/ 22 ноября 2011

Объекты представляют сетевые пакеты? Для чего они используют соединения с базой данных? Это не подходит мне. Хотели бы вы немного подробнее рассказать о том, что вы пытаетесь сделать, и какова ваша архитектура?

Я бы склонялся к тому, чтобы сделать объекты пакетов чистой моделью домена - они могут хранить состояние и определять поведение, но не должны заниматься поиском в базах данных. Доступ к базе данных должен быть другой частью системы, уровня хранения или подсистемы. Вполне возможно, что ключевыми объектами в этом будут синглтоны (или, по крайней мере, у них будет один экземпляр, даже если они не формальные синглтоны), и они вполне могут содержать один глобальный пул соединений.

Тогда возникает вопрос о том, как объекты домена взаимодействуют с подсистемой хранения. На самом деле, у вас, по сути, тот же вопрос, который вы задавали о пулах соединений. В общем, я смотрю на какие-то объекты-контроллеры, управляющие работой программы; они могут общаться с объектами разных слоев и знакомить их друг с другом.

Конкретные примеры облегчили бы это объяснение. Расскажите нам о своих пакетах!

0 голосов
/ 22 ноября 2011

Обычный способ сделать, например, на веб-серверах, это запустить и запустить JNDI, а затем получить источники данных из JNDI.Реализации Simpel JDNI существуют для автономных приложений.

Если вы используете внедрение зависимостей в своей программе, то это отличный пример ресурса, который можно внедрять при необходимости.Это означает либо Java EE 6, либо приложение с поддержкой Spring / Guice / CDI.

0 голосов
/ 22 ноября 2011

Я предпочитаю устанавливать (впрыскивать) бассейн.Таким образом, вы можете решить, должны ли некоторые экземпляры получать разные пулы, вы можете обернуть пул (ы) с помощью регистраторов и т. Д., И станет понятно, каким классам нужен пул.

Я также думаю, что это облегчает тестирование кода.

...