Как отобразить и закрыть все активные соединения RJDBC

Мы приняли RJDBC из-за его скорости (по сравнению с RODBC), но столкнулись с проблемами, связанными с закрытием всех открытых подключений к базе данных в конце сеанса R. Проблема в том, что после пакетного запуска у нас часто будет более 100 спящих подключений к БД. Наш сервер работает под управлением Microsoft SQL Server 2012.

Строка подключения имеет вид:

drv <<- JDBC("com.microsoft.sqlserver.jdbc.SQLServerDriver", "C:/Program Files/Microsoft JDBC Driver 4.2 for SQL Server/sqljdbc_4.2/enu/sqljdbc42.jar")
dbConnection <<- dbConnect(drv, "jdbc:sqlserver://s26",integratedSecurity=TRUE,databaseName="XXXXXX")

Как мне убедиться, что все активные соединения с БД закрыты? Я нашел функцию, которая, кажется, работала бы, если бы я использовал RMySQL, но я нет. В документации RJDBC также не описывается какой-либо метод вывода соединений, чтобы их можно было закрыть. Кроме того, общая функция DBI dbListConnections() не работает для RJDBC.

Ваша помощь приветствуется!


person Abe    schedule 02.11.2015    source источник
comment
Я не использовал RJDBC (не уверен, почему вы думаете, что это быстрее). В моем случае я использую RODBC с SQL Server 2012 on.exit(odbcClose('‹connection›')) и это в значительной степени гарантирует отсутствие открытые соединения   -  person Bg1850    schedule 03.11.2015
comment
Хммм, спасибо за ваш вклад @Bg1850. Я подумываю о переходе на RODBC, так как функциональность RJDBC dbWriteTable и отсутствие отслеживания соединений доставляют немало хлопот. Я слышал, что RODBC медленный, а RJDBC быстрый, и наоборот, но на данный момент функциональность важнее скорости. Некоторые новые пакеты, такие как rsqlserver, еще быстрее, но гораздо менее надежны. Спасибо еще раз. Если я перейду на RODBC, я воспользуюсь вашим вкладом. Спасибо!   -  person Abe    schedule 03.11.2015


Ответы (1)


Я знаю, что этот вопрос был задан некоторое время назад, но я отвечаю на него, если кто-то еще искал решение.

Вы можете проверить, является ли глобальная переменная соединением JDBC, и закрыть ее.
Вот пример того, что я делаю:

    var <- as.list(.GlobalEnv)
    var_names <- names(var)

    for (i in seq_along(var_names)){
        if (class(var[[var_names[i]]]) == "JDBCConnection"){
            dbDisconnect(var[[var_names[i]]])
        }
    }
person creativename    schedule 04.08.2017