我正在实现一个穷人的 ORM 一个遗留应用程序(.NET 2.0 Web 应用程序,手工编码的 SQL 查询)。我有两个数据类: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
我正在使用 aSqlDataReader
手动将 SQL 结果映射到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
,我调用了一个返回 a 的函数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
's. 对于每次Customer
拉取,我必须再次访问数据库(打开另一个连接),并获取该给定客户的订单。如果我没记错的话,积累大量打开的连接不需要很多记录。
我的问题有两个:
- 如何确定正在建立的新连接的数量以及是否会遇到任何连接池或其他此类 .NET 强加的限制?
- 有没有更好的办法?(见下面的评论)
我的一个想法是将SQLConnection
调用类中创建的对象传递给getOrdersByCustomerId
函数,并让该函数使用(显然?)已经打开的连接。我没有测试它,因为我不知道如何确定它是否比我现有的方法更好。想法?
背景:
我正在创建一个搜索 Web 服务,它返回 JSON 以供客户端处理。该服务采用单个搜索参数,对不同的表执行多次查找,然后返回自定义 JSON 对象。例如,如果用户输入一个看似名称的内容,我会在Customers
表中搜索前n 个客户的列表,并在Orders
表中搜索具有该名称的客户的前n 个订单。