.net 每小时自动执行一次存储过程
我想从vb.net程序中每小时自动执行一次下面的存储过程 非常感谢您的帮助 我编写了以下存储过程,如下所示.net 每小时自动执行一次存储过程,.net,sql-server,vb.net,.net,Sql Server,Vb.net,我想从vb.net程序中每小时自动执行一次下面的存储过程 非常感谢您的帮助 我编写了以下存储过程,如下所示 create procedure dbo.test as BEGIN Select * from dbo.testtable END 该存储过程返回大量结果,然后导致应用程序加载时出现性能问题 因此,我不想在每个按钮单击事件上调用相同的结果,而是希望每小时调用一次存储过程,并且必须使用一些状态管理技术(如会话或查看状态)重新使用数据集 TestAspx.vb文件-在会话
create procedure dbo.test as
BEGIN
Select * from dbo.testtable
END
该存储过程返回大量结果,然后导致应用程序加载时出现性能问题
因此,我不想在每个按钮单击事件上调用相同的结果,而是希望每小时调用一次存储过程,并且必须使用一些状态管理技术(如会话
或查看状态
)重新使用数据集
TestAspx.vb
文件-在会话中维护结果
方法1
PrivateSub test()
dim ds as dataset
ds = objtestdata.test() //From here am accessing the datalayer testdata.vb file
Session("Testdata") = ds
End Sub
在下拉控件中加载会话数据
方法2
PrivateSub loaddropdown()
dropdowncontrol.DataSource = Session("Testdata")
dropdowncontrol.DataBind()
end sub
Testdata.vb
文件-从数据层调用存储过程
Public Function test() As DataSet
Dim ds As New DataSet
Dim cmd As DbCommand
ds.Locale = CultureInfo.InvariantCulture
cmd = db.GetStoredProcCommand("dbo.test")
ds = db.ExecuteDataSet(cmd)
Return ds
End Function
因此,通过使用会话(“TestDate”)
我可以在多个按钮点击加载中使用此数据集
我必须在testaspx.vb
文件中处理返回的数据集,如下所示
我怎样才能每小时运行整个过程
在这方面帮助我。
谢谢,您的存储过程只检索整个数据库表。如果这个操作很慢,只是因为表中有大量的记录,那么就没有办法在数据库中缓存数据来帮助您 您应该仔细检查是否真的需要一直将所有数据加载到应用程序中。如果您这样做,您的应用程序将始终缓慢加载-这是无法避免的 虽然您可以创建一个,但这可能是一个不如实现刷新按钮的解决方案,以便用户可以控制何时发生重新加载 最后,如果
testtable
是一个视图而不是一个表,并且它返回小数据的速度很慢,那么您应该关注分析和修复视图的性能
编辑:
您可以将SQL Server代理作业配置为每小时执行一个缓慢运行的过程,即使在应用程序未运行时也是如此。这假定您没有使用不包含SQL Server代理的Express edition
EXEC sp_add_job N'MyHourlyJob'
EXEC sp_add_jobstep
@job_name = N'MyHourlyJob',
@step_name = N'Update_Something',
@command = N'EXEC p_Update_Something',
EXEC sp_add_schedule
@schedule_name = N'HourlyJobs' ,
@freq_interval = 1,
@freq_type = 4, -- every @freq_interval days
@freq_subday_type = 8, -- every @freq_subday_interval hours
@freq_recurrence_factor = 1,
@freq_subday_interval = 1
EXEC sp_attach_schedule
@job_name = N'MyHourlyJob',
@schedule_name = N'HourlyJobs' ;
我不知道您使用的是什么框架版本。但是您可以使用.Net4上的MemoryCache或.Net2上的Http缓存 如果您运行的是.NET4,您可以使用MemoryCache来完成这项工作
public static class MyBigDataCache
{
private const string RegionName= "myBigDataRegion";
// key could by the username...
public static DataTable GetMyData(string key)
{
// try the cache
var data = (DataTable) MemoryCache.Default.Get(key, RegionName);
// nothing in cache...
if (data == null)
{
// read from db
data = ReadDataFromDb(key);
// create the cache policy to evict this key after 1 hour.
var policy = new CacheItemPolicy()
{
AbsoluteExpiration = DateTimeOffset.Now.AddMinutes(60)
};
// add to cache
MemoryCache.Default.Add(new CacheItem(key, data, RegionName), policy);
}
return data;
}
private static DataTable ReadDataFromDb(String key)
{
// load your data here...
return null;
}
}
如果您在.NET2上运行,则可以使用Http缓存。例如:
HttpContext.Current.Cache.Add(key, data, null, DateTime.Now.AddMinutes(60), Cache.NoSlidingExpiration, CacheItemPriority.Default,
null);
如果您只想加载一次结果集,并将更改传播到您的应用程序中,SqlDependencyCache可能很适合您的需要:
存储过程的级别非常高。是的,我必须将整个数据加载到应用程序中。我们也从SP端进行了性能调整。谢谢您的建议。@OverflowUser-如果存储过程很复杂,并且生成的数据相对较小(少于10000条记录),那么它将有助于列出整个SP代码、它使用的所有表的架构、所有现有索引,和查询计划,作为问题的一部分。我只是在看你已经发布的SP,那是一行。请忽略SP端的性能。例如,我编写了SP。底线是“我必须每小时自动执行一次存储过程,方法是使用.net”@OverflowUser-性能被适当忽略,“.net”也被忽略,我假设您可能不希望在应用程序未运行时停止每小时的作业。在服务中执行每小时的存储过程怎么样?在该服务中,您可以将每小时的数据插入另一个表中,并从vb应用程序中使用该表。如果该存储过程(它是存储的-就像存储在数据库中一样)返回您所说的巨大结果-您肯定不想将其存储到视图状态中!