无法分配新连接:16 个连接已打开 RMySQL
Cannot allocate a new connection: 16 connections already opened RMySQL
我对 shiny 和 R 很陌生,但我正在尝试使用 shiny 连接到数据库以从那里获取数据。当我尝试在浏览器上连续访问我的 RShiny 作品时,我收到类似 Cannot allocate a new connection: 16 connections already opened
的错误。我怎样才能克服这个错误或 RShiny 一次只期望 16 个用户?我这里RStudio Shiny Error mysqlNewConnection maximum of 16 connections还有一个堆栈post,但是上面的解释不清楚URL。
也许每次在代码中发送查询时,您都会使用 obj <- dbConnect(...)
打开一个新的数据库连接。您可以简单地在您创建的对象上调用 dbDisconnect(obj)
以在每次执行查询后终止相应的连接。
您也可以使用此功能一次终止所有打开的连接:
library(RMySQL)
killDbConnections <- function () {
all_cons <- dbListConnections(MySQL())
print(all_cons)
for(con in all_cons)
+ dbDisconnect(con)
print(paste(length(all_cons), " connections killed."))
}
我建议在 shiny 之外写一个小函数来处理整个打开和关闭的事情:
library(RMySQL)
sqlQuery <- function (query) {
# creating DB connection object with RMysql package
DB <- dbConnect(MySQL(), user="youruser", password='yourpassword', dbname='yourdb', host='192.168.178.1')
# close db connection after function call exits
on.exit(dbDisconnect(DB))
# send Query to btain result set
rs <- dbSendQuery(DB, query)
# get elements from result sets and convert to dataframe
result <- fetch(rs, -1)
# return the dataframe
return(result)
}
希望对您有所帮助!
dbDisconnect() 在我的案例中不起作用。所以我从终端停止了 MySQL 服务器并再次开始使用
sudo 服务mysql停止
sudo 服务mysql 启动
然后我 运行 使用 dbDisconnect() 的代码现在对我有用了。
快速解决
如果您遇到此问题,您应该首先 运行 以下代码以交互方式断开与 MySQL 数据库的所有连接:
lapply(dbListConnections(MySQL()), dbDisconnect)
(请注意,如果您使用其他数据库管理系统,您可以将 MySQL() 替换为另一个 DBI 驱动程序)。
更快的解决方案
只需重新启动 R 会话:command/ctrl + shift + F10
在 RStudio
如何避免这个问题
你需要告诉 shiny 如何正确断开连接。该部分取决于用例。如果你每次开始闪亮时都开始一个连接,你可以在里面添加 server.ui
:
session$onSessionEnded(function(){
dbDisconnect(con)
}
con 是你的联系人。
如果每次 运行 查询时都启动连接,则必须在查询 运行.
后立即断开连接
您还应该看看 pool
包,它是 shiny 团队 suggested 用来管理连接的。
还有一个关于 Shiny Articles on database.
的非常有用的部分
我对 shiny 和 R 很陌生,但我正在尝试使用 shiny 连接到数据库以从那里获取数据。当我尝试在浏览器上连续访问我的 RShiny 作品时,我收到类似 Cannot allocate a new connection: 16 connections already opened
的错误。我怎样才能克服这个错误或 RShiny 一次只期望 16 个用户?我这里RStudio Shiny Error mysqlNewConnection maximum of 16 connections还有一个堆栈post,但是上面的解释不清楚URL。
也许每次在代码中发送查询时,您都会使用 obj <- dbConnect(...)
打开一个新的数据库连接。您可以简单地在您创建的对象上调用 dbDisconnect(obj)
以在每次执行查询后终止相应的连接。
您也可以使用此功能一次终止所有打开的连接:
library(RMySQL)
killDbConnections <- function () {
all_cons <- dbListConnections(MySQL())
print(all_cons)
for(con in all_cons)
+ dbDisconnect(con)
print(paste(length(all_cons), " connections killed."))
}
我建议在 shiny 之外写一个小函数来处理整个打开和关闭的事情:
library(RMySQL)
sqlQuery <- function (query) {
# creating DB connection object with RMysql package
DB <- dbConnect(MySQL(), user="youruser", password='yourpassword', dbname='yourdb', host='192.168.178.1')
# close db connection after function call exits
on.exit(dbDisconnect(DB))
# send Query to btain result set
rs <- dbSendQuery(DB, query)
# get elements from result sets and convert to dataframe
result <- fetch(rs, -1)
# return the dataframe
return(result)
}
希望对您有所帮助!
dbDisconnect() 在我的案例中不起作用。所以我从终端停止了 MySQL 服务器并再次开始使用
sudo 服务mysql停止
sudo 服务mysql 启动
然后我 运行 使用 dbDisconnect() 的代码现在对我有用了。
快速解决
如果您遇到此问题,您应该首先 运行 以下代码以交互方式断开与 MySQL 数据库的所有连接:
lapply(dbListConnections(MySQL()), dbDisconnect)
(请注意,如果您使用其他数据库管理系统,您可以将 MySQL() 替换为另一个 DBI 驱动程序)。
更快的解决方案
只需重新启动 R 会话:command/ctrl + shift + F10
在 RStudio
如何避免这个问题
你需要告诉 shiny 如何正确断开连接。该部分取决于用例。如果你每次开始闪亮时都开始一个连接,你可以在里面添加 server.ui
:
session$onSessionEnded(function(){
dbDisconnect(con)
}
con 是你的联系人。 如果每次 运行 查询时都启动连接,则必须在查询 运行.
后立即断开连接您还应该看看 pool
包,它是 shiny 团队 suggested 用来管理连接的。
还有一个关于 Shiny Articles on database.