.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文件-在会话

我想从vb.net程序中每小时自动执行一次下面的存储过程

非常感谢您的帮助

我编写了以下存储过程,如下所示

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应用程序中使用该表。如果该存储过程(它是存储的-就像存储在数据库中一样)返回您所说的巨大结果-您肯定不想将其存储到视图状态中!