我想了解通过RJDBC(重新)使用与MS SQL数据库的SQL连接的最佳实践是什么。
我可以想象三种可能的情况:
- 将连接存储在全局变量中,初始化一次,在代码中的任何位置使用
- 为每个请求创建一个新连接
- 做一些更复杂的事情,例如预先填充一个开放连接池,并根据需要(重新)使用池中的连接
我在一个有几十个客户端的闪亮应用程序中使用我的代码,如果我使用方法1,我担心会发生一些不好的事情。所以我使用方法2,用下面的代码为每个请求创建一个新的连接。
我可以看到这种方法的一些潜在缺点:性能、耗费数据库资源等。但可能我太谨慎了,因为R是单线程的,即使在闪亮的使用场景中也是如此?
所以我的具体问题是:
A。我可以在整个闪亮的应用程序中通过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.相关:如何在R包中管理数据库连接
许多问题:
1) 重复使用连接比为每次使用建立新连接更快。根据您的代码,这将稍微加快您的应用程序。但是重用连接更为复杂。这就是为什么很多人使用连接池的原因。
2) 如果你的程序运行时间很短,你可以使用一个连接,例如在全局变量中。如果你的应用程序是一个服务器应用程序(长期运行),那么你需要维护你的连接,因为服务器可以关闭连接,如果他认为没有人使用它,因为连接上没有流量。这种情况可能发生在服务器应用程序的夜间。连接维护功能是连接池的一部分。
总结。如果您的应用程序是一个简单的、非多线程的、非服务器的应用程序,那么请重用您的单个连接。否则,请在每次创建新连接或使用连接池时使用。
每次建立连接时,考虑一下幕后会发生什么可能会有所帮助:
- 必须建立TCP/IP连接(包括DNS查找和联系SQL Server浏览器以获取命名实例的正确端口号)
- 用户需要经过身份验证和验证才能获得连接授权
- 必须保留连接的服务器端资源(专用内存等)
因此,限制应用程序使用的连接数量是有意义的。
如果你的应用程序按顺序执行所有事务,你应该打开一次连接并重用它。为基于服务器的多用户应用程序使用连接池。