我使用FSharp.Data.SqlClient
类型的提供程序来访问SQL Server数据库。因此,我在F#中设置类型如下:
type ClmDB = SqlProgrammabilityProvider<ClmSqlProviderName, ConfigFile = AppConfigFile>
type ResultDataTable = ClmDB.dbo.Tables.ResultData
type ResultDataTableRow = ResultDataTable.Row
然后我用类似的东西:
let saveResultData (r : ResultData) (conn : SqlConnection) =
let t = new ResultDataTable()
let newRow = r.addRow t
t.Update(conn) |> ignore
newRow.resultDataId
其中ResultData
是某种类型,它“知道”如何将自身转换为ResultDataTable
(ResultDataTableRow
)行。扩展名为r.addRow t
。
一切都很好,除了我要插入的行可能很大(25-30 MB)之外,因此,我感到t.Update(conn)
可能会随机超时,特别是由于接近100处理器负载百分比(计算系统核心旨在消耗所有处理资源,尽管优先级较低)。将鼠标悬停在t.Update
上不会显示任何指定超时的方法,并且连接级别的任何超时都与连接有关,而不与插入事务☹有关。
因此,问题是如何为Update
事务指定超时。
非常感谢!
20190116 更新-到目前为止,t.Update(conn)
在我的计算机上没有超时,同时以比某些 other 的正常负载低100%的速度插入95MB数据行东西在那里跑。我尚未测量此类交易的实际时间。如果这样做,我将对其进行更新。
答案 0 :(得分:1)
您不能为提供的Update
的{{1}}方法指定超时,因为当前的类型提供程序实现未提供此类功能。
不过,正如the documentation所指出的那样,您可能没有太多自定义默认行为的选项。
此外,由于您的用例类似于在表中插入一行,因此我会坚持使用DataTable
的实现,使用其构造函数的SqlCommandProvider
可选参数来设置所需的超时值commandTimeOut
,如下面的代码段所示:
timespan