背景:我正在将我的应用程序从npgsql v1移动到npgsql v2.0.9.运行我的应用程序几分钟后,我得到一个System.Exception:从池中获取连接时超时.
网络声称这是由于连接泄漏(打开数据库连接,但没有正确关闭它们).
所以
我正在尝试诊断npgsql中泄漏的postgres连接.
来自各种网络文学; 诊断泄漏连接的一种方法是在npgsql上设置日志记录,并在日志中查找泄漏的连接警告消息.问题是,我没有在任何地方的日志中看到此消息.
我还发现了监视npgsql连接的实用程序,但它不稳定并崩溃.
所以我手动检查代码.对于创建npgsql连接的每个场所,都有一个finally块处理它.对于打开datareader的每个场所,都使用CommandBehavior.CloseConnection(并且处理了datareader).
还有其他地方可以检查或者有人可以推荐一种寻找漏水池连接的方法吗?
代码很简单.
Tag.cs实体:
public partial class Tag
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public string Name { get; set; }
public string Description { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
HomeController.cs 类:
public async Task<IActionResult> Index()
{
tagRepository.Insert(new Tag
{
Name = "name",
Description = "description"
});
await UnitOfWork.SaveChangesAsync(); // calls dbContext.SaveChangesAsync()
return View();
}
Run Code Online (Sandbox Code Playgroud)
TagRepository.cs 类:
// Context it's a usual DBContext injected via Repository's constructor
public virtual void Insert(TEntity item)
=> Context.Entry(item).State = EntityState.Added;
Run Code Online (Sandbox Code Playgroud)
Tag 表是通过运行创建的: …
我试图使用Dapper over Npgsql执行批量插入,返回新插入的行的ID.在我的两个示例中都使用了以下insert语句:
var query = "INSERT INTO \"MyTable\" (\"Value\") VALUES (@Value) RETURNING \"ID\"";
Run Code Online (Sandbox Code Playgroud)
首先,我尝试添加一个具有"Value"属性的对象数组:
var values = new[] {
new { Value = 0.0 },
new { Value = 0.5 }
};
var ids = connection.Query<int>(query, values);
Run Code Online (Sandbox Code Playgroud)
但是,由于NpgsqlException失败:"错误:42703:列"值"不存在".读完这个问题之后,我想也许我必须传递一个DataTable对象而不是一个对象数组:
var dataTable = new DataTable();
dataTable.Columns.Add("Value", typeof(double));
dataTable.Rows.Add(0.0);
dataTable.Rows.Add(0.5);
var ids = connection.Query<int>(query, dataTable);
Run Code Online (Sandbox Code Playgroud)
但是,这失败了完全相同的异常.如何通过Npgsql执行批量插入并从Dapper中获取生成的序列ID?
我注意到异常的大小与列名称不匹配,但我确定我在表和列名称周围有引号,所以我不确定为什么它在"值"而不是"值"中表示例外.只是想我会提到它,以防它以某种方式与错误有关,因为很容易忽视套管.
- 编辑 -
为了澄清,这是创建表的SQL
CREATE TABLE "MyTable" (
"ID" SERIAL PRIMARY KEY,
"Value" DOUBLE PRECISION NOT NULL
);
Run Code Online (Sandbox Code Playgroud)
并使用上面定义的变量"query"和"values",这是基于每行的代码:
var ids = new …Run Code Online (Sandbox Code Playgroud) 我在代码中间歇性地收到此错误.有时它会在一段时间后发生.有时它发生在10次中.我不会在我的SQL中做任何独特或特殊的事情,而不像StackOverflow上正在执行COPY命令的其他海报.我所做的只是选择.
这是堆栈跟踪:
Exception while reading from stream
at Npgsql.ReadBuffer.Ensure(Int32 count, Boolean dontBreakOnTimeouts)
at Npgsql.NpgsqlConnector.DoReadMessage(DataRowLoadingMode dataRowLoadingMode, Boolean isPrependedMessage)
at Npgsql.NpgsqlConnector.ReadMessageWithPrepended(DataRowLoadingMode dataRow LoadingMode)
at Npgsql.NpgsqlConnector.ReadMessage(DataRowLoadingMode dataRowLoadingMode)
at Npgsql.NpgsqlConnector.ReadExpecting[T]()
at Npgsql.NpgsqlDataReader.NextResultInternal()
at Npgsql.NpgsqlDataReader.NextResult()
at Npgsql.NpgsqlCommand.Execute(CommandBehavior behavior)
at Npgsql.NpgsqlCommand.ExecuteDbDataReaderInternal(CommandBehavior behavior)
at Npgsql.NpgsqlCommand.ExecuteDbDataReader(CommandBehavior behavior)
at System.Data.Common.DbCommand.ExecuteReader()
at Npgsql.NpgsqlCommand.ExecuteReader()
at JBetaFinder.Program.portfolioSimulation(String beginResult, String endResult) in c:\Users\j\Documents\Visual Studio 2013\Projects\JBetaFinder\JBetaFinder\Program.cs:line 571
Run Code Online (Sandbox Code Playgroud)
有关如何避免此错误的任何建议?这是Npgsql和postgres的问题吗?
这是我的SQL语句,似乎是最成问题的:
select leg1.trade_date, sum(p.qty) as totalqty, max(gas.net_change)*10000 as avggaschange,
sum(((leg1.settlement_price - leg2.settlement_price) - (leg3.settlement_price - leg4.settlement_price))*qty*1000000) as spread_value_weight
from quant_portfolio p
inner join (select distinct trade_date, …Run Code Online (Sandbox Code Playgroud) 使用 Npgsql 传递空值看起来像这样:
using (NpgsqlCommand cmd = new NpgsqlCommand("insert into foo values (:TEST)", conn))
{
cmd.Parameters.Add(new NpgsqlParameter("TEST", NpgsqlDbType.Varchar));
cmd.Parameters[0].Value = DBNull.Value;
cmd.ExecuteNonQuery();
}
Run Code Online (Sandbox Code Playgroud)
哪个工作正常。
新的 Npgsql 4.0 文档建议使用强数据类型声明参数,如下所示:
using (NpgsqlCommand cmd = new NpgsqlCommand("insert into foo values (:TEST)", conn))
{
cmd.Parameters.Add(new NpgsqlParameter<string>("TEST", NpgsqlDbType.Varchar));
cmd.Parameters[0].Value = DBNull.Value;
cmd.ExecuteNonQuery();
}
Run Code Online (Sandbox Code Playgroud)
当传递 DBNull.Value 时,会抛出一般异常:
无法将“System.DBNull”类型的对象转换为“System.String”类型。
一切仍然适用于新的无装箱参数,但新语法似乎有意义,我们想使用它......但如何解决这种数据类型断开连接?
上面的例子是一个字符串。我认为这也会影响数字和日期。
我有一个C#客户端应用程序,它使用Npgsql在PostgreSQL 9.1.4中调用plpgsql函数.该功能需要很长时间,我想以某种方式向客户报告进度.我该怎么做?
LISTEN/NOTIFY机制听起来很完美,除了整个事务在事务内部运行并且NOTIFY事件直到事务结束才发送,这对我来说是无用的.
我尝试过的另一件事是RAISE NOTICE,我可以在客户端上处理,但即使是那些通知似乎也会缓冲一段时间并分批发送.它总比没有好,但不理想.有什么方法可以"冲洗"它们,所以它们会立即发送给客户吗?
我正在使用Entity Framework 6以编程方式建立与PostgresSQL的连接.我有这个类:
public class ClearspanDatabaseContext : DbContext
Run Code Online (Sandbox Code Playgroud)
使用此构造函数:
public ClearspanDatabaseContext()
: base(buildConnectionString())
{
}
Run Code Online (Sandbox Code Playgroud)
这是以编程方式创建连接字符串的静态方法:
private static string buildConnectionString()
{
RegisterDbProvider("Npgsql", ".Net Framework Data Provider for Postgresql", "Npgsql Data Provider", "Npgsql.NpgsqlFactory, Npgsql");
EntityConnectionStringBuilder entityConnectionStringBuilder = new EntityConnectionStringBuilder();
entityConnectionStringBuilder.Provider = "Npgsql";
entityConnectionStringBuilder.ProviderConnectionString = "host=192.168.168.140;Port=5432;username=ClearspanDevLogin;password=*******;database=ClearspanWebServerDev";
return entityConnectionStringBuilder.ToString();
}
Run Code Online (Sandbox Code Playgroud)
这里是将Npgsql注册为数据库提供程序的方法,取自此源:
public static bool RegisterDbProvider(string invariant, string description, string name, string type)
{
try
{
DataSet ds = ConfigurationManager.GetSection("system.data") as DataSet;
foreach (DataRow row in ds.Tables[0].Rows)
{
if (row["InvariantName"].ToString() == invariant) …Run Code Online (Sandbox Code Playgroud) entity-framework connection-string database-connection npgsql entity-framework-6
我正在开发一个项目,使用NpGsql EntityFramework 6连接到PostgreSQL数据库.当我尝试执行查询时,我得到了问题标题中的异常GetAdminUsersCount:
public class GenieRepository : IDisposable
{
GenieDbContext db = new GenieDbContext();
public IEnumerable<User> GetUsers()
{
return db.Users;
}
}
public int GetAdminUsersCount()
{
return repo.GetUsers().Where(u => u.Role.RoleName == "Administrator").Count();
}
Run Code Online (Sandbox Code Playgroud)
这个错误的原因是什么以及如何解决?
我正在尝试在C#Winforms中运行以下代码段.这段代码适用于pgsql 2.2.6适配器.为了与pgsql3.0.5适配器一起正常工作,可以进行哪些更正?谢谢.
NpgsqlConnection conn = new NpgsqlConnection(MainForm2.MyConString);
{
conn.Open();
using (NpgsqlCommand cmd = new NpgsqlCommand("SELECT rfid,name,sc_id from passenger ORDER by name", conn))
{
NpgsqlDataReader dr = cmd.ExecuteReader();
while (dr.Read())
{
var obj = new PassengerClass
{
RFID = dr.GetString(0),
Name = dr.GetString(1),
sc_id = dr.GetInt32(2)
};
s = dr.GetString(0);
try { ret.Add(s, obj); }
catch (Exception ex) { SM.Debug("Fail to add RFID Name in hash RFID:" + s + ex.ToString()); }
}
}
MainForm2.PassHash = ret;
try
{
using (NpgsqlCommand …Run Code Online (Sandbox Code Playgroud) 我有一个Azure耐用功能,可与也托管在Azure中的PostgreSQL数据库进行交互。
PostgreSQL数据库的连接限制为50,此外,我的连接字符串将连接池的大小限制为40,从而为超级用户/管理员连接留出了空间。
尽管如此,在某些负载下我还是得到了错误
53300:剩余的连接插槽保留用于非复制超级用户连接
Microsoft的这份文档似乎很相关,但是似乎我不能制作一个静态客户端,并且正如我提到的那样,
因为您仍然可以用尽连接,所以应该优化与数据库的连接。
我有这种方法
private IDbConnection GetConnection()
{
return new NpgsqlConnection(Environment.GetEnvironmentVariable("PostgresConnectionString"));
}
Run Code Online (Sandbox Code Playgroud)
当我想与PostgreSQL交互时,我喜欢这样
using (var connection = GetConnection())
{
connection.Open();
return await connection.QuerySingleAsync<int>(settings.Query().Insert, settings);
}
Run Code Online (Sandbox Code Playgroud)
因此,我正在创建(和布置)许多NpgsqlConnection对象,但是根据此,这应该没问题,因为连接池是在后台处理的。但是有关Azure Functions的某些信息可能会使这种想法无效。
我注意到我最终有很多空闲连接(来自pgAdmin):
基于此,我尝试摆弄Npgsql连接参数(如Connection Idle Lifetime,,Timeout和)Pooling,但连接过多的问题似乎一直持续到某种程度。另外,我尝试限制并发编排器和活动函数的数量(请参阅本文档),但这似乎在一定程度上破坏了Azure函数具有可伸缩性的目的。它确实有帮助-我得到的太多连接错误更少了。据推测,如果我继续用较小的数字进行测试,我什至可以消除它,但是,再次看来,这很不合理,并且可能还有另一种解决方案。
如何在不增加连接数的情况下将PostgreSQL与Azure函数一起使用?
postgresql azure npgsql azure-functions azure-durable-functions