2017-01-25 11 views
1

私はこの文を使用して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) 

私は同じエラーを取得:私は接続しようとしたとき

rm(con) 

Error in .local(dbObj, ...) : 
internal error in RS_DBI_getConnection: corrupt connection handle 

は、それから私は、接続オブジェクトを削除再度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()呼び出しが空のリストを返すことがわかりました。しかし、この場合、空のリストは返されません。

破損し、接続が切断された状態より接続の異なる状態を扱いますか?

または

接続がタイムアウトしましたか。

DBへの接続がまだ機能しているかどうかを確認する最良の方法はありますか?

+2

接続を長時間開いておくことは、非常に重大なエラーです。接続が終了するとすぐに接続を閉じる必要があります。その理由は、接続が開いている間に取得されたロックは、閉じられるまで持続するため、パフォーマンスが著しく低下するためです。接続を閉じてそれを開く* ONLY *必要な場合 –

+1

別の言い方をすれば、他の人が使用しているデータベースでこれを行うと、DBA –

+0

@ PanagiotisKanavos Okayから緊急の電話がかかります。間違いを指摘していただきありがとうございます。だから私はパッケージの問題ではなく、自分の実装ミスであると仮定すべきですか? – TUSHAr

答えて

1

rm(con)ではなく、dbDisconnect(con)で接続を閉じて、内部接続ハンドルを解放し、新しい接続を許可する必要があります。後者は、接続オブジェクトへの「ポインタ」を削除するだけです(したがって、conでこのオブジェクトにアクセスすることはできません)。ただし、物理的にはまだgarbage collectionまで存在します。

dbIsValid(con)で接続が有効かどうかを確認したり、dbGetQuery(con, "SELECT 1")を使用して簡単に確認できます。私は前者があなたのシステムの切断を検出したかどうか知りたいと思うでしょう。このトピックの周りにはdiscussion on GitHubがあります。

+0

質問で述べたようにdbDisconnect(con)を試しました。しかし、破損した接続ハンドルエラーがスローされます。私は明日dbIsValid(con)コマンドをチェックするつもりです。 – TUSHAr

+0

私は接続を確立し、DBを照会した後、dbDisconnect(con)を使用して接続を切断しました。その後、dbIsValid(con)を実行すると、破損した接続ハンドルエラーが発生します。しかし、同じ(con)を使用して、私は再びdbに再接続することができます。 @Panagiotis Kanavosの提案に従って自分のコードを変更したため、これをチェックしていませんでした – TUSHAr

+1

'プール'を調べましたか?ここには[Github repo](https://github.com/rstudio/pool)と[イントロ記事](http://shiny.rstudio.com/articles/pool-basics.html)があります。これは、あなたのための定型作業のすべてを行います...それは基本的に、あなたが@Panagiotis Kanavosが "長い間接続を開いたままにすることは非常に重大なエラーです。それはまったく同じセマンティクスを与えながら、あなたがそれをしていないことを確認します。 –

関連する問題