I have a database connection with a query similar to as follows in a couple separate files in a project:
SqlTypes.fs
module SqlTypes
open FSharp.Data.TypeProviders
type DBType = SqlDataConnection<ConnectionStrings.DbConnStr>
let getDb() = DBType.GetDataContext() //will this cause a memory leak when called from outside here?
Utilities.fs
module Utilities
open System
open SqlTypes
open System.Linq
///Returns an IQueryable of Orders whose OrderStatus is less than 5 (Not yet released)
let private getOrdersNotYetReleased () =
let orders = query {
for order in getDb().Orders do //memleak here?
where(order.Status < 5)
sortBy (order.CreatedDateUtc)
select order
}
//return
orders
Q: Is it necessary to use a use
clause (like in the following) to prevent a memory leak?
///Returns an IQueryable of Orders whose OrderStatus is less than 5 (Not yet released)
let private getOrdersNotYetReleased () =
use db = DBType.GetDataContext() //is this safer? Does it matter if this `use` is here?
let orders = query {
for order in db.Orders do
where(order.Status < 5)
sortBy (order.CreatedDateUtc)
select order
}
//return
orders
Or, will Dispose()
be called on the Db object when the computation block exits?