Python和SQL Server 2017的力量

Python是SQL Server 2017的新功能。

它主要是为了允许在SQL Server中使用基于Python的机器学习,但是它可以与任何Python库或框架一起使用。为了提供可能的例子,Hitendra展示了如何安全地使用该功能来提供智能应用程序缓存,其中SQL Server可以自动指示数据何时更改以触发缓存刷新。

MS SQL Server 2017已经通过启用SQL服务器通过“使用Python的机器学习服务”在TSQL中执行Python脚本,添加到其高级分析扩展,现在称为“机器学习服务”。这基本上提供了一种数据库程序员可以直接从Python传递数据的方法。这样做的有用性不仅限于为数据分析提供机器学习功能,因为Python具有许多易于使用的模块和框架来解决许多问题,例如使用数据结构执行大量计算工作,用于分析的图形处理,网络操作,数据库操作,网络操作或基于本地/网络的文件系统操作。显然,其中许多在中间件方面做得最好,但在数据库系统中,有时候,直接与外部系统通信更方便,而不是依靠外部进程来轮询数据源来执行任务。这没有问题的如果在数据库或数据层中有一个这样的解决方案,并且不提供任何安全性问题时。

在这里,我们将尝试演示在Advanced Analytics Extension中使用Python的示例,显示数据库如何触发外部进程来对作为参数提供的数据执行活动。这是为了考虑安全性,数据可靠性和事务响应时间的问题。 

 

Python的用例

通过从SQL调用Python脚本而不是依赖于中间件,可以更容易地完成某些任务。特别是在数据库中事件发起任务的情况下。任务可能包括:

  1. 通过TCP / HTTP / SOAP向网络系统发送数据或从基于网络的系统接收数据。

  2. 利用本地平台资源,如文件系统,网络或GPU。

  3. 通过使用通用数据格式(如JSON,XML或YAML)构建一个或多个系统之间的实时集成。

  4. 通过与外部应用程序通信生成数据或文件。

当然,很少有潜在的缺点

  1. 如果您使用Python需要互联网访问,那么存在必须保持安全的数据可能会被意外地通过互联网共享的风险。任何互联网访问必须由网络仔细监管。

  2. 允许通过“启用外部脚本执行”在服务器上执行Python脚本来暴露安全风险。

  3. 相同服务器上的资源密集型Python脚本可能会影响大型OLTP系统上正在进行的事务的性能。

衡量这些优点和缺点,似乎有时候Python可以发挥有用的作用,如果可以最小化风险。作为一个例子,让我们考虑一下我们如何使用Python构建数据缓存系统供应用层使用。

 

缓存示例解决方案

缓存数据可以提高应用程序的性能。以缓存的存储开销为代价,当遇到与数据库的聊天网络通信以及数据库面临重复查询时资源消耗高的情况下,我们可以获得有用的性能提升。当我们构建缓存基础架构时,我们面临着什么时候刷新缓存的内容的常见问题。我们倾向于在一定时间间隔之后采用重建缓存的简单解决方案。然而,这是非常低效的。当数据更改时刷新缓存更好,只刷新改变的内容。在创建,更新或删除数据时,我们可以实时接近实时。有很多工具和框架可用于解决刷新问题,但是他们遇到如何确定数据发生了什么变化以及何时发生变化的问题。数据库是最好的所有能够做到这一点。

对于我们这里提供的缓存系统,我们将把自己限制在微软堆栈中,以防止Python本身。

Microsoft SQL Server 2017(CPT)

    服务代理隔离事务数据库

 Python执行脚本,可以通过HTTP更新缓存(Python 3.5可执行文件与Anaconda发行版中的库)

Net 4.5.2

            ASP.Net MVC为我们的示例Web UI

            ASP.Net WebAPI封装缓存存储为我们的示例解决方案。

以下是我们的示例解决方案缓存系统的图示:

 

所述WebApplication的提供用户接口来读取和更新数据。

我们示例缓存存储解决方案中的RESTful.Cache应用程序是使用ASP.Net WebAPI2构建的,其内容类型为JSON。HTTP-GET操作从本地缓存(静态集合)传送数据。

MS SQL Server 2017(CPT)是一个数据库服务器

TransDB OLTP数据库,处理事务繁忙。

Cacher执行Python脚本执行的代理数据库,启用了启用“外部脚本启用”选项的脚本执行。请参阅 Microsoft.Doc:启用外部脚本的服务器配置选项。

Service Broker是SQL服务器的可靠消息传递框架,有助于桥接 Cacher -Agent和 TransDB。可以处理 Cacher -Agent接收的消息来更新缓存。

Python是使用SQL 2017(CPT)的数据库系统的集成脚本语言。

解决方案的架构

在我们的解决方案中,我们将在RESTful.Cache应用程序中缓存实体“ 产品类型名称”,并且WebApplication将具有创建新产品类型条目并从RESTful.Cache读取的功能。

条件

除此之外,还有一些先决条件和一些我们需要考虑的信息。

SQL实例,其中CacheDB托管必须有“麻与Python茅根学习服务”安装

要在CacheDB中使用TSQL执行Python脚本,应运行SQL Service MSSQLLaunchpad或SQL Server Launchpad。请参阅Microsoft.Net:Microsoft机器学习服务

使用SP_Configure启用外部脚本执行,请参阅Microsoft.Doc:启用外部脚本的服务器配置选项


sp_configure 'external scripts enabled', 1;

  RECONFIGURE;

该TransDB和cacher的托管环境应该有它的实例创建Service Broker端点,如果这是在两个不同的SQL实例独立托管那么每个实例都应该有自己的端点。

该TransDB和cacher的数据库应该启用代理。请参阅Microsoft.Technet:如何:激活数据库中的Service Broker消息传递

 


ALTER DATABASE TransDB SET ENABLE_BROKER;

  GO

  ALTER DATABASE CacheDB SET ENABLE_BROKER;

  GO

.NET应用程序

该WebApplication的有两个主要的MVC行动; 一个使用HTTP动词POST 更新TransDB中的一个新实体,另一个使用HTTP动词GET从缓存返回产品类型列表的操作。

 

RESTful.Cache有两种操作方法,一种是使用HTTP动词POST 更新新添加的实体产品类型的缓存,另一种用于从本地缓存获取所有缓存的产品类型。

 

对于我们的示例解决方案,这两个应用程序都在IIS中托管在各个应用程序池标识下,以保护应用程序安全 但是对于实际的系统实现,托管环境可以是内部网或互联网环境中的单个Web服务器。

 

该RESTful.Cache授权规则只有两个服务帐户来处理HTTP请求,即

 

abc \ WebApp_SVC和abc \ CacherAgent_SVC。abc \ CacherAgent_SVC服务帐户允许SQL中的Python脚本通过HTTP到达应用程序来刷新缓存。

abc \ WebApp_SVC用户用于具有授权规则模式的WebApplication,以允许访问RESTful.Cache应用程序。

SQL数据库和服务代理

OLTP数据库TransDB有几个对象,包括表,存储过程和Service Broker对象。

 

为了我们的目的,UpdateProductType过程使用新记录更新ProductType表,AcknowledgeProductTypeCache过程是CacheIntegration队列的激活过程,当处理消息时即从Cacher数据库接收来自目标的确认。它还处理异常,如果有的话,并将其记录在CacheIntegrationError表中。

有关Service Broker的更多信息,请访问Microsoft.DOC:SQL Server Service Broker

 

对于我们的示例解决方案,TransDB是创建新的ProductType记录时创建更新缓存消息的源数据库,执行操作的消息,它具有UpdateMessage消息类型,CacheIntegration合同将CacheSource服务发送到目标数据库。该服务具有CacheQueue,由Service Broker组件用于执行可靠的消息传递。该ToCacheTarget路由具有信息传递消息到它的目标。

为了消除任何增加事务处理时间的机会以及避免事务数据库中其余数据的任何安全风险,我们将通过使用我们的示例解决方案中名为Cacher数据库的代理数据库来解除缓存更新过程。Service Broker消息传递基础设施将有助于连接TransDB和Cacher数据库,基于事件的消息处理将使我们能够更新驻留在基于网络的系统上的缓存存储。该cacher的数据库是打在订单的最新消息到达时进行缓存刷新代理的角色。它通过执行Python脚本更新缓存。

 

 

Cacher数据库具有:

CacheLog和CacheIntegration错误表,以跟踪缓存何时被刷新,并且具有在缓存刷新过程中可能发生的任何错误的记录。

所述PerformCacheUpdate过程从接收传入消息TransDB通过服务代理。如果消息的类型是UpdateMessage,那么它将执行另一个过程UpdateWebCache,执行Python脚本执行。

该UpdateWebCache程序的执行结果被在于然后获取插入在表变量保持CacheLog在消息对话结束表。

当接收到的消息具有错误或结束消息类型时,过程也会结束对话,并且在错误类型上,将异常日志写入CacheIntegrationErro r表中。

该UpdateWebCache程序提取标识和名称,从作为参数传递传入的XML消息,并在Python脚本文本嵌入这些值。脚本执行结果集是类型为UpddateCacheLog的结构化表。

 

 

该cacher的的服务代理对象,主要是UpdateMessage消息类型和CacheIntegration合同是相同的TransDB,CacheQueue有一个称为激活过程,PerfomCacheUpdate,一个叫服务CacheTarget和路线大约有信息TransDB的服务CacheService和端点地址。

对于我们的示例解决方案,数据库队列的最大队列读取器设置为1。如果需要,可以增加这一点,例如,如果数据修改很高,并且您需要增加缓存刷新率。

服务代理端点

对于我们的解决方案,数据库托管在同一个实例上,因此两者都使用相同的Service Broker Endpoint来发送和接收消息。

 

但是,如果我们要在单个实例上托管数据库,那么每个SQL实例的服务帐户都应该有一个Service Broker端点。并且这两个SQL实例都应该有权限允许将消息发送到对方的端点。连接的授权和授予可以通过以下TSQL命令集完成。请注意,在消息传递基础结构中,有一个发送方,另一方是接收方,正如所提到的,如果SQL实例是发送方和接收方的一部分,则每个实例都应该有自己的进程标识。下图显示了每个SQL Server在其自身身份下运行的方式。

 

这是用于在Cacher数据库的SQL实例中授权和授予端点连接到TransDB的SQL实例服务帐户[identity]的SQL代码。


ALTER AUTHORIZATION ON ENDPOINT::ServiceBrokerEndpoint TO [abc\TransDB_SVC]

  GO

  GRANT CONNECT ON ENDPOINT::ServiceBrokerEndpoint TO [abc\TransDB_SVC]

  GO

类似地,这里是用于授权和授予端点连接到Cache的SQL实例服务帐户[Identity]的代码,在TransDB数据库的SQL实例中。


ALTER AUTHORIZATION ON ENDPOINT::ServiceBrokerEndpoint TO [abc\CacherAgent_SVC]

  GO

  GRANT CONNECT ON ENDPOINT::ServiceBrokerEndpoint TO [abc\CacherAgent_SVC]

  GO

Python脚本

这是Python脚本文本,在TSQL变量@UpdateCache中保存为字符串。它具有具有逻辑的UpdateCache方法,通过传递具有作为输入参数接收的Name和Id字段的数据对象来对RESTful.Cache执行HTTP POST调用。它接收一个JSON对象,并将其作为方法的输出结果返回给调用者。

在脚本结束时,返回的对象被转换为数组,因此可以将其结构化为SQL结果。


DECLARE @UpdateCache NVARCHAR(MAX) = N'

import pandas as PND #data structure package

def UpdateCache(name,id):

  import requests as HTTP #http request package

  #Perfom HTTP POST to update cache

  httpRequest = HTTP.post( http://localhost/RESTful.Cache/ProductType/UpdateCache ,{ Name :name, Id :id})

  cacheLog = httpRequest.json()

  return cacheLog

 

#Update cache and build log element

log = [UpdateCache( '+ @Name+' ,'+ CAST(@Id as VARCHAR(10)) +')]

#Return data frame i.e. table structure from SQL

OutputDataSet = PND.DataFrame(data=log)

';

在SQL Server中使用Python脚本时,有一些值得注意的事情。

我们可以编写一个连续的脚本或将它们分组到我们在这个解决方案中所做的方法中。或者,我们可以创建一个内联类或创建一个包,并在命令提示符下使用PIP命令在python中导入它们。

在这个MST的CPT版本中,import语句只能在它放置的范围内导入包,因此我们可以注意到ImportCache中存在导入请求import语句,并且import语句导入熊猫存在于脚本的顶部在脚本的最后。

方法UpdateCache的输出对象立即转换为数组,这样pandas.DataFrame可以将对象转换成数据结构,SQL Server可以轻松地将其解释为具有行和列的表。

分配给OutputDataSet对象的数据结构在SQL Server的TSQL执行上下文中可用。

最后一行程序dbo。UpdateWebCache,WITH RESULT SETS(AS TYPE dbo.UpdateCacheLog); 具有用户定义的表类型dbo.UpdateCacheLog,它有助于保持底层列的顺序,并避免在从接收的数据结构生成结果集的过程中发生任何不匹配。另一种方法是在Python和结果集中构建映射列结构。

数据库安全

TransDB是一个OLTP数据库,我们不希望对系统发生任何安全漏洞,因此,通过我们的示例解决方案,这种数据库可以托管在未安装“机器学习服务”的SQL实例上。Cacher是能够到达基于网络的系统的代理,因此可以保留在安装机器学习服务的SQL实例上。两个SQL实例都可以具有单独的服务帐户身份,该身份已被授权仅连接到特定端口的Service Broker端点。安全认证通信的另一种方法是使用证书。对于Service Broker端点授权,请参阅Microsoft.Technet:如何:通过使用证书允许服务代理程序网络访问(Transact-SQL) 更多细节。

所有组件放在一起

放置所有组件后,我们的WebApplication允许我们创建一个新的ProductType,并通过RESTful HTTP调用从刷新的缓存中列出相同的产品类型。在墙后面有管理数据的组件,高速缓存对前端应用程序是不可见的。

 

结论

诸如电子商务,医疗电子治理等应用可以从良好的缓存实现中受益。通过扩展我们熟悉的技术的使用,我们可以获得易于维护的解决方案,而无需学习新框架或功能的成本。

我们的示例解决方案符合我们所需要的

当通过其中一个OLTP事务创建或修改数据时,系统刷新基于网络的缓存系统进行读取访问。

它能够使用异步事件来刷新缓存,靠近实时。这不会影响原始交易的表现。

它可以通过HTTP在事务和缓存系统之间绘制一条安全线,以保持数据在OLTP数据库中的安全。

它具有最小的监控功能; 一个缓存日志和异常日志,可以进一步加强构建管理控制台。

使用Service Broker消息组件,解决方案足够灵活,可以在异步消息处理发生时触发或到达基于网络的系统。换句话说,数据库与SQL Service Broker消息集成在一起,并且基于接收到的数据,执行一个动作来获取或发送数据到外部数据层以外的系统。

通过使用服务代理消息隔离外部系统触发专用数据库内的事件有助于保护OLTP数据库的事务和数据。 

(本帖转译于Hitendra Patel2017年8月04日发布于redgote 枢纽上的帖子:Python和SQL Server 2017的强大功能

  地址链接:https://www.scarydba.com/2017/06/20/database-fundamentals-3-whats-database/)

原文地址:http://www.cnblogs.com/fenglianchen/p/7670328.html


.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/323029.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring中的Bean配置、属性配置、装配内容详细叙述

文章目录1、Bean的配置1.1、配置方式2、Bean的实例化2.1、构造器实例化2.2、静态工厂方式实例化2.3、实例工厂方式实例化3、Bean的作用域3.1、作用域的种类4、Bean的生命周期5、Bean的装配方式5.1、基于XML的装配5.2、基于Annotation的装配5.3、自动装配1、Bean的配置 1.1、配…

Hadoop入门(六)Mapreduce

一、Mapreduce概述 MapReduce是一个编程模型,用以进行大数据量的计算 二、Hadoop MapReduce (1)MapReduce是什么 Hadoop MapReduce是一个软件框架,基于该框架能够容易地编写应用程序,这些应用程序能够运行在由上千个…

github详细搜索

in:name vue in:description 爬虫 stars:>1000 language:JavaScript

jzoj2941-贿赂【数学期望,dfs】

正题 题目大意 nnn个人,有投票几率aia_iai​和级别bib_ibi​,kkk个糖,每个可以让一个官员增加0.10.10.1的投票几率。 然后如果有超过一半的人投你,你就可以成功。 不然成功概率就是A/(A∑i∈Sbi)A/(A\sum^{i\in S}b_i)A/(A∑i∈S​…

Ocelot API网关的实现剖析

在微软Tech Summit 2017 大会上和大家分享了一门课程《.NET Core 在腾讯财付通的企业级应用开发实践》,其中重点是基于ASP.NET Core打造可扩展的高性能企业级API网关,以开源的API网关Ocelot为基础结合自己的业务特性,当天课程只有40分钟&…

Hadoop入门(十二)Intellij IDEA远程向hadoop集群提交mapreduce作业

Intellij IDEA远程向hadoop集群提交mapreduce作业,需要依赖到hadoop的库,hadoop集群的配置信息,还有本地项目的jar包。 一、软件环境 (1)window本地安装hadoop软件 首先将集群上的hadoop环境下载到本地,…

接口测试(备用)

音乐地址 http://k1998.xyz/php/public/index.php/index/music/lists 随机一个段子 https://autumnfish.cn/api/joke/list 随机十条段子(数字10可更改) https://autumnfish.cn/api/joke/list?num10

Spring AOP知识点简介

文章目录1、什么是AOP1.1、AOP术语1.2、AOP框架2、动态代理2.1、JDK动态代理2.2、CGLIB动态代理3、基于代理类的AOP实现3.1、Spring的通知类型3.2、ProxyFactoryBean4、AspectJ开发4.1、基于XML的声明式AspectJ4.2、基于注解的声明式AspectJ1、什么是AOP 面向切面编程&#xf…

jzoj2940-生成输入数据【最小生成树,并查集】

正题 题目大意 给一个完全图的唯一一颗最小生成树,求完全图最小边权之和。 解题思路 我们考虑在计算最小生成树的时候,将两个联通块合并时,我们会选择连接这两个联通块的最小的边。 那么我们就可以让每个联通块合并时,让其他边都…

SQL2017 Azure SQL新功能:图形数据库

图形数据库是什么呢?如果从字面理解是进行图形处理的数据库,那么你就错了哈哈。 我们先来解释什么是图形数据库。 图形数据库是NoSQL数据库的一种类型,它应用图形理论存储实体之间的关系信息。最常见的例子,就是社会网络中人与人之…

git创建tag标签

创建标签 添加tag git tag v1.0 查看所有的tag版本 git tag 后可加-m添加注释 这时只能在本地可以看到自己新建Tag,在远程中央仓库中还是看不到在Tags下有如何内容,因为我们还没把它推送到中央仓库上 推送到远端 git push origin v1.0 如果没有和远程没…

idea中XML注释与取消注释快捷键

IntelliJ IDEA和eclipse中编辑Java文件时,注释和取消注释的快捷键都是: "CTRL / " 编辑xml文件时, 注释:CTRL SHIFT / 取消注释:CTRL SHIFT \

Hadoop入门(十三)远程提交wordCout程序到hadoop集群

一、项目结构 用到的文件有WordCount.java、core-site.xml、mapreduce-site.xml、yarn-site.xml、log4j.properties、pom.xml 二、项目源码 (1)WordCount.java package com.mk.mapreduce;import org.apache.hadoop.conf.Configuration; import org.ap…

jzoj3771-小Z的烦恼【高精度,数学】

正题 题目大意 mmm个盒子&#xff0c; 当第iii个盒子中放了xxx&#xff0c;那么i1i1i1个盒子中就必须放2x2x2x&#xff08;i<mi<mi<m&#xff09;。 求1∼n1\sim n1∼n&#xff0c;mmm个盒子&#xff0c;求第一个盒子中可以放多少个 解题思路 1号盒子中的肯定越小越好…

腾讯云短信服务使用记录与.NET Core C#代码分享

1、即使是相同的短信签名与短信正文模板&#xff0c;也需要针对“国内文本短信”与“海外文本短信”分别申请。开始不知道&#xff0c;以为只要申请一次&#xff0c;给国外手机发短信时给api传对应的国家码就行&#xff0c;后来才发现需要分别申请。 2、短信服务web api响应“手…

Vue动画效果

.v-enter,.v-leave-to {opacity: 0;transform: rotateY(120deg);}.v-enter-active,.v-leave-active {transition: all 1s ease;}<transition><div v-cloak v-show"flag"><span classbadge>李白 </span><span idinput-size>善良之人啊&…

vue 安装教程

vue 安装教程在这里&#xff01;&#xff01;&#xff01;

Hadoop入门(九)Mapreduce高级shuffle之Combiner

一、Combiner的出现 &#xff08;1&#xff09;为什么需要进行Map规约操 作 在上述过程中&#xff0c;我们看到至少两个性能瓶颈&#xff1a; &#xff08;1&#xff09;如果我们有10亿个数据&#xff0c;Mapper会生成10亿个键值对在网络间进行传输&#xff0c;但如果我们只…

欢乐纪中某A组赛【2019.1.19】

前言 因为BBB有一堆(两道)题都做过&#xff0c;于是就来做A组了。 成绩 RankRankRank是有算别人的 RankRankRankPersonPersonPersonScoreScoreScoreAAABBBCCC3332017myself2017myself2017myself2102102101001001001001001001010102222222017lrz2017lrz2017lrz1001001000001001…

使用Identity Server 4建立Authorization Server (2)

第一部分: 使用Identity Server 4建立Authorization Server (1) 第一部分主要是建立了一个简单的Identity Server. 接下来继续: 建立Web Api项目 如图可以在同一个解决方案下建立一个web api项目: (可选)然后修改webapi的launchSettings.json, 我习惯使用控制台, 所以把IISExpr…