我已經通過使用這一說法RMySQL包連接到MySQL數據庫:如何檢查通過RMySql連接到MySql是否存在?
con<-dbConnect(drv=RMySQL::MySQL(max.con=1,fetch.default.rec=500),host="host",dbname="dbname",password="psswd",user="user"))
到目前爲止,沒有任何問題。當我檢查:
>class(con)
[1] "MySQLConnection"
attr(,"package")
[1] "RMySQL"
一個小時後,我用下面的語句:
dbGetQuery(conn=con,"show tables")
,我得到了一個錯誤:
Error in .local(dbObj, ...) :
internal error in RS_DBI_getConnection: corrupt connection handle
但是,如果我這個語句查詢:
dbListConnections(drv=RMySQL::MySQL())
它給出了:
[[1]]
<MySQLConnection:0,21>
當我嘗試:
dbDisconnect(conn=con)
我得到了同樣的錯誤:
Error in .local(dbObj, ...) :
internal error in RS_DBI_getConnection: corrupt connection handle
然後我刪除了連接對象:
rm(con)
當我試圖連接再次使用dbConnect(),我得到這個錯誤:
con<-dbConnect(drv=RMySQL::MySQL(max.con=1,fetch.default.rec=500),host="host",dbname="dbname",password="psswd",user="user"))
Error in .local(drv, ...): Cannot allocate a new connection: 1 connections already opened
我知道dbListConnections()調用在沒有連接到數據庫時返回一個空列表。但在這種情況下不會返回空列表。
是在損壞的連接處理不同狀態比斷開狀態連接的?
或
連接超時?
如果與數據庫的連接仍在工作,最好的方法是保持檢查狀態?
保持連接打開這麼久是非常非常嚴重的錯誤。您應該在完成使用後立即關閉連接。原因是任何事務,連接打開時獲取的鎖都會一直持續到關閉爲止,導致嚴重的性能下降。只需關閉連接並在必要時打開它*僅在需要時 –
換句話說,如果您在其他人使用的數據庫上這樣做,您會收到來自DBA的緊急電話 –
@PanagiotisKanavos好吧。謝謝你指出這個錯誤。所以我應該認爲這是我的一個執行錯誤,而不是包裹問題? – TUSHAr