15

petapoco を使用して DAL とリポジトリを作成する必要があります。難しいのは、接続をどのように管理しているかがわからないことです。

dapper を使用していた場合、接続プロセスがどのように流れるかは、私が制御しているためわかります。petapoco で DAL を作成する際のベスト プラクティスが何かわかりません。

 public class UserRepository
    {
        public IEnumerable<User> All()
        {
            var db = new PetaPoco.Database("Sqlite_Connection");//this line
            var s = db.Query<User>("SELECT * FROM Users");
            return s.ToList();
        }
    }

DALHelper クラスに静的プロパティとして配置したいvar db = new PetaPoco.Database("Sqlite_Connection");//this line のですが、スケーラビリティが心配です

4

2 に答える 2

12

同じリソースにアクセスする別のリクエストによって同じ接続が使用されるため、「このコマンドに関連付けられた開いているDataReaderがすでに存在します」などのエラーが発生する可能性があるため、静的なものを使用することはお勧めしません。

2つのオプション:

1.コントローラーの基本クラスで接続を作成します

public class BaseController : Controller 
{
  protected DatabaseWithMVCMiniProfiler _database;

  protected override void OnActionExecuting(ActionExecutingContext filterCon ) 
  {
    base.OnActionExecuting( filterCon );

    _database = new DatabaseWithMVCMiniProfiler( "MainConnectionString");

  }
}

2.リクエストごとに1つの接続を作成する静的メソッド

public static class DbHelper {
  public static Database CurrentDb() {
    if (HttpContext.Current.Items["CurrentDb"] == null) {
       var retval = new DatabaseWithMVCMiniProfiler("MainConnectionString");
       HttpContext.Current.Items["CurrentDb"] = retval;
       return retval;
    }
    return (Database)HttpContext.Current.Items["CurrentDb"];
  }
}
于 2012-04-03T14:32:02.330 に答える
3

初期化には静的プロパティで問題ありません。トランザクションを使用していない限り、ペタポコは毎回接続を開いたり閉じたりします。これは通常、接続プーリングによる問題ではありません。

これを Web アプリケーションで使用している場合は、リクエストごとに 1 つの PetaPoco データベースをインスタンス化する必要があります。

于 2011-08-14T01:17:07.900 に答える