貧乏人のORMとレガシーアプリケーション(.NET 2.0 Webアプリ、手書きのSQLクエリ)を実装しています。私は2つのデータクラスを持っています:Customer
とOrder
:
Public Class Customer
Public Property CustomerId As Integer
Public Property CustomerName As String
Public Property Orders As List(Of Order)
End Class
Public Class Order
Public Property OrderId As Integer
Public Property OrderItem As String
End Class
を使用して、SQL結果をクラスSqlDataReader
のインスタンスに手動でマップしています。Customer
Dim connection As New SqlConnection(connectionString)
Dim command As New SqlCommand(sql, connection)
Dim reader As SqlDataReader()
connection.Open()
reader = command.ExecuteReader()
Dim customer As New Customer()
While reader.Read
With customer
.CustomerId = reader("CustomerId")
.CustomerName = reader("CustomerName")
.Orders = getOrdersByCustomerId(reader("CustomerId")) ' get orders
End With
End While
connection.Close()
を設定するために、 :Customer.Orders
を返す関数を呼び出します。List(Of Order)
Private Function getOrdersByCustomerId(ByVal customerId As Integer) As List(Of Order)
Dim connection As New SqlConnection(connectionString)
Dim command As New SqlCommand(sql, connection)
Dim reader As SqlDataReader()
connection.Open()
reader = command.ExecuteReader()
Dim orders As New List(Of Order)
While reader.Read
Dim order As New Order
With order
.OrderId = reader("OrderId")
.OrderItem = reader("OrderItem")
End With
orders.Add(order)
End While
connection.Close()
Return orders
End Function
このメソッドのパフォーマンス、つまり複数のをプルする場合のパフォーマンスが心配ですCustomer
。プルするたびCustomer
に、データベースに再度アクセスして(別の接続を開き)、その特定の顧客の注文を取得する必要があります。私が誤解していなければ、開いている接続を大量に蓄積するのに多くのレコードは必要ありません。
私の質問は2つあります。
- 作成されている新しい接続の数と、接続プールまたはその他の.NETによって課せられた制限に遭遇するかどうかをどのように判断できますか?
- もっと良い方法はありますか?(以下のコメントを参照)
私が持っていた1つの考えはSQLConnection
、呼び出し元のクラスで作成されたオブジェクトをgetOrdersByCustomerId
関数に渡し、その関数に(明らかに?)すでに開いている接続を使用させることです。つまり、既存の方法よりも優れているかどうかを判断する方法がわからないため、テストしていません。考え?
バックグラウンド:
クライアントによる処理のためにJSONを返す検索Webサービスを作成しています。このサービスは、単一の検索パラメーターを受け取り、異なるテーブルで複数のルックアップを実行してから、カスタムJSONオブジェクトを返します。たとえば、ユーザーが名前のように見えるものを入力した場合、テーブルで上位n人の顧客Customers
のリストを検索し、テーブルでその名前の顧客がいる上位n件の注文を検索します。Orders