相关疑难解决方法(0)

数据库连接应该是单例吗?

Java中创建单例的最佳方法是什么?数据库连接应该是单例(单例是否是自动线程安全的)?因为理论上DB不能同时被许多用户访问.

java singleton design-patterns

18
推荐指数
2
解决办法
4万
查看次数

使用NHibernate和分布式事务导致"服务器无法恢复事务"的死锁

将NHibernate与分布式事务一起使用时,我们遇到了问题.

请考虑以下代码段:

//
// There is already an ambient distributed transaction
//
using(var scope = new TransactionScope()) {
    using(var session = _sessionFactory.OpenSession())
    using(session.BeginTransaction()) {
        using(var cmd = new SqlCommand(_simpleUpdateQuery, (SqlConnection)session.Connection)) {
            cmd.ExecuteNonQuery();
        }

        session.Save(new SomeEntity());
        session.Transaction.Commit();
    }
    scope.Complete();
}
Run Code Online (Sandbox Code Playgroud)

有时,当服务器处于极端负载时,我们将看到以下内容:

  1. 使用cmd.ExecuteNonQuery执行的查询被选为死锁牺牲品(我们可以在SQL事件探查器中看到它),但不会引发异常.
  2. session.Save失败,并显示错误消息"操作对事务状态无效".
  3. 每次执行此代码后,session.BeginTransaction都会失败.前几次,内部异常会有所不同(有时它是应该在步骤1中引发的死锁异常).最终它稳定到"服务器未能恢复交易.描述:3800000177." "不允许新请求启动,因为它应该带有有效的事务描述符."

如果单独使用,应用程序最终(在几秒或几分钟后)将从此条件恢复.

为什么步骤1中没有报告死锁异常?如果我们无法解决这个问题,那么我们如何防止我们的应用程序暂时无法使用?

该问题已在以下环境中重现

  • Windows 7 x64和Windows Server 2003 x86
  • SQL Server 2005和2008
  • .NET 4.0和3.5
  • NHibernate 3.2,3.1和2.1.2

我已经创建了一个测试夹具,有时会为我们重现这个问题.它可以在这里找到:http://wikiupload.com/EWJIGAECG9SQDMZ

sql-server nhibernate connection-pooling distributed-transactions

12
推荐指数
1
解决办法
9649
查看次数