【问题标题】:Executing a stored procedure once an hour automatically每小时自动执行一次存储过程
【发布时间】:2012-07-10 14:50:26
【问题描述】:

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

非常感谢任何帮助

我编写了如下存储过程。

create procedure dbo.test as  
BEGIN  
   Select * from dbo.testtable  
END

该存储过程正在返回巨大的结果,然后导致应用程序加载时出现性能问题。

因此,我不想在每个按钮单击事件上调用相同的结果,而是想每小时调用一次存储过程,并且必须通过使用一些状态管理技术(如SessionView State)重新使用数据集。

TestAspx.vb 文件 - 在Session 中维护结果

方法1

PrivateSub test()  
        dim ds as dataset
        ds = objtestdata.test() //From here am accessing the datalayer testdata.vb file
        Session("Testdata") = ds
    End Sub  

在下拉控件中加载 Session 数据

方法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  

因此,通过使用Session("TestDate"),我可以在多个按钮单击加载中使用此数据集。

我必须如下处理testaspx.vb文件中的返回数据集

我怎么能每小时运行整个过程?

在这方面帮助我。 谢谢,

【问题讨论】:

  • 如何在服务中执行每小时存储过程,在该服务中,您可以将每小时数据插入另一个表并在您的 vb 应用程序中使用该表。
  • 如果那个存储过程(它是存储的——就像你的数据库中的存储)返回巨大的结果 正如你所说 - 你绝对不想将它存储到视图状态!

标签: .net sql-server vb.net


【解决方案1】:

您的存储过程只是检索整个数据库表。如果这个操作很慢只是因为表有大量的记录,那么没有办法缓存数据库中的数据来帮助你。

您应该仔细检查您是否真的需要一直将所有数据加载到应用程序中。如果这样做,您的应用程序将始终加载缓慢 - 没有办法解决。

虽然您可以创建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' ;

【讨论】:

  • 存储过程非常高级。是的,我必须将整个数据加载到应用程序中。从 SP 方面我们也进行了性能调整。谢谢您的建议。
  • @OverflowUser - 如果存储过程很复杂,并且产生相对较小的数据(少于 10000 条记录)缓慢,这将有助于列出整个 SP 代码、它使用的所有表的架构、所有现有索引和查询计划,作为问题的一部分。我只是在看你已经发布的 SP,那是一条线。
  • 请忽略SP端性能。例如,我写的 SP.Bottom 行是“我必须使用 .net 每小时自动执行一次存储过程”
  • @OverflowUser - 性能被适当地忽略了,“使用 .net”也被忽略了,因为我假设您可能不希望在您的应用程序未运行时停止这些每小时作业。
【解决方案2】:

我不知道您使用的是什么框架版本。但是您可以在 .Net4 上使用 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);

【讨论】:

    【解决方案3】:

    如果您只想加载一次结果集并将对它的更改传播到您的应用程序,那么 SqlDependencyCache 可能会很好地满足您的需求:

    http://msdn.microsoft.com/en-us/library/ms178604.aspx

    【讨论】:

      猜你喜欢
      • 2012-07-08
      • 2017-10-14
      • 2017-03-28
      • 1970-01-01
      • 1970-01-01
      • 2010-09-12
      • 2018-01-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多