0

私の VB.NET プロジェクトのメモリ リークを 1 日かけて追跡した結果、その原因を FileMaker の ODBC ドライバのバグに突き止めました。

再現するには、接続できるデータベース (私は Server Advanced 11.0.3 でホストしていますが、ローカルでホストすることもできます) と、PC に登録/インストールされた ODBC ドライバー (バージョン 11.3 および 12.0 をテストしました) が必要です。 、および最新の 12.2)。

新しい VB.NET WinForms プロジェクトを開始し、フォームにボタンを追加して、このコードをボタンのクリック イベントに貼り付けます。

Using cn_FM As New Odbc.OdbcConnection("DRIVER={FileMaker ODBC};SERVER=192.168.1.xxx;UID=admin;PWD=admin;DATABASE=test;")
    cn_FM.Open()
End Using

このコードは FileMaker データベースへの接続を開くだけですが、Windows タスク マネージャーでメモリ使用量を分析すると、(作成したばかりのボタンを繰り返しクリックすることで)cn_FMハンドルが増加し続けるために適切に破棄されていないことが簡単にわかります。ガベージコレクションを強制しようとしましたが、これは何もしなかったので、ドライバー自体に問題があると思います。

ああ、同じ方法で SQL データベースへの接続をテストしましたが、ご想像のとおり、ハンドル リークはありませんでした...

誰でもこれが正しいことを確認できますか?

編集:接続を開いたり閉じたりするさまざまな方法を試し、実際にusingブロック内の何かをデータベースに照会しました。また、fp7ファイルをローカルでホストしようとしましたが、まだうまくいきません:(

4

2 に答える 2

1

FileMaker の ODBC ドライバはひどいものであり、彼らもそれを認めています。また、FM サーバーにヒットするクエリごとに、CPU が 100% 近くまで急増することもわかります。私は何年もそれについて彼らに不満を抱いてきました。

彼らの「解決策」は、外部 SQL ソースを導入することでしたが、それには別の方向に進む必要があります。VB データベースを FileMaker にバインドしてから、実際の FileMaker データと同じようにデータにアクセスできます。これにより、FM サーバーでスクリプトを作成して、VB データベースと同期する必要があるテーブルを同期することができます。

これは理想的ではありませんが、優れたパフォーマンスを実現するための最善の方法です。

于 2013-01-07T08:47:50.857 に答える
0

永続的な接続を確立することでこの問題を回避しました(一度宣言して開き、開いたままにします)。ただし、使用するたびに、まだ開いているかどうかを確認する必要があります。たとえば、次のようになります。

Public Sub CheckOpen(ByRef cn As Odbc.OdbcConnection)
    If cn.State <> System.Data.ConnectionState.Open Then
        cn.Close()
        cn.Open()
    End If
End Sub

複数の FM データベース ファイルがある場合は、ファイルごとに 1 つの接続が必要になる場合があります。

補足: FMSA で実行されている FileMaker の xdbc_listener.exe プロセスにもリークがあります。メモリ使用量が 2GB をわずかに下回ると、クラッシュするというパターンに気付きました。そのため、プロセスを定期的に再起動する必要がある場合があることに注意してください。

于 2013-01-08T02:35:22.467 に答える