我有一个连接到MySQL数据库的闪亮服务器.到目前为止工作正常的页面现在给我这个错误:
Error in mysqlNewConnection(drv, ...) : RS-DBI driver:
(cannot allocate a new connection -- maximum of 16 connections already opened)
Run Code Online (Sandbox Code Playgroud)
这让我想知道如何在交互式网页中处理开放的mysql连接.
首先,dbConnect(MySQL(),...)声明应该在shinyServer方法之前 还是在内部?
如果我dbDisconnect(dbcon)在末尾添加一个server.R,那么我Error: expired MysqLConnection从页面中收到错误,并且不显示任何数据.
我在内部或shinyServer方法之前尝试过这个:
on.exit(dbDisconnect(dbcon), add=TRUE)
Run Code Online (Sandbox Code Playgroud)
要么
on.exit(dbDisconnect(dbcon))
Run Code Online (Sandbox Code Playgroud)
因此,如果我将连接保持打开状态,页面本身的代码仅适用于我,我认为这会导致上面的最大连接错误.
如何在Shiny中处理这些情况?
您可以在global.R文件中设置连接,也可以在https://groups.google.com/forum/#!topic/shiny-discuss/0VjQc2a6z3MshinyServer的示例中设置连接:
library(RMySQL)
getConnection <- function(group) {
if (!exists('.connection', where=.GlobalEnv)) {
.connection <<- dbConnect(MySQL(), group=group)
} else if (class(try(dbGetQuery(.connection, "SELECT 1"))) == "try-error") {
dbDisconnect(.connection)
.connection <<- dbConnect(MySQL(), group=group)
}
return(.connection)
}
Run Code Online (Sandbox Code Playgroud)
这定义了一个检查全局环境中的连接的函数.如果找不到,则会创建一个.如果找到一个但无法连接,则重新启动连接.没有给出明确的断开连接,所以我猜连接最终只允许超时.