Как уже упоминалось, есть несколько готовых решений, которые вы можете рассмотреть.
Однако, если вы хотите максимально простую реализацию пользовательского пула, вы можете использовать круговой массив некоторого разумного размера, например 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()
, так как большинство баз данных закрывают соединение, если оно слишком долго простаивает. И это то, что должно произойти хотя бы изредка в вашем пуле соединений.