を使用して2つの挿入または更新ステートメントを実行することは可能cfquery
ですか?
はいの場合、どのように?
いいえの場合、DB への接続を 1 つだけ開いて、Coldfusion で複数のクエリを実行する最良の方法は何ですか。
電話をかけるたびに、cfquery
新しい接続DBを開いていると思います
を使用して2つの挿入または更新ステートメントを実行することは可能cfquery
ですか?
はいの場合、どのように?
いいえの場合、DB への接続を 1 つだけ開いて、Coldfusion で複数のクエリを実行する最良の方法は何ですか。
電話をかけるたびに、cfquery
新しい接続DBを開いていると思います
cfquery を使用して 2 つの挿入または更新ステートメントを実行することは可能ですか?
ほとんどの場合、はい。ただし、複数のステートメントを実行できるかどうかは、データベースの種類とドライバー/接続の設定によって決まります。たとえば、MS SQL データソースを作成すると、デフォルトで IIRC 複数ステートメントが許可されます。一方、 MySQL ドライバーは多くの場合、デフォルトで複数のステートメントを無効にします。これは、SQL インジェクションを回避するのに役立ちます。その場合、接続設定で複数のステートメントを明示的に有効にする必要があります。そうしないと、複数のステートメントを使用できません。複数のステートメントをまったくサポートしないデータベース (通常は MS Access などのデスクトップ データベース) もあります。したがって、この質問に対する包括的な答えはないと思います。
2 つの挿入/更新ステートメントが関連している場合は、Sam が提案したように cftransaction を使用する必要があります。これにより、ステートメントが 1 つのユニットとして扱われることが保証されます。つまり、すべてが成功するか、すべて失敗します。したがって、部分的または矛盾したデータが残ることはありません。これを実現するために、トランザクション内の両方のクエリに対して単一の接続が使用されます。
cfquery を呼び出すたびに、新しい接続 DB を開いていると思います
サムが述べたように、それは設定と cftransaction を使用しているかどうかによって異なります。接続の維持 (CF アドミニストレーターのデータソース設定の下) を有効にすると、CF は開いている接続のプールを維持します。そのため、クエリを実行すると、CF は毎回新しい接続を開くのではなく、プールから開いている接続を取得するだけです。cftransaction を使用する場合、すべてのクエリに同じ接続を使用する必要があります。接続の維持が有効かどうかに関係なく。
データソース設定内で、接続を維持する設定で接続を開いたままにするかどうかを指定できます。
そもそも、ColdFusion 8 データソースは、SQL インジェクションの懸念から、一度に 1 つのクエリのみを実行するように設定されていると思います。これを変更するには、接続文字列を変更する必要があります。
最善の策は、Maintain Connections をオンにして、必要に応じて cftransaction を使用することです。
<cftransaction>
<cfquery name="ins" datasource="dsn">
insert into table1 values(<cfqueryparam value="#url.x#">)
</cfquery>
<cfquery name="ins" datasource="dsn">
insert into table2 values(<cfqueryparam value="#url.x#">)
</cfquery>
</cftransaction>
そして常に、ユーザーが送信する値には常に cfqueryparam を使用してください。
CF8 の mySQL ドライバーは、複数のステートメントを許可するようになりました。サムが言うように、使用できます多くのステートメントを一緒にグループ化したり、coldfusion アドミニストレーターで | データとサービス | データ ソース、 接続文字列フィールドにallowMultiQueries=trueを追加
試す CF サーバーはありませんが、IIRC で問題なく動作するはずです。
何かのようなもの:
<cfquery name="doubleInsert" datasource="dsn">
insert into table1 values(x,y,z)
insert into table1 values(a,b,c)
</cfquery>
より具体的な例が必要な場合は、より具体的な情報を提供する必要があります。
編集: @SamFarmer に感謝: 私が使用したよりも新しいバージョンの CF では、これが妨げられる可能性があります
Necro で申し訳ありません (このサイトは初めてです)。
使用しているDBについては言及していません。mySQL を使用する場合は、最大ヒープ サイズが許す限り多くのレコードを追加できます。
私は定期的に、デフォルトのヒープ サイズで一度に最大 4500 レコードを挿入します (ただし、これはデータの量によって異なります)。
INSERT INTO yourTable (x,y,z) VALUES ('a','b','c'),('d','e','f'),('g','h','i')
すべての DB がこの IMO を実行する必要があります。
HTH
CFTRANSACTIONを使用して、複数のクエリを1つのユニットにグループ化します。
CFQUERYを使用して実行され、タグとタグの間に配置されたクエリはすべて、単一のトランザクションとして扱われます。これらのクエリによって要求されたデータへの変更は、トランザクションブロック内のすべてのアクションが正常に実行されるまでデータベースにコミットされません。クエリでエラーが発生した場合、トランザクションブロック内の以前のクエリによって行われたすべての変更がロールバックされます。
ISOLATION属性を使用して、トランザクション中にデータベースエンジンがロックを実行する方法をさらに制御します。
詳細については、 http://www.adobe.com/livedocs/coldfusion/5.0/CFML_Reference/Tags103.htmをご覧ください。