有人知道设置UnderlyingCriteria何时使用的方法Session.Query?
我正在尝试为一个特定查询设置更严格的命令超时(或查询超时),我试图避免在会话中的连接或其他查询上添加该约束.
我发现在旧QueryOver功能中你可以使用这样的东西
// QueryOver returns a IQueryOver<T,T> an nHibernate class
// with access to UnderlyingCriteria
var query = Session.QueryOver<Puppy>();
query.UnderlyingCriteria.SetTimeout(120);
Run Code Online (Sandbox Code Playgroud)
问题在于它是旧的,有缺陷的,只是有一大堆功能问题.
使用Query返回IQueryable<T>
var query = (from c in Session.Query<Puppy>());
Run Code Online (Sandbox Code Playgroud)
IQueryable 是一个MS类,没有明显的命令超时访问权限等.
另一种选择是以某种方式为所有命令设置会话命令超时,此时,然后恢复为默认值,但我没有看到任何公共机制来执行此操作,除了先设置命令超时并将其保留,比较如何为NHibernate LINQ语句设置超时
我正在尝试更改 OracleCommand 查询的命令超时,但它不起作用,因此不会触发超时异常。
使用 Oracle.ManagedDataAccess.dll (4.121.2.0)
using (OracleConnection _connection = new OracleConnection(connectionString))
{
using(OracleCommand command = _connection.CreateCommand())
{
command.CommandText = commandText;
command.CommandTimeout = 10;
_connection.Open();
using(OracleDataReader reader = command.ExecuteReader())
{
while (reader.Read())
{
Console.WriteLine(reader.GetValue(0));
}
}
} }
Run Code Online (Sandbox Code Playgroud)配置:
<configSections>
<section name="entityFramework"
type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
requirePermission="false"/>
<section name="oracle.manageddataaccess.client"
type="OracleInternal.Common.ODPMSectionHandler, Oracle.ManagedDataAccess, Version=4.121.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342"/>
</configSections>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5"/>
</startup>
<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework"/>
<providers>
<provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer"/>
<provider invariantName="Oracle.ManagedDataAccess.Client"
type="Oracle.ManagedDataAccess.EntityFramework.EFOracleProviderServices, Oracle.ManagedDataAccess.EntityFramework, Version=6.121.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342"/>
</providers>
</entityFramework>
<system.data> …Run Code Online (Sandbox Code Playgroud) 我发现该DatabaseFacade.SetCommandTimeout方法和该SqlServerDbContextOptionsBuilder.CommandTimeout方法都对我的代码没有任何影响,而是长时间运行的 SQL 命令只是无限期地继续。
我的上下文对象看起来像这样:
public class MyDataContext : DbContext
{
public MyDataContext()
{
base.Database.SetCommandTimeout(60);
}
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
...
optionsBuilder.UseSqlServer(connection, sqlServerOptions => sqlServerOptions.CommandTimeout(60));
}
}
Run Code Online (Sandbox Code Playgroud)
但是当我在 Web API 中执行代码时:
using var dbContext = new MyDataContext();
var timeout = dbContext.Database.GetCommandTimeout(); // this, as expected, returns "60"
var listOfEntities = dbContext.MyLargeSetOfEntities.ToList(); // this, however, just runs way longer than a minute (it is returning an immense amount of data to test the timeout)
Run Code Online (Sandbox Code Playgroud)
是否有什么地方可以覆盖这个值并使其不确定?
我成功地使用Powershell和SMO来备份大多数数据库.但是,我有几个大型数据库,其中收到"超时"错误"System.Data.SqlClient.SqlException:Timeout expired".时间一直发生在10分钟.我已经尝试将ConnectionContext.StatementTimeout设置为0,6000,并设置为[System.Int32] :: MaxValue.设置没有任何区别.我发现了许多Google引用,表明将其设置为0会使其无限制.无论我尝试什么,超时都会持续发生在10分钟.我甚至将服务器上的远程查询超时设置为0(通过Studio Manager)无济于事.下面是我的SMO连接,我设置了超时和实际的备份功能.下面是我脚本的输出.
更新 有趣的是,我使用VS 2008在C#中编写了备份函数,并且超时覆盖在该环境中工作.我正在将C#进程合并到我的Powershell脚本中,直到我找到为什么超时覆盖不能仅与Powershell一起使用.这非常烦人!
function New-SMOconnection {
Param ($server,
$ApplicationName= "PowerShell SMO",
[int]$StatementTimeout = 0
)
# Write-Debug "Function: New-SMOconnection $server $connectionname $commandtimeout"
if (test-path variable:\conn) {
$conn.connectioncontext.disconnect()
} else {
$conn = New-Object('Microsoft.SqlServer.Management.Smo.Server') $server
}
$conn.connectioncontext.applicationName = $applicationName
$conn.ConnectionContext.StatementTimeout = $StatementTimeout
$conn.connectioncontext.Connect()
$conn
}
$smo = New-SMOConnection -server $server
if ($smo.connectioncontext.isopen -eq $false) {
Throw "Could not connect to server $($server)."
}
Function Backup-Database {
Param([string]$dbname)
$db = $smo.Databases.get_Item($dbname)
if (!$db) {"Database $dbname was …Run Code Online (Sandbox Code Playgroud) 在我的C#.NET 3.5应用程序中,我在NHibernate上使用CastleProject ActiveRecord.这是使用MS SQL Server 2008的桌面应用程序.我已将ADO命令超时设置为0以防止批量操作期间的超时异常:
<activerecord>
<config>
...
<add key="hibernate.command_timeout" value="0" />
</config>
</activerecord>
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
<session-factory>
...
<property name="command_timeout">0</property>
</session-factory>
</hibernate-configuration>
Run Code Online (Sandbox Code Playgroud)
但是,我仍然收到超时异常!NHibernate日志显示如下:
在某处开始:
2010-10-02 06:29:47746 INFO NHibernate.Driver.DriverBase - 设置ADO.NET命令超时为0秒
到最后的某个地方:
2010-10-02 07:36:03020 DEBUG NHibernate.AdoNet.AbstractBatcher - 闭IDbCommand的,开放的IDbCommand S:0 2010-10-02 07:36:03382 ERROR NHibernate.Event.Default.AbstractFlushingEventListener - 无法SYN chronize数据库状态与会话NHibernate.HibernateException:执行批处理查询---> System.Data.S qlClient.SqlException时发生异常:超时过期.操作完成之前经过的超时时间或服务器没有响应.在System.Data.SqlClient.SqlConnection.OnError(SqlException异常,布尔breakConnection)
怎么会?如何解决这个问题?
nhibernate timeout castle-activerecord sqlexception command-timeout
我有一个测试Windows主机(50 MB),它服务于我的ASP.NET Web应用程序,它工作得很好,但在升级到100 MB后,我在尝试从Visual远程连接SQL服务器时经常出现SQL服务器超时错误工作室(即在我的网站的本地开发中),我试图手动增加SQL命令超时,我认为它以某种方式解决了,但我认为我的行为不对,当然我的网站查看者在查看页面时没有问题一切都适合最终用户,我只是在开发网站和通过VS2010访问我的远程数据库时遇到问题,我真的应该考虑增加超时吗?如何全局增加超时?我应该为每个SQL命令设置commandtimeout属性吗?是否可以在连接字符串中增加它?当然,因为我目前正在使用共享主机,所以我无法更改SQL Server管理工作室设置
请指导我这个问题因为我对超时属性没有好感!谢谢
c# ×2
nhibernate ×2
sql-server ×2
timeout ×2
.net ×1
backup ×1
linq ×1
oracle ×1
smo ×1
sqlexception ×1