/ / RPostgreSQL कनेक्शन बंद नहीं कर सकता - आर, rpostgresql

RPostgreSQL कनेक्शन बंद नहीं कर सकता - आर, rpostgresql

मेरे पास एक चमकदार ऐप है जो डेटाबेस का उपयोग कर कनेक्ट करता है RPostgreSQL। ऐप के अंत में कनेक्शन बंद हो जाता है और ड्राइवर को अनलोड किया जाना चाहिए, लेकिन मुझे एक त्रुटि मिलती है, मुझे चेतावनी दी जाती है कि कनेक्शन बंद नहीं है।

कोड इस तरह कुछ दिखता है:

 # in the app.R file, but not in the server function:
drv <- dbDriver("PostgreSQL")
con <- dbConnect(drv, dbname = "database1",
host = "localhost", port = 5432,
user = "user", password = "pw")

# in the server function:
foo <- dbGetQuery(con, "SELECT * from table1")

# at the end of the server function to disconnect when the app is closed:
session$onSessionEnded(function(){
dbDisconnect(con)
dbUnloadDriver(drv)
})

हालांकि, मुझे त्रुटि संदेश मिलता है: Error in postgresqlCloseDriver(drv, ...): RS-DBI driver: (There are opened connections -- close them first) यह आदेश के साथ प्रदर्शित होता है dbUnloadDriver(drv).

जब मैं मैन्युअल रूप से खुले कनेक्शन की तलाश करता हूं dbListConnections() मुझे डेटाबेस में 16 खुले कनेक्शन के साथ एक सूची मिलती है। ध्यान दें, मैं केवल उपयोग करता हूं dbGetQuery कभी नहीँ dbSendQuery कनेक्शन बंद करने से बचने के लिए।

कोई विचार?

उत्तर:

उत्तर № 1 के लिए 10

इस तरह अपना कोड संरचना:

function()
{
con <- dbConnect("PostgreSQL") # + other params
on.exit(dbDisconnect(con))

dbGetQuery("SELECT * FROM wherever") # or whatever you want to do
}

का उपयोग करके on.exit, कनेक्शन बंद होने की गारंटी है, चाहे कोई त्रुटि हुई हो या नहीं।

यह भी देखें मैं .exit पर कब और कब उपयोग करूँ?


यदि आप चाहते हैं, तो आप ड्राइवर का उपयोग करके अनलोड कर सकते हैं:

on.exit(dbUnloadDriver(drv), add = TRUE)

मुझे संदेह है कि यह खराब प्रदर्शन प्रदान कर सकता हैहालांकि, चूंकि आप डेटाबेस से कनेक्ट होने पर हर बार ड्राइवर को अनलोड और पुनः लोड कर देंगे। अगर आप इसके बारे में चिंतित हैं तो इसे अपनी उपयोग शर्तों के तहत जांचें।


उत्तर № 2 के लिए 1

यदि आप भाग गए con <- dbConnect("PostgreSQL") एक से अधिक बार, आपके पास दो खुले कनेक्शन हैं, लेकिन con ओवरराइट किया गया था और अब केवल दूसरा संदर्भ देता है। त्वरित उपाय: सभी खुले PostgreSQL कनेक्शन बंद करें, कोई फर्क नहीं पड़ता कि उनका नाम:
lapply(dbListConnections(drv = dbDriver("PostgreSQL")), function(x) {dbDisconnect(conn = x)})
यह ड्राइवर dbDriver ("PostgreSQL") के साथ सभी खुले कनेक्शन की जांच करके प्राप्त सूची में फ़ंक्शन dbDisconnect () चलाता है।