有没有办法重新建立 SQL Server 与 R Shiny 应用程序的连接?

问题描述 投票:0回答:1

我的 Shiny 应用程序不断与服务器断开连接。 这是我在 Posit 日志中不断收到的错误:

警告:评估错误:nanodbc/nanodbc.cpp:4616: 00000: [Microsoft][ODBC Driver 17 for SQL Server]通信链接失败

我的应用程序在本地运行得很好。我真的不认为这是由我的应用程序中的代码引起的,但如果是的话,那么什么样的编码错误会导致这种情况?

每当我在 Posit Connect 中更新我的应用程序时,也可以提供完整的上下文,它实际上可以运行大约一个小时,然后崩溃。作为临时解决方案,我不断在代码中添加注释并推送到 GitLab 作为更新应用程序的借口。

r sql-server shiny
1个回答
0
投票

这是我多年来在项目中使用的方法,用于重新建立 SQL Server 与 R Shiny 应用程序的全局连接。

database_encoding =  "latin1"  

shinyServer(function(input, output, session) {
    react <- reactiveValues(
       my_connection_db1= 0
    )

  connexion_connection_react <-   function () {
    
    # react$my_connection_db1 is set at the beginning to 0 instead of NULL, 
    # for next connections, to know if there was an initial connection

    if (!is.null(react$my_connection_db1)) {
      
      
      tryCatch(
        {
          DBI::dbGetInfo(react$my_connection_db1)
        },
        error=function(e) {    
          print("Lost of connection my_connection_db1, try to reconnect (Errot)")
          react$my_connection_db1<- tryCatch(
                                       DBI::dbConnect(odbc::odbc(),
                                        .connection_string=my_connection_db1_odbc_string, 
                                         encoding = database_encoding
                                       )
                                       , error=function(e) { NULL}
                                    )
        },
        warning=function(w) {  
         print("Lost of my_connection_db1 (Warning)")
         # warning but in this case
        }
      )
      
    }
    return(react$my_connection_db1)
  }
...
}

在反应性组件中随处使用

Mydata <- reactive({
  DBI::dbGetQuery(
    connexion_connection_react(), 
    iconv(
      paste0("SELECT * FROM TOTO ... WHERE ..."
             "
      ),"UTF-8","latin1"
    )
  )
})

我最初的需求是在 2 个数据库(存档、实际)之间进行切换,具有类似的实现,但有 2 个连接。

© www.soinside.com 2019 - 2024. All rights reserved.