- PR -

DataReaderとDataSetの性能比はなんと30倍

1
投稿者投稿内容
Access
ぬし
会議室デビュー日: 2002/04/08
投稿数: 829
投稿日時: 2005-05-08 07:40
ASP/ASP.NET関連の著者として活躍しているScott Mitchell 氏が著者のWebサイトで「ASP.NETのアプリケーションでなぜ私がDataSetを使わないか」という記事を掲載しています。

著者はこの記事で、DataReaderはDataSetの30倍も高速であると、実測値を示して説明しています。WebアプリケーションでDataSetを多用されている方、再検討してみてはどうでしょうか。

http://aspnet.4guysfromrolla.com/articles/050405-1.aspx
_________________
ASP.NET+Ajaxサンプル集 | JavaScript+Ajaxサンプル集
nodera
大ベテラン
会議室デビュー日: 2003/09/08
投稿数: 200
投稿日時: 2005-05-08 19:58
こんにちは。

英語がほとんど読めないのでソース見ただけですが、なんとなく場合によりけりというような感想です。「DataReaderがDataSetより高速である」というのは否定はしません。しかし小規模アプリケーションならまだしも、複数層構造(UI-Facade-Rule-DataAccess)で作るWebアプリケーションの場合、DataSetは各層でデータをやり取りするために有効な手段だと思います。
また、型なしのDataSetで計測してますが、型付きのDataSetだったらもう少し違うのかなとも思いました(自分も実際に計測したわけではないので判りませんが)。その辺りも記述されているのでしょうか?(英語がダメダメな自分が悲しい・・・)
Access
ぬし
会議室デビュー日: 2002/04/08
投稿数: 829
投稿日時: 2005-05-09 05:55
引用:

なんとなく場合によりけりというような感想です。「DataReaderがDataSetより高速である」というのは否定はしません。しかし小規模アプリケーションならまだしも、複数層構造(UI-Facade-Rule-DataAccess)で作るWebアプリケーションの場合、DataSetは各層でデータをやり取りするために有効な手段だと思います。


もちろん、著者はDataSetを否定しているわけではありません。たとえば、WindowsのアプリケーションなどはDataSetが向いているといっております。また、Webアプリケーションでも、DataGridに表示したレコードをレコード単位で更新するのではなく、[一括更新]ボタンをクリックしたときにバッチ更新するときなどは、DataSetが有効であるといっております。

3階層のWebアプリケーションを開発するときは、DataSetが向いているように指摘していますが、型指定のDataSet(DataTable)をBL(ビジネスロジック層)に渡すと、データベースのフィールド名をそのまま渡すことになります。この場合、データベースのフィールド名が変更されたとき、BLにも影響を与えます。

DataReaderを使用するときは、データベースのフィールドに対応した独自のクラスを作成してBLに渡すことになると思います。この場合、データベースのフィールドが変更されても、DAL(データアクセス層)の変更のみでBLには影響与えません。

例:(フィールド名変更前)
データベースのフィールド名→CustomerName
型指定のDataSet(DataTable)→CustomerName
DataReaderの結果を格納するクラス→CompanyName

例:(フィールド名変更後)
データベースのフィールド名→CustomerFullName
型指定のDataSet(DataTable)→CustomerFullName(新しい名前に変更されてしまう)
DataReaderの結果を格納するクラス→CompanyName (フィールド名は以前と同じ)

コード:

Public Class OrderDetailDAL
Public Shared Function GetOrderDetailsByProductID(ByVal productID As Integer) As List(Of OrderDetail)
Dim sql As String = "SELECT OrderID, UnitPrice, Quantity FROM [Order Details] WHERE ProductID = @ProductID"
Using myConnection As New SqlConnection(ConfigurationManager.ConnectionStrings("NWConnectionString").ConnectionString)
Dim myCommand As New SqlCommand(sql, myConnection)
myCommand.Parameters.Add(New SqlParameter("@ProductID", productID))
myConnection.Open()
Dim reader As SqlDataReader = myCommand.ExecuteReader(CommandBehavior.CloseConnection)
Dim results As New List(Of OrderDetail)()
While reader.Read()
Dim detail As New OrderDetail()
detail.OrderID = Convert.ToInt32(reader("OrderID"))
detail.ProductID = productID
detail.Quantity = Convert.ToInt32(reader("Quantity"))
detail.UnitPrice = Convert.ToDecimal(reader("UnitPrice"))
results.Add(detail)
End While
reader.Close()
myConnection.Close()
Return results
End Using
End Function
End Class





_________________
ASP.NETサンプル集(Web Matrix版)


[ メッセージ編集済み 編集者: Access 編集日時 2005-05-09 06:49 ]
1

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