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

时间:2013-08-31 21:13:00

标签: sql sql-server r shiny rjdbc

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

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

  1. 将连接存储在全局变量中,初始化一次,在代码中的任何位置使用它
  2. 为每个请求创建新连接
  3. 做一些更复杂的事情,例如预先填充一个开放连接池,并根据需要(重新)使用池中的连接。
  4. 我在一个有几十个客户端的闪亮应用程序中使用我的代码,如果我使用方法1,我担心会发生一些不好的事情。所以我使用方法2,使用代码为每个请求创建一个新连接下方。

    我可以看到这种方法的一些潜在缺点:性能,对数据库资源征税等等。但是,由于R是单线程的,即使在闪亮的使用场景中,我可能会过于谨慎吗?

    所以我的具体问题是:

    :一种。在整个闪亮的应用程序中,我可以通过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)
      }
    }
    

    P.S。相关:How to manage a database connection in an R Package

2 个答案:

答案 0 :(得分:1)

许多问题:

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

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

概要。 如果您的应用程序是一个简单的,而不是多线程的,而不是服否则,每次使用新连接或使用连接池时都要使用。

答案 1 :(得分:1)

每次建立连接时,考虑幕后发生的事情可能会有所帮助:

  • 必须建立TCP / IP连接(包括DNS查找和联系SQL Server浏览器以获取命名实例的正确端口号)
  • 用户需要通过身份验证并经过验证才能获得连接
  • 必须保留连接的服务器端资源(专用内存等)

因此,限制应用程序使用的连接数是有意义的。

如果您的应用程序按顺序执行所有事务,则应该打开一次连接并重复使用它。将连接池用于基于服务器的多用户应用程序。