F# - FSharp.Data.SqlClient - Как указать время ожидания для обновления
Я использую FSharp.Data.SqlClient
введите провайдеров для доступа к базе данных сервера SQL. Итак, я настроил типы в 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 МБ), и поэтому у меня плохое предчувствие, что t.Update(conn)
может произойти случайный тайм-аут, особенно из-за почти 100% загрузки процессора (ядро вычислительной системы рассчитано на потребление всех ресурсов обработки, хотя и с низким приоритетом). Зависший над t.Update
не показывает способ указать время ожидания, и любое время ожидания на уровне соединения связано, ну, в общем, с соединением, а не с транзакцией вставки ☹.
Итак, вопрос заключается в том, как указать время ожидания для Update
сделка.
Большое спасибо!
20190116 обновление - пока t.Update(conn)
выше на моем компьютере работает без таймаутов при вставке строк данных размером 95 МБ при 100% ниже обычной загрузки некоторых других выполняющихся там вещей. Я еще не измерил фактическое время для таких транзакций. Если я это сделаю, то я буду обновлять это.
1 ответ
Вы не можете указать время ожидания для Update
метод предоставленного DataTable
потому что текущая реализация провайдера типов не обеспечивает такую функцию.
Однако, как отмечается в документации, у вас может быть несколько вариантов настройки поведения по умолчанию.
Кроме того, поскольку ваш вариант использования напоминает вставку одной строки в таблицу, я бы придерживался реализации с помощью SqlCommandProvider
используя его конструктор commandTimeOut
необязательный параметр для установки желаемого значения времени ожидания timespan
, как во фрагменте ниже:
type AddRow = SqlCommandProvider<"path to the parameterized INSERT statement", designTimeConnection>
..............................
(new AddRow(runTimeConnection, commandTimeOut=timespan)).Execute(...arg=value...) |> ignore