Параметры JDBC и пулов соединений - PullRequest
1 голос
/ 07 июля 2011

Я должен реализовать пул соединений вместе со стандартным DAO JDBC с базой данных SQLite.Каковы самые простые варианты реализации пула соединений, который будет повторно использовать соединения с базой данных, чтобы уменьшить нагрузку на веб-приложение?Вот что я кодировал:

package persistance;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class SQLite {

    Connection conn = null;
    Statement stat = null;

    public SQLite(String path) {
        String dbPath = path + "GTI525.db";
        System.out.println(dbPath);
        try {
            Class.forName("org.sqlite.JDBC");
            conn = DriverManager.getConnection("jdbc:sqlite:" + dbPath);
            stat = conn.createStatement();
        } catch (SQLException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    public ResultSet query(String sql) {
        ResultSet rs = null;
        try {
            rs = stat.executeQuery(sql);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return rs;
    }
}

Ответы [ 3 ]

2 голосов
/ 07 июля 2011

Как уже упоминалось, есть несколько готовых решений, которые вы можете рассмотреть.

Однако, если вы хотите максимально простую реализацию пользовательского пула, вы можете использовать круговой массив некоторого разумного размера, например 100. Затем просто заполните его объектами SQLite и поместите перед ним какой-нибудь арбитр, который раздает запросы к объектам в массиве. Что-то вроде:

public ResultSet runQuery(String sql) {
    SQLite connection = null;

    synchronized(this) {
        connection = connectionArray[currentIndex];
        currentIndex++;
        if (currentIndex >= connectionArray.length) {
            currentIndex = 0;
        }
    }

    return connection.query(sql);
}

На практике, однако, нет смысла выделять и открывать 100 соединений, пока приложению действительно не понадобится такое количество. Таким образом, вы, вероятно, захотите, как минимум, добавить метод isBusy() в свой класс SQLite и реализовать свой класс арбитра таким образом, чтобы он искал первый SQLite, который не является бюстом, и использовал его, выделение нового только тогда, когда все существующие экземпляры заняты (и только если в массиве еще есть место для нового).

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

2 голосов
/ 07 июля 2011

Не пишите свой собственный пул соединений с базой данных.Существует множество отличных готовых реализаций с открытым исходным кодом.

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

Вот несколько готовых реализаций:

0 голосов
/ 07 июля 2011

Использование прямого JDBC и создание собственного пула соединений больше не в моде!

Я настоятельно рекомендую посмотреть на реализацию ORM, например, Hibernate. Затем вы можете подключить к нему C3P0, который обеспечивает пул соединений.

Эти проблемы были решены и больше не являются интересными для решения. Написание собственного пула соединений будет трудно понять правильно и сложно проверить. Если у вас нет веских причин для написания своих собственных, я настоятельно рекомендую Hibernate и C3P0.

...