【问题标题】:Web Service or Windows Service or SQL CLR Integration?Web 服务或 Windows 服务或 SQL CLR 集成?
【发布时间】:2010-02-22 20:54:58
【问题描述】:

大家下午好,

我有点不知所措,面临一些紧迫的最后期限,所以希望有人能提供一些建议。

我的起点是 SQL Server 数据库中的一个表,其中两个字段是从 gps 单元获得的 x,y 坐标。我将负责对这些位置进行地理编码(获取实际街道地址),并将结果写入成功表或将失败写入错误表。我正在整理实际执行地理编码过程的类库 (C#),但对将所有内容联系在一起的最佳方式感到非常困惑。

理想情况下,我想将数据集/数据表从 SQL Server 发送到某种类型的服务,其中所有记录都将进行地理编码,并且每条记录的结果/失败将被写回相应的表中。由于数据库和 dll 将驻留在同一台服务器上,我不明白为什么要使用 Web 服务。因此,我剩下的调查指向 Windows 服务或 SQL CLR 集成。我的主要问题是:

  1. 其中一种方法是否比其他方法更合适?
  2. 这种方法是否可以接受(就最佳实践而言)?

任何提示、cmets、建议将不胜感激。

顺便说一句,如果还不是很明显,我是一个相对新手的程序员。这个网站是我成长为一名程序员的宝贵工具,我非常感谢那些花时间阅读帖子并提供专家建议的人。

【问题讨论】:

    标签: sql sql-server clr service integration


    【解决方案1】:

    您的地理编码代码可能会连接到地理编码服务,这排除了 SQL CLR 集成。尽管在技术上可行,但从 SQL CLR 内部访问外部资源,特别是 Web 服务是您可能犯的最大错误。在几天的时间里,你的服务器肯定会因为 CLR 线程劫持而被冻结在工人饥饿中。

    最好的方法是使用 ETL 策略。坐标被转储到临时表中,您开始 ETL 过程并将所有坐标转换为地理编码,并将结果写入成功和错误表中。 ETL 方法通常考虑批处理、中断和恢复等。 ETL 可以是启动应用程序的 SQL 作业,也可以是 SSIS 包,有很多方法可以做到这一点,重要的一点是将工作分离到暂存表和提供挂起/恢复语义。您现在拥有的 dll 代码(我假设它是一个地理编码 Web 服务客户端代理代码)可能占您项目的 0.001%。

    流程是否需要公开为 Web 服务,与 ETL 流程完全正交,它应该由您的客户连接需求和技术来驱动。换句话说,如果客户端代码更愿意使用 WS 上传坐标,那么只要您考虑到大型数据集并且只要您为结果提供解耦、异步和排队的语义,就可以这样做。

    【讨论】:

    • 为什么使用 SQL Server CLR 会导致线程饥饿?如果服务是单例的,并且在完成后适当地处理它的资源,它仍然被认为是一个坏主意吗?
    【解决方案2】:

    这是我刚刚遇到的一个非常古老的问题。为了将来参考,ONS 有一个下载,您可以将邮政编码映射到邮政编码的纬度/经度(平均中心点),而且它是免费的。还有相当数量的其他下载。如果你有兴趣,就在这里:https://geoportal.statistics.gov.uk/datasets/national-statistics-postcode-lookup-latest-centroids/data

    【讨论】:

    • 不错!您能否也为所有其他在这里遇到的人添加该下载的链接?
    • 好点。我有点懒。原始答案已编辑以包含链接。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-22
    • 2015-12-28
    • 1970-01-01
    • 2012-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多