2012-03-14 3 views
2

InformixデータベースにODBC接続を行いました。 dbの負荷テストを実行しているときに、〜12Kの挿入クエリの後に「パーサ・スタックに十分なスペースがない」というエラーが発生します。制御フローである。ODBC接続を使用してInformixデータベースを照会しながらパーサースタックがいっぱいになる

  1. のSQLConnect
  2. SQLAllocStmt
  3. たSQLSetStmtAttr
  4. のSQLBindParameter
  5. のSQLPrepare
  6. のSQLExecute
  7. てSQLFreeStmt
  8. 繰り返しステップ2~7

したがって、新しいクエリハンドルはクエリごとに割り当てられ、クエリはすべて同じ接続で実行されます。正確なエラーステートメントは次のとおりです。

37000:[Informix][Informix ODBC Driver]General error. Not enough space for parser stacks 

これは既知のエラーですか?私もメモリリークを見つけることができません。スタックのサイズを大きくすると、より多くの「挿入」クエリの後に同じ問題が発生する可能性があります。なにか提案を?

+1

お使いのバージョンのClient SDKを表示して、お使いのOSと環境について詳しく教えてください。 –

+2

この問題は、ヒープサイズが増えたとしても、遅かれ早かれ発生することがほぼ保証されています。問題のヒープがメインの 'malloc()'ヒープまたは同等のものであることはすぐには分かりません。 ODBCドライバ内の「パーサー」にローカライズされている可能性があります。それは、ドライバが文を解析しているように私に聞こえます。私はあなたがCSDKの最新バージョン(3.70.xC4が良いでしょう)にいることを確認し、そこに問題が発生した場合は、問題をIBMテクニカル・サポートに報告してください。 –

答えて

1

さまざまな〜12Kの異なる挿入文を使用してデータベースをロードしますか?

そうでなければ、すべてのAPI呼び出しを行う必要はありません。手順2〜8を繰り返す代わりに、同じINSERTステートメントの場合は、手順4,5,6を繰り返すことができます。この方法で、各表に対して1つのPreparedStatementが作成されます。挿入する行ごとにPreparedStatamentを作成しないでください。私はこのように動作するロードプログラムを変更すると、エラーが消えるかもしれないと思います。

また、私たちのClientSDKのバージョンを表示して、お使いのOSと環境について詳しく教えてください。

+0

問題は解決しました。何らかの形で "SQLFreeStmt"を使用しても、ステートメントハンドルに関連付けられたメモリが解放されませんでした。代わりに "SQLFreeHandle"を使用したとき、それはちょうど機能しました。ちょっと変わって、私はそれについて明確な説明がありません。 – magarwal

+0

@Jonathan Leffer - 本当です。問題はあなたが推測したものと同じです:)。 – magarwal

+0

ミハエル、その後私はこれをしました。 SQLPrepareStmtを使用するだけで、スピードを大幅に向上させることができました。そのため、私はパラメータ用のバッファのみを割り当て、それを将来の繰り返しで再利用します。 – magarwal

関連する問題