我有一个关于缓存的问题.我有一个典型的n层ASP.NET Web应用程序.我已经创建了一个自定义缓存包装器(包装ASP.NET缓存对象),我想知道缓存数据的最佳实践.我不想在我的业务层中使用缓存(不想在那里添加对System.Web dll的任何引用).与DAL相同的情况.所以剩下的唯一选择是:
我也听说过即将推出的Velocity缓存框架,但我想这可能是一种矫枉过正(因为我的应用程序不需要Web场/集群).
我的方法可能非常错误,所以我欢迎任何关于如何在我的网络项目中有效缓存数据的建议或替代方法.
我有两个表[LogTable]和[LogTable_Cross].
下面是填充它们的架构和脚本:
--Main Table
CREATE TABLE [dbo].[LogTable]
(
[LogID] [int] NOT NULL
IDENTITY(1, 1) ,
[DateSent] [datetime] NULL,
)
ON [PRIMARY]
GO
ALTER TABLE [dbo].[LogTable] ADD CONSTRAINT [PK_LogTable] PRIMARY KEY CLUSTERED ([LogID]) ON [PRIMARY]
GO
CREATE NONCLUSTERED INDEX [IX_LogTable_DateSent] ON [dbo].[LogTable] ([DateSent] DESC) ON [PRIMARY]
GO
CREATE NONCLUSTERED INDEX [IX_LogTable_DateSent_LogID] ON [dbo].[LogTable] ([DateSent] DESC) INCLUDE ([LogID]) ON [PRIMARY]
GO
--Cross table
CREATE TABLE [dbo].[LogTable_Cross]
(
[LogID] [int] NOT NULL ,
[UserID] [int] NOT NULL
)
ON [PRIMARY]
GO
ALTER TABLE …Run Code Online (Sandbox Code Playgroud) sql indexing sql-server-2008 database-tuning sql-server-2012
我们在带有SQL Server 2016的ASP.NET Web项目中使用Hangfire 1.7.2。我们的服务器上大约有150个站点,每个站点都使用Hangfire 1.7.2。我们注意到,当我们升级这些站点以使用Hangfire时,数据库服务器崩溃了。查看数据库日志,我们发现有多个锁定查询。我们在所有阻止会话中都标识了一个RPC事件“ sys.sp_getapplock; 1”。看来Hangfire锁定了我们的数据库,使整个数据库无法使用。由于Hangfire,我们注意到将近670多个锁定查询。
这可能是由于我们设置了以下属性:
SlidingInvisibilityTimeout = TimeSpan.FromMinutes(30),
QueuePollInterval = TimeSpan.FromHours(5)
Run Code Online (Sandbox Code Playgroud)
每个站点大约有20个后台作业,其中一些每分钟运行一次,而另一些每小时,每6小时运行一次,每天运行一次。
我已经搜索了文档,但是找不到任何可以解释这两个属性或如何设置它们以避免数据库锁定的内容。
在这方面寻求帮助。
编辑:每秒执行以下查询:
exec sp_executesql N'select count(*) from [HangFire].[Set] with (readcommittedlock, forceseek) where [Key] = @key',N'@key nvarchar(4000)',@key=N'retries'
select distinct(Queue) from [HangFire].JobQueue with (nolock)
exec sp_executesql N'select count(*) from [HangFire].[Set] with (readcommittedlock, forceseek) where [Key] = @key',N'@key nvarchar(4000)',@key=N'retries'
Run Code Online (Sandbox Code Playgroud)
不管我们设置的时间跨度值的各种组合如何。这是我们正在使用的GetHangfirServers的代码:
public static IEnumerable<IDisposable> GetHangfireServers()
{
// Reference for GlobalConfiguration.Configuration: http://docs.hangfire.io/en/latest/getting-started/index.html
// Reference for UseSqlServerStorage: http://docs.hangfire.io/en/latest/configuration/using-sql-server.html#configuring-the-polling-interval
GlobalConfiguration.Configuration
.SetDataCompatibilityLevel(CompatibilityLevel.Version_170)
.UseSimpleAssemblyNameTypeSerializer()
.UseRecommendedSerializerSettings()
.UseSqlServerStorage(ConfigurationManager.ConnectionStrings["abc"]
.ConnectionString, new SqlServerStorageOptions
{
CommandBatchMaxTimeout = …Run Code Online (Sandbox Code Playgroud) 我在应用程序中使用带有 SAML 的 Azure AD,以便用户通过 Azure AD 通过 SSO 登录。参考: https: //learn.microsoft.com/en-us/azure/active-directory/active-directory-enterprise-apps-manage-sso
我在实现单点登录和获取已在 Azure AD 门户中设置为声明的属性(名字、姓氏等)时没有任何问题。
我的要求是也获取用户的个人资料图像。
不幸的是,我无法找到需要在 Azure AD 声明中设置的属性。
我尝试搜索以下属性:user.thumb、user.thumnailPhoto、user.avatar、user.displayPicture、user.profilePicture,但不存在任何属性可将其添加为声明。
有谁知道如何在通过 SAML 记录时将个人资料图像作为声明添加到 Azure AD 门户中?
我需要向Kibana版本zip中存在的JS文件之一添加一些自定义代码:https ://www.elastic.co/downloads/kibana
现在,当我运行Kibana时,我看到以下已缩小和捆绑在一起的JS文件:
它来自Kibana的optimize文件夹:
有什么方法可以运行/ src位置上存在的未修改版本:
我的目标是向通过Kibana完成的每个搜索请求添加自定义querystring参数:
http:// localhost:5601 / elasticsearch / _msearch
因此,试图找出发出此请求的确切文件,但现在使用缩小的文件,似乎很难找到该位置。
如果我们必须对现有的JS文件进行任何更改,则必须删除optimize文件夹,以便在下一次重新启动Kibana服务时,可以进行文件捆绑以适应我们的自定义更改。这花费了足够的时间,这使得使用Kibana的JS文件进行调试非常耗时。
如何防止此捆绑步骤,以便使用Kibana可以轻松进行JS调试。
我在DAL中有一个方法,如:
public bool GetSomeValue(int? a, int?b, int c)
{
//check a Stored Proc in DB and return true or false based on values of a, b and c
}
Run Code Online (Sandbox Code Playgroud)
在这个方法中,我传递两个可空类型,因为这些值可以为null(并在DB Stored Proc中将它们检查为null).我不想使用幻数,所以可以通过这样的nullables类型(从性能和架构灵活性的角度来看)?
我们正面临类似的问题,如https://github.com/SignalR/SignalR/issues/3353
当我们启动我们的应用程序时,一段时间后连接到集线器的所有用户开始重新连接问题.
在Chrome控制台中,所有用户都会看到这种情况:
jquery.signalR.min.js WebSocket连接到'wss:// [我们的站点url]/signalr/reconnect?transport = webSocke ... HcDfA%3D%3D&connectionData =%5B%7B%22name%22%3A%22myhub%22% 7D%5D&tid = 10'失败:WebSocket握手期间出错:意外响应代码:404
所有用户都处于重新连接模式,即此方法将持续为所有用户触发:
connection.hub.stateChanged(function (change) {
if (change.newState === $.connection.connectionState.reconnecting) {
failPendingMessages();
ui.showStatus(1, '');
}
else if (change.newState === $.connection.connectionState.connected) {
if (!initial) {
ui.showStatus(0, $.connection.hub.transport.name);
ui.setReadOnly(false);
} else {
ui.initializeConnectionStatus($.connection.hub.transport.name);
}
initial = false;
}
else if (change.newState === $.connection.connectionState.disconnected && initial === true) {
initial = false;
}
});
Run Code Online (Sandbox Code Playgroud)
我们正在使用Jabbr源代码中的代码.
状态正在从连接>重新连接>双向连接>连接
似乎有很多连接后,所有与Hub的连接仍然卡住,即无法正确地与集线器通信,因此连接断开,我们收到"WebSocket握手:意外响应代码:404",我上面提到过.
请注意,此行为/问题没有固定的时间.有时它会在"应用程序启动"的几分钟内开始,有时需要大约20-30分钟.
这个问题肯定是因为许多连接通过Hub同时与Signalr核心代码进行通信.
它有什么问题吗?
编辑:我们使用的是最新版本的Signalr,即Microsoft.AspNet.SignalR.Core.dll(2.2.0)
在我的 BL(将是公共 API)中,我使用 ICollection 作为我的 Find 方法中的返回类型,例如:
public static ICollection<Customer> FindCustomers()
{
Collection<Customer> customers = DAL.GetCustomers();
return customers;
}
Run Code Online (Sandbox Code Playgroud)
请注意使用 ICollection 而不是 Collection<>。
现在在我的 GUI 中,我需要将结果转换回 Collection,例如:
Collection<Customer> customers = (Collection<Customer>)BL.FindCustomers();
Run Code Online (Sandbox Code Playgroud)
这是因为我需要在返回的列表中使用一些 Collection<> 特定的方法,而 ICollection<> 无法做到这一点。
这是正确的用法吗?或者我应该简单地将返回类型从 Collection<> 改为 ICollection<> 以避免这种转换?
其次,我没有使用 IEnumerable,因为它比 ICollection 更通用,甚至没有像 Count 这样的简单属性。而且我真的没有看到在这里概括返回类型的意义。我错过了什么重要的东西吗?
我正在尝试运行有关 webrtc 的示例。为此我去了
\n\nhttps://bitbucket.org/webrtc/codelab/src/50a47bb092483fd7ca27998a365dff434919bf89?at=master
\n\n在第 5 步,我需要运行 server.js。为此,我打开 Windows 命令提示符并输入:
\n\nC:\\Program Files\\nodejs>节点 D:\\GITProjects\\codelab\\complete\\step5\\server.js
\n\n但我收到了这个错误:
\n\nmodule.js:338\n throw err;\n ^ Error: Cannot find module \'node-static\'\n at Function.Module._resolveFilename (module.js:336:15)\n at Function.Module._load (module.js:278:25)\n at Module.require (module.js:365:17)\n at require (module.js:384:17)\n at Object.<anonymous> (D:\\GITProjects\\codelab\\complete\\step5\\server.js:1:76)\n\n at Module._compile (module.js:460:26)\n at Object.Module._extensions..js (module.js:478:10)\n at Module.load (module.js:355:32)\n at Function.Module._load (module.js:310:12)\n at Function.Module.runMain (module.js:501:10)\nRun Code Online (Sandbox Code Playgroud)\n\n我已经安装了节点静态模块,它位于
\n\n“C:\\Program Files\\nodejs\\node_modules\\node-static”
\n\n
我仍然收到错误“找不到模块\'node-static\'”。
\n\n环境“PATH”变量设置为“C:\\Users\\user\\AppData\\Roaming\\npm”
\n\n我可以看到节点静态文件夹也存在于“C:\\Users\\user\\AppData\\Roaming\\npm\\node_modules\\node-static”路径中。
\n\n编辑:
\n\n根据评论,我在 Windows 命令提示符下尝试安装节点静态:
\n\nC:\\Program Files\\nodejs>npm …
我在Redis缓存中有200,000多名用户。
当我尝试使用来从Redis的缓存名单StackExchange.Redis StringGet,我得到TimeOut错误:
“执行GET的超时,实例:1,mgr:ExecuteSelect,错误:从不,队列:2,qu:0,qs:2,qc:0,wr:0,wq:0,在:8596,ar:0,IOCP :(忙= 0,免费= 1000,最小值= 2,最大值= 1000),工作人员:(忙= 0,免费= 4095,最小值= 2,最大值= 4095),客户端名称:WIN-XYZ”
有人可以解释这些值表示什么:忙,闲,最小和最大吗?
我已经在构造函数中通过此方法将超时增加了很多:
redis = ConnectionMultiplexer.Connect(string.Format("{0},allowAdmin=true,connectTimeout=1500000,keepAlive=100", redisConfig));
Run Code Online (Sandbox Code Playgroud)
但是,每次获取用户列表时,我仍然会超时。
这不是GET的问题,我在设置该列表时也遇到了问题:
执行PSETEX的超时,inst:1,mgr:ExecuteSelect,err:never,queue:2,qu:0,qs:2,qc:0,wr:1,wq:1,in:0,ar:0,IOCP: (忙= 0,免费= 1000,最小= 2,最大= 1000),工作人员:(忙= 0,免费= 8191,最小= 2,最大= 8191),客户端名称:WIN-XYZ
在:
db.StringSet(cacheKey, bytes, slidingExpiration);
Run Code Online (Sandbox Code Playgroud)
我什至尝试提高这里提到的各种超时https://stackexchange.github.io/StackExchange.Redis/Configuration:
redis = ConnectionMultiplexer.Connect(string.Format("{0},allowAdmin=true,syncTimeout=600000,connectRetry=3,connectTimeout=600000,keepAlive=180", redisConfig));
redis.PreserveAsyncOrder = false;
Run Code Online (Sandbox Code Playgroud)
但我仍然收到以下错误:
执行GET的超时,inst:0,mgr:ExecuteSelect,err:永不,队列:0,qu:0,qs:0,qc:0,wr:0,wq:0,in:0,ar:0,IOCP: (忙= 0,免费= 1000,最小= 2,最大= 1000),工作人员:(忙= 2,免费= 4093,最小= 2,最大= 4095),客户端名称:WIN-XYZ
c# ×6
asp.net ×2
.net ×1
azure ×1
caching ×1
collections ×1
hangfire ×1
indexing ×1
javascript ×1
kibana ×1
node.js ×1
redis ×1
saml ×1
signalr ×1
signalr-hub ×1
sql ×1
sql-server ×1
windows ×1