Предотвращение постоянных соединений с базой данных из RStudio - PullRequest
1 голос
/ 01 мая 2020

У меня есть база данных Redshift, и я запускаю RStudio внутри Docker Образа, подтвержденного на ноутбуках Jupyter.

Я добавил драйверы ODB C и установил пакет odbc как часть команды для раскрутить экземпляр Docker.

Меня беспокоит то, что у меня слишком много открытых соединений с базой данных.

Меня беспокоит то, что у меня много долгоживущих соединений, потому что они могут заблокировать мои таблицы. Я просмотрел документы на предмет odb c и R PostgreSQL и не увидел ничего о тайм-ауте или способе очистки всех соединений.

Как я могу предотвратить слишком долгую жизнь соединения от RStudio до PostgreSQL?

1 Ответ

1 голос
/ 02 мая 2020

Я предпочел использовать пакет pool для управления соединениями. Мне не нужно было иметь большой «пул» соединений, чтобы воспользоваться одной из его возможностей: переподключение по таймауту.

Использование достаточно просто. Подобно большинству других DBI драйверов, вам не нужно library(pool), просто обратитесь к нему при открытии.

Если ваш исходный открытый вызов:

library(DBI)
con <- dbConnect(odbc::odbc(), driver = "ODBC Driver 17 for SQL Server",
                 server = "somehost,1433", uid = "someuser", pwd = "secret",
                 database = "umptysquat")

Тогда вместо используйте:

con <- pool::dbPool(odbc::odbc(), driver = "ODBC Driver 17 for SQL Server",
                    server = "somehost,1433", uid = "someuser", pwd = "secret",
                    database = "umptysquat", minSize = 1, maxSize = 5)

(замена значащих чисел на minSize и maxSize). Отсюда DBI::dbGetQuery(con, "select 1 as a") работает так, как будто это реально. Для меня одно из реальных преимуществ заключается в том, что когда соединение закрыто (по любой причине, включая тайм-аут и мой sh туннель не работает), соединение пула автоматически переподключается при следующем запросе.

Большинство функций работают как есть, хотя иногда (я не могу вспомнить или воспроизвести в данный момент) мне пришлось сделать library(pool);library(odbc) для некоторых функций DBI. Опять же, не могу вспомнить, это может быть что-то не связанное. Загрузка их, как правило, не является проблемой (я просто предпочитаю не прикреплять слишком много пакетов, если я могу избежать этого).

...