我想自动从vb.net程序
每小时执行一次以下存储过程非常感谢任何帮助
我编写了如下存储过程。
create procedure dbo.test as
BEGIN
Select * from dbo.testtable
END
该存储过程返回了巨大的结果,然后导致应用程序加载时出现性能问题。
因此,我不想在每个按钮单击事件上调用相同的结果,而是每小时调用一次存储过程,并且必须使用某些状态管理技术(如Session
或{{}重新使用数据集。 1}}。
View State
文件 - 将结果保存在TestAspx.vb
方法1
Session
在下拉控件中加载会话数据
方法2
PrivateSub test()
dim ds as dataset
ds = objtestdata.test() //From here am accessing the datalayer testdata.vb file
Session("Testdata") = ds
End Sub
PrivateSub loaddropdown()
dropdowncontrol.DataSource = Session("Testdata")
dropdowncontrol.DataBind()
end sub
file - 从数据层调用存储过程
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
我可以在多个按钮单击加载中使用此数据集。
我必须处理Session("TestDate")
文件中的返回数据集,如下所示
我怎么能每小时运行整个过程?
在这方面帮助我。 谢谢,
答案 0 :(得分:2)
您的存储过程只是检索整个数据库表。如果此操作只是因为该表具有大量记录而很慢,则无法缓存数据库中可能对您有帮助的数据。
您应该仔细检查您是否确实需要始终将所有数据加载到应用程序中。如果你这样做,你的应用程序将始终缓慢加载 - 没有办法解决它。
虽然您可以创建asynchronous thread,但这可能是一个不如实现刷新按钮的解决方案,以便用户可以控制重新加载的时间。
最后,如果testtable
是一个视图而不是一个表,并且它缓慢地返回小数据,那么你应该专注于分析和修复视图的性能。
修改强>:
您可以将SQL Server代理作业配置为每小时执行一个慢速运行的过程,即使您的应用程序未运行也是如此。这假设您没有使用不包含SQL Server代理的Express版本。
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' ;
答案 1 :(得分:0)
我不知道您使用的是哪种框架版本。但是你可以在.Net2上使用MemoryCache或在.Net2上使用Http缓存。
如果您在.NET 4上运行,则可以使用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);
答案 2 :(得分:0)
SqlDependencyCache可能很适合您的需求,如果您只想加载一次结果集,并将其更改传播到您的应用程序: