Пул соединений в Java


Пожалуйста, просмотрите этот пул подключений. Я проверил его и он работает, но мы можем улучшить его с дизайном или точки зрения производительности?

public class ConnectionPool {

    private static final int MAX_SIZE=10;
    private static final BlockingQueue<Connection> bq;

    static{
        bq= new ArrayBlockingQueue<Connection>(MAX_SIZE);
        for(int i=0;i<MAX_SIZE;i++)
        {
            try {
                bq.add(makeConnection());
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

        System.out.println("total size:" + bq.size());
    }

    public static Connection getConnection() throws InterruptedException
    {
        System.out.println("size before getting connection"+ bq.size());
        Connection con=bq.take();
        System.out.println("size after getting connection"+ bq.size());
        return (con);
    }

    public static boolean releaseConnection(Connection con) throws InterruptedException
    {
        System.out.println("size before releasing connection"+ bq.size());
        boolean bool =bq.add(con);
        System.out.println("size after releasing connection"+ bq.size());
        return (bool);
    }

    public static Connection makeConnection() throws SQLException {
        Connection conn = null;
        Properties connectionProps = new Properties();
        connectionProps.put("user", "root");
        connectionProps.put("password", "java33");
        try {
            Class.forName("com.mysql.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }  
        conn = DriverManager.getConnection("jdbc:" + "mysql" + "://"
                + "localhost" + ":" + "3306" + "/test", connectionProps);

        System.out.println("Connected to database");
        return conn;
    }
}


4164
7
задан 14 августа 2011 в 05:08 Источник Поделиться
Комментарии
3 ответа

В целом:


  • Вы уверены, что вы хотите сохранить статический количество подключений? Почему бы не оставить минимальный набор подключений и создать новые, когда это необходимо?

  • ConnectionPool не должны иметь статические поля, как signalpillar сказал.

  • Вы не проверьте если соединения истекло время ожидания после определенного периода ожидания

  • Регистраторы хорошие, - > вам не нужно обязательно снять всю полезную отладочную информацию, когда собираетесь производстве

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

Статический инициализатор:


  • Это разумно, чтобы перехватывать исключения в makeConnection - там, наверное, что-то не так, если любой из них не получится.

  • Вы не проверить, если там действительно есть 10 подключений в пуле после инициализации.

  • Что tt34 сказал.

Метод getconnection:


  • возвращение-это не метод, скобочки не нужны

  • вы действительно хотите бросить выдачей InterruptedException из своего ConnectionPool?

Способ releaseConnection:


  • Такой же, как метод getconnection

Способ makeConnection:


  • это может быть переименован как подключить или содержащие вредоносные элементы

  • Было бы лучше, что параметры подключения в параметрах вместо жесткого кодирования - вы, вероятно, просто проверял в тот момент, но все же

  • Вы не должны просто игнорировать ClassNotFoundException в классе.forName(...): программа будет выполнена снова на следующей инструкции. Повторно сгенерировать исключение или обернуть его в качестве исключения во время выполнения, если вы не хотите, чтобы показать ClassNotFoundException в сигнатуре метода

  • А не конкатенации нескольких строк, используйте строку.формат

6
ответ дан 15 августа 2011 в 09:08 Источник Поделиться

Зачем вам нужно загрузить драйвер каждый раз при вызове makeConnection()? Я предлагаю сделать это только один раз для загрузки класса.
Рассмотрим случай, когда makeConnection() будет бросать исключение каждый раз, когда вы называете его и БК будет пустым. Я предлагаю, чтобы бросить исключение в этом случае.

5
ответ дан 15 августа 2011 в 09:08 Источник Поделиться

Прежде всего, я хотел бы предложить вам взглянуть на эту библиотеку ГСБД

Что касается кода, который вы показали - это будет лучше, чтобы избежать использования статического состояния и поведения в этот класс. Способ контроля количества экземпляров этого класса могут быть распространены на клиентский код, используя различные подходы - инъекции, например. Так как данные соединения могут лучше изменить, чтобы инкапсулировать его в некоторый класс, как пунктом

class Destination(userName, password, host, port, dbName)

3
ответ дан 15 августа 2011 в 07:08 Источник Поделиться