首页 > 解决方案 > 如何设置 Npgsql 的超时值?

问题描述

我习惯于CommandTimeout=5设置超时,但它并不好。

这是我的代码:

Dim con As New NpgsqlConnection
        Dim cmd As New NpgsqlCommand
        Dim conStr As String
        Try
            Dim sql = "Select * from dat_extract_text a join dat_replace_text b on a.tm_id=b.tm_id 
join dat_base_text_dt c on c.tm_id=a.tm_id
join dat_base_text_dt_font d on d.tm_id=c.tm_id
limit 250000"
            conStr = "Server=192.168.1.10;Port=5434;UserId=testuser;Password=1234;Database=testdb;CommandTimeout=5;"
            con.ConnectionString = conStr
            con.Open()

            cmd.Connection = con
            cmd.CommandText = sql

            Dim st = DateTime.Now
            Dim rs = cmd.ExecuteNonQuery
            Dim et = DateTime.Now
            Dim t = (et - st).TotalSeconds           
        Catch ex As Exception
        End Try

我的查询时间约为 40 秒,但不会发生超时。

如何设置 Npgsql 的超时值?

标签: vb.netpostgresqlnpgsql

解决方案


让我们稍微整理一下您的代码。

连接和命令需要关闭和处理。Using...End Using 块会为您解决这个问题。

您可以将连接字符串直接传递给构造函数。同样,命令文本和连接可以传递给命令的构造函数。

如果您想计时,请使用 .net 中的 Stopwatch 类。

Select 语句不是 NonQuery。它将返回一个结果集。使用 DataTable 将允许您使用数据。

一个空的 Catch 没有任何帮助,因为它只会吞下错误,而您不知道出了什么问题。

Private Sub OPCode()
    Dim sql = "Select * from dat_extract_text a join dat_replace_text b on a.tm_id=b.tm_id 
                join dat_base_text_dt c on c.tm_id=a.tm_id
                join dat_base_text_dt_font d on d.tm_id=c.tm_id
                limit 250000"
    Dim dt As New DataTable
    Using con As New NpgsqlConnection("Server=192.168.1.10;Port=5434;UserId=testuser;Password=1234;Database=testdb;"),
        cmd As New NpgsqlCommand(sql, con)
        'cmd.CommandTimeout = 5
        con.Open()
        dt.Load(cmd.ExecuteReader)
    End Using
End Sub

以这种方式测试代码,没有超时并且没有 Try...Catch 以查看错误发生在哪一行以及错误是什么。


推荐阅读