sql - 为每个请求创建到 MS SQL 数据库的新 RJDBC 连接是否存在性能/其他缺点?

标签 sql sql-server r shiny rjdbc

我想了解通过 RJDBC(重新)使用 SQL 连接到 MS SQL 数据库的最佳实践是什么。

我可以想象三种可能的情况:

  1. 将连接存储在全局变量中,初始化一次,在代码中的任何地方使用它
  2. 为每个请求创建一个新连接
  3. 做一些更复杂的事情,例如预填充打开连接池,并根据需要(重新)使用池中的连接。

我在一个有几十个客户端的 Shiny 应用程序中使用我的代码,我担心如果我使用方法 1 会发生一些不好的事情。所以我使用方法 2,使用代码为每个请求创建一个新连接下面。

我可以看到这种方法的一些潜在缺点:性能、数据库资源负担等。但也许我太谨慎了,因为 R 是单线程的,即使在 Shiny 的使用场景中也是如此?

所以我的具体问题是:

A.我可以在我的 Shiny 应用程序中通过 RJDBC 安全地使用与 MS SQL 数据库的单个连接吗?

B.上述场景 2 是否存在任何真正的缺点(内存泄漏、性能等)?

<小时/>
NewConnection <- function() {
  file = NULL
    # make it work on three different OSes - Linux, MacOS, Windows 
    for (path in c('/Users/victor/Documents/R/sqljdbc_3.0/enu/sqljdbc4.jar',
          '/home/oracle/sqljdbc_3.0/enu/sqljdbc4.jar',
          'C:/Projects/jdbc/sqljdbc_4.0/enu/sqljdbc4.jar')) {
      if (file.exists(path)) {
        file = path
          break
      }
    }
  if (is.null(file))
    return(NULL)
  else {
    drv <- JDBC("com.microsoft.sqlserver.jdbc.SQLServerDriver", file)
      passwd <- GetUserNamePassword()
      conn <- dbConnect(drv, "jdbc:sqlserver://sql.server.address.com", 
          passwd$username, passwd$password)
      return(conn)
  }
}
<小时/>

附注相关:How to manage a database connection in an R Package

最佳答案

很多问题:

1) 重用连接比每次使用建立新连接更快。根据您的代码,这会稍微加快您的应用程序的速度。但重用连接更为复杂。这就是很多人使用连接池的原因。

2) 如果您的程序运行时间较短,您可以使用一个连接,例如在全局变量中。如果您的应用程序是服务器应用程序(长时间运行),那么您需要维护连接,因为服务器可以关闭连接,如果他认为没有人使用它,因为连接上没有流量。这可能会在夜间在服务器应用程序上发生。连接维护功能是连接池的一部分。

摘要。 如果您的应用程序是简单的、不是多线程的、不是服务器应用程序,那么请重用您的单个连接。否则,每次创建新连接时都使用或使用连接池。

关于sql - 为每个请求创建到 MS SQL 数据库的新 RJDBC 连接是否存在性能/其他缺点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18552878/

相关文章:

sql - '..' 中的 'SELECT * FROM database..table' 是什么意思?

php - 您的SQL语法有误;检查相应的手册

mysql - 有没有办法像oracle中的rownum一样获取Mysql中的行号

sql - 如何删除 MySQL 数据库中的所有表?

sql - 获取 "zero"以获取无记录日期的计数

sql - SQL 中日期的模运算

sql-server - T-Sql 声明和设置

r - 从具有多个时区 R 的字符向量中提取时间

r - 如何给ctree(包方)的终端节点添加标签?

r - Extrafont和ggsave:字符最终在另一个字符之上