通常它可以正常工作,但在某些情况下(我无法重现),我收到带有stacktrace的NullReferenceException:

at Npgsql.NpgsqlCommand.ClearPoolAndCreateException(Exception e) in C:\projects\Npgsql2\src\Npgsql\NpgsqlCommand.cs:line 1505
   at Npgsql.NpgsqlCommand.GetReader(CommandBehavior cb) in C:\projects\Npgsql2\src\Npgsql\NpgsqlCommand.cs:line 650
   at Npgsql.NpgsqlCommand.ExecuteBlind() in C:\projects\Npgsql2\src\Npgsql\NpgsqlCommand.cs:line 499
   at Npgsql.NpgsqlTransaction.Rollback() in C:\projects\Npgsql2\src\Npgsql\NpgsqlTransaction.cs:line 185
   at Npgsql.NpgsqlTransaction.Dispose(Boolean disposing) in C:\projects\Npgsql2\src\Npgsql\NpgsqlTransaction.cs:line 141
   at NHibernate.Transaction.AdoTransaction.Dispose(Boolean isDisposing) in p:\nhibernate-core\src\NHibernate\Transaction\AdoTransaction.cs:line 368
   at NHibernate.Impl.SessionImpl.Close() in p:\nhibernate-core\src\NHibernate\Impl\SessionImpl.cs:line 380
   at NHibernate.Impl.SessionImpl.Dispose(Boolean isDisposing) in p:\nhibernate-core\src\NHibernate\Impl\SessionImpl.cs:line 1738
   at NHibernate.Impl.SessionImpl.Dispose() in p:\nhibernate-core\src\NHibernate\Impl\SessionImpl.cs:line 1709
    public virtual IEnumerable<User.PublishedInfo> GetUsersByXP(int count)
    {
        using (ISession session = SessionFactory.OpenSession())
        {
            using (session.BeginTransaction())
            {
                var result = session.CreateCriteria<User>()
                    .SetProjection(PublishedUserProjections)
                    .AddOrder(Order.Desc("XP"))
                    .SetMaxResults(count)
                    .SetResultTransformer(Transformers.AliasToBean<User.PublishedInfo>())
                    .List<User.PublishedInfo>();

                foreach (var r in result)
                    r.Initialize();

                session.Transaction.Commit();

                return result; // this line
            }
        }
    }

这里可能有什么错误?

UPDATE

有时在同一代码段中(但在BeginTransaction中),我会收到一个异常“连接时超时”。 也许这与某种原因有关。

#1楼 票数:1 已采纳

我在2.0.14.3中看到了同样的事情。 您正在运行哪个版本? 哪个版本的NHibernate?

查看代码,我发现

    internal NpgsqlException ClearPoolAndCreateException(Exception e)
    {
        Connection.ClearPool();
        return new NpgsqlException(resman.GetString("Exception_ConnectionBroken"), e);
    }

2.2似乎同样遭受苦难

与大多数其他操作一样,对Connection属性始终执行null检查。 这可能是一个错误,但似乎在master分支中也进行了大量重写。

我能找到的唯一可以真正将连接内部设置为null的来源(除非由NHibernate以某种方式完成,但我对此表示怀疑)将是是否要处置NpgsqlCommand,然后从NpgsqlDataReader中读取。

编辑:

根据消息来源,如果NpgsqlTransaction仍然具有连接且事务处于活动状态,则将在Dispose上调用回滚。 在您的情况下,提交应该将其设置为null。 您正在使用using块中的session.Transaction(与存储从BeginTransaction()调用返回的引用相对)的事实可能是罪魁祸首,因为对session.Transaction的调用会隐式创建事务(如果会话中不存在任何事务) 。 这可能会导致commit调用实际上只是提交给空事务,然后在使用BeginTransaction创建的事务上调用Dispose。

在运行此代码时,您是否有任何多线程或异步代码可用于您的会话?

#2楼 票数:0

在我看来,如果事务内发生某些错误,它将引发异常并处置会话/事务。 尝试...

    using (ISession session = SessionFactory.OpenSession())
    {
        List<User.PublishedInfo> results = null;
        ITransaction transaction = null;
        try
        {
            transaction = session.BeginTransaction();
            results = session.CreateCriteria<User>()
                .SetProjection(PublishedUserProjections)
                .AddOrder(Order.Desc("XP"))
                .SetMaxResults(count)
                .SetResultTransformer(Transformers.AliasToBean<User.PublishedInfo>())
                .List<User.PublishedInfo>();

            foreach (var r in results)
                r.Initialize();

            transaction.Commit();
        }
        catch(Exceptionn ex)
        {
            if (transaction != null)
                transaction.Rollback();
            throw;
        }
        return results;
    }

  ask by Vlad translate from so

未解决问题?本站智能推荐:

3回复

什么是限制请求数?为什么“从池中获取连接时超时”?

在高负载条件下,NHibernate 有时会在调用 BeginTransaction 时抛出异常。 在 Npgsql 的 RequestConnector 方法中Timeout while getting a connection from pool该消息包含Timeout while gettin
1回复

连接与会话不一样吗?

我试图弄清楚何时创建和删除临时表。 我以为在会话结束时会删除一个临时表,但是此测试使我不确定。 连接字符串具有Pooling=true;Maximum Pool Size=50因此存在池,最多50个连接。 我同时运行以下代码,一次运行30个作业。 我可以看到,无论我运行代码多少次,
1回复

通过npgsql定位Postgres时,nhibernate是否生成准备好的语句?

如果可以,是否可以查询数据库以确认已生成准备好的语句,并查看准备好的语句消耗了多少内存?
1回复

SharpArchitecture中使用Npgsql时的问题

在SharpArchitecture中使用Npgsql时,有没有人可以帮助我。我很沮丧。 我使用了Postgresql 8.4,Npgsql 2.0.11,SharpArchitecture 2.0.0.0和Visual Studio 2010。 我的示例项目名为“成功”。 1)我在每
2回复

当另一个用户打开事务时,在数据库上添加表

在同一个项目中工作时,碰巧有些程序员正在测试sw(使用事务),而另一些程序员想要创建或更改表。 当第二组启动“ CREATE TABLE”时,查询将继续工作,直到关闭所有事务。 在其他用户进行事务处理时,有什么方法可以成功启动CREATE查询吗? 我们在数据库中使用postgresq
2回复

Npgsql如何处理失败的事务?

在ASP.NET应用程序(C#)中,我们使用Postgres作为后端,使用Npgsql作为数据提供程序。 几天前,我们遇到了严重的数据丢失问题。 我在代码中调查并找到了这样的代码: 有人坚持认为Npgsql会自己处理异常,并会在事务发生错误时自动回滚事务。 在我看来,这是非常乐观的,
1回复

npgsql事务中的其他语句

在使用Npgsql的客户端与我们的Postgres服务器之间分析(在数据库方面)通信时,我看到在每个事务期间都在运行一些其他语句。 日志示例: 有问题的两个语句是初始的“ select'Npgsql155171'”和“ unlisten *”。 这两个陈述是否绝对必要? 有人知道他
1回复

使用带有字符串数组的IN谓词时,PostgreSQL缺少运算符

鉴于此表结构: 为什么以下查询失败并显示错误: 查询: