- PR -

fracod3746

1
投稿者投稿内容
鷹ひろ
会議室デビュー日: 2007/06/21
投稿数: 7
投稿日時: 2007-06-21 12:08
現在下記環境で開発を行っております。

開発OS:Windows XP
開発ソフト:Visual Web Developer ASP.NET
データベース:SQL Server 2005
実行環境:Windows Server 2003(IIS6.0)

webページを表示して、ボタンをクリックするとデータベースにデータを追加する
ソフトを開発しております。

ボタンを押す度にDbConnectionをOPENするのではなく、ページが開いた時に1度だけ
DbConnectionをOPENする構想で開発しています。
下記のソースでデータベースへの書き込みは実現できたのですが、困っているのは、
DbConnection dbをCloseするタイミングを、どこにするかということです。

例えばユーザがウインドウの×ボタンを押して、ブラウザを終了させたり、エラーで
ブラウザが落ちた場合に、db.Close();を行わなかったらWebサーバ上のメモリの開放が
行われないように思われます(少なくとも私が調べた限り)。

Button1をClickした際の処理にDbConnection Open→SQL実行→DbConnection Closeとすれば
何の問題もないのですが、これだとボタンを押す度に、DbConnection Openされる
ので、1度で済むのであれば、ページを開いた時に1度だけDbConnection Openしたいなと
思っております。

ページを開いた時にDbConnection Openするという構想が無理で、ボタンを押したときに
DbConnection Openするしかないのでしょうか?

この件に関して、何かご存知の方がいらっしゃれば、何でも構いませんので、ご意見を
お願いします。

------------------------------------------------------------------------------
public class Databasesetsuzoku
{
public static ConnectionStringSettings setting;
public static DbProviderFactory factory;
public static DbConnection db;
//データベース接続メソッド
public static void DatabasesetsuzokuMethod()
{
setting = ConfigurationManager.ConnectionStrings["testConnectionString"];
factory = DbProviderFactories.GetFactory(setting.ProviderName);
db = factory.CreateConnection();
db.ConnectionString = setting.ConnectionString;
db.Open();
}
}

public partial class page03 : System.Web.UI.Page
{
//staticコンストラクタ
static page03() {
//データベース接続メソッド
Databasesetsuzoku.DatabasesetsuzokuMethod();
}

protected void Button1_Click(object sender, EventArgs e)
{
//新規登録
DbCommand comm = Databasesetsuzoku.factory.CreateCommand();
comm.Connection = Databasesetsuzoku.db;
comm.CommandText = insert文;
//SQL実行
comm.ExecuteReader(CommandBehavior.CloseConnection);
}
}
------------------------------------------------------------------------------
burton999
ぬし
会議室デビュー日: 2003/10/06
投稿数: 898
お住まい・勤務地: 東京
投稿日時: 2007-06-21 12:18
Webプロジェクトでのデータベースオープンについて - Insider.NET
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=38813&forum=7
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2007-06-21 13:10
引用:

ボタンを押す度にDbConnectionをOPENするのではなく、ページが開いた時に1度だけ
DbConnectionをOPENする構想で開発しています。



どうしてまた、そういう構想にたどり着いたのでしょうか?
多くのサンプルや教本類が、逐次の接続を示唆あるいは明示しているはずです。

引用:

ページを開いた時にDbConnection Openするという構想が無理で、ボタンを押したときに
DbConnection Openするしかないのでしょうか?



多くの場合それが妥当です。
DB 接続のコードが他のハンドラと重複するのを避けたいのであれば、

コード:
private DbConnection OpenConnection()
{
  return DB接続;
}



のようなヘルパ関数を作って

コード:
private void xxx_Click(省略)
{
  using (DbConnection conn = this.OpenConnection())
  {
    // DB操作

    conn.Close();
  }
}



のように使えばいいんじゃないでしょうか。
鷹ひろ
会議室デビュー日: 2007/06/21
投稿数: 7
投稿日時: 2007-06-21 13:36
burton999さん、渋木宏明(ひどり)さん、返信ありがとうございます。

> どうしてまた、そういう構想にたどり着いたのでしょうか?
> 多くのサンプルや教本類が、逐次の接続を示唆あるいは明示しているはずです。

burton999さんが示してくれたリンク先を見る限りでも、ボタンをクリックする度に
接続→データ追加→接続解除とするのが最も安全なようですね。
「ページを開いた時に接続」と構想したのは、何度も接続、解除を繰り返すのは
サーバ側に負荷がかかると思ったからでして、方法があるのであれば、接続は
一度きりにしたいと考えた次第であります。

コネクションプーリングは全く意識していなかったので、それも踏まえて、もう一度
考え直してみます。

ありがとうございました。


1

スキルアップ/キャリアアップ(JOB@IT)