工业实时数据库的SQL异步查询
SQL异步查询
紫金桥跨平台实时数据库提供了对关系型数据库的异步查询机制,防止当发生查询数据量过大或关系库所在主机网络故障等需要较长时间才能返回结果的情况时,引起的DB、VIEW和WEB客户端进程阻塞。使用SQL异步查询,在发出查询请求后,主进程不会等待查询结果返回,不会影响到任何数据刷新、动画以及脚本的执行。
- SQL异步查询机制详解
SQL异步查询机制的相关名词解释:
异步查询:发起查询请求后,发起请求的进程并不等待查询结果返回而继续执行其他任务,查询返回的结果由回调函数处理。
回调函数:用于处理异步查询返回结果的函数。当异步查询的结果返回时,执行回调函数的函数体中的脚本。
SqlAsyn:SQL异步查询服务程序,用于处理异步查询事务。该服务程序可独立部署,与DB/VIEW/WEB Client以远程TCP的方式连接,支持多点并发访问。
SQL异步查询的使用流程如下:
(1)建立SQL异步查询对象(定义要访问的关系数据库)。
(2)编写处理查询结果或返回值的回调函数。
(3)在数据库/画面下编写执行SQL异步查询的脚本。
(4)在工程启动项中勾选SQL异步查询服务程序SqlAsyn,运行工程。
SQL异步查询的执行逻辑:
(1)数据库/画面发起关系库的异步查询请求,请求发送给SQL异步查询服务程序SqlAsyn,数据库/画面继续执行其他任务,不等待查询结果。
(2)SQL异步服务程序执行关系库查询。
(3)查询结果返回,执行预定义的回调函数。
SQL异步查询的执行逻辑示意图如下:
图1 SQL异步查询执行逻辑示意图
- 配置并使用SQL异步查询
紫金桥®跨平台实时数据库的数据库和客户端均支持SQL异步查询,可根据实际情况调整执行异步查询的位置。数据库和客户端下的SQL异步查询使用方法相同,对象名称、说明以及关系库数据源等也互不影响,但无法交叉调用,即数据库下的脚本区域无法使用在画面下建立的SQL异步查询对象,画面脚本区域同理。
下面以画面区域,查询Sqlite关系库中SqlTab表的全部数据为例,介绍如何配置并使用SQL异步查询。软件同时提供了相应的工程示例,位于IDE-画面-小示例-内置SQL-关系库异步查询示例,可参考工程示例同步阅读本章内容。
定义SQL异步查询对象:
在紫金桥®跨平台实时数据库的开发界面中,切换至“画面”选项卡,点击左侧导航树中的“SQL异步查询”,进入SQL异步查询设置画面:
图2 SQL异步查询设置画面
点击选择“新建”项,弹出新建窗口,如下图:
图3 新建SQL异步查询对象
输入名称后点击“确定”创建SQL异步查询对象,自动打开该对象详细配置信息画面,如下图:
图4 SQL异步查询对象配置画面
说明:该SQL异步查询对象的描述信息,可当做备注。
数据源描述:关系数据库的连接字符串,点击右侧按钮可使用输入向导辅助生成连接字符串。
远程服务:设置该SQL异步查询对象是否指向远程服务。
地址:远程服务程序所在设备的IP地址。
端口:远程服务程序设置的端口号。
以上配置完成后,就可以使用创建的SQL异步查询对象进行查询。本说明使用的对象名称为SqlAsyn1,连接信息如下:
图5 SQL异步查询对象SqlAsyn1的连接信息
窗口组态:
新建用于查询的窗口win_DayTab,在窗口中绘制用于显示查询结果的表格Table。
定义回调函数:
定义用于处理SQL异步查询返回结果的回调函数,根据作用域选择自定义函数的定义位置。若在数据库区域下使用SQL异步查询,则定义数据库自定义函数;若在画面全局脚本中使用,则定义画面全局自定义函数。本说明的查询位于窗口win_DayTab中,则使用窗口自定义函数。新建窗口自定义函数Fun_callback作为查询的回调函数,配置如下:
图6 窗口回调函数的配置
示例中要进行的关系库查询为查询Mysql关系库中tjrep表的全部数据,定义的回调函数中函数参数需要为传地址方式的ObTable类型的对象,用于存放查询返回的结果。函数体中输入Table.Set(Tab),当查询的结果返回时会触发此脚本,向窗口中的表格Table设置数据。
组态查询脚本:
回到窗口win_DayTab,在窗口中绘制用于发起异步查询的按钮,在按钮中的脚本如下:
图7 异步查询脚本
在按钮按下脚本中输入文本:
SqlAsyn1.Query("select InTime,sBatch,RecipeName,Abang,A1real,Bbang,B1real,B2real,B3real,B4real,B5real,Cbang,C1real,C2real,C3real,C4real,Dbang,D1real,D2real,D3real,D4real,D5real,D6real,Ebang,E1real,E2real,E3real,E4real,CurGroup,Curuser from tjrep where InTime>='" +t1+"' and InTime <='"+t2+"'"+cmd+" order by InTime",Fun_callback)
当点击此按钮时,会通过已设置的SQL异步查询对象SqlAsyn1进行关系库查询,查询的SQL语句为"Select * from SqlTab",即查询SqlTab表中的全部数据,待SQL异步查询服务程序SqlAsyn查询完成后,结果返回至回调函数Func_SetTable,执行函数体中的脚本,查询的数据会显示在窗口的表格中。
- SqlAsyn服务程序
在紫金桥®跨平台实时数据库的开发界面的启动设置中,勾选“SQL服务”,运行工程后即可自动启动SqlAsyn服务程序,程序的界面如下:
图8 SqlAsyn服务程序界面
文件:设置SqlAsyn服务程序的运行属性,点击文件-设置,弹出运行模式对话框:
图9 SqlAsyn服务程序设置对话框
启用网络服务:是否启用TCP网络服务,勾选后SqlAsyn服务程序支持远程连接。
端口:SqlAsyn服务程序的TCP监听端口。
客户数:已连接到SqlAsyn服务程序的客户端数量。
请求次数:客户端发起SQL查询请求的数量总和。
响应次数:SqlAsyn服务程序响应SQL查询的数量总和。
注:若请求次数大于响应次数,则表示SQL查询压力过大或与关系库的通讯不稳定。
监视报文:勾选后,会在下方的监视列表中显示监视信息。监视信息分为三部分,从上至下依次为:查询对象状态信息、查询请求流水信息和实时库(DB)连接状态信息。
Sql异步查询对象状态信息:每行表示一个SQL查询连接,显示查询连接的来源、对象名称、请求次数和响应次数等统计信息。
注:多个源访问同一个文件类型的关系型数据库(例如Access和SqLite)时,共用一个连接,防止并发访问导致死锁。
查询请求流水信息:每次处理查询请求会产生一个查询流水信息。
实时库(DB)连接信息:显示与此异步查询程序的DB进行通讯的连接状态。
监视报文行数:各项监视信息的最大显示行数,此监控信息刷新较占用系统资源,可根据计算机性能设置合适的显示行数。
- SQL异步查询的使用建议及注意事项
(1)SQL异步查询时,与关系库通讯的连接和断开均由SqlAsyn自动处理,在脚本中只需编写要使用的SQL语句即可。
(2)与关系库的通讯速度受到硬件性能、网络状况、关系库表结构、表数据量以及查询的SQL语句编写等很多因素影响,虽然异步查询模式避免了实时数据库DB、VIEW和WEB等主进程卡顿,但可能仍然存在查询压力过大导致查询结果不会按需返回,在调试时可观察SqlAsyn的监视报文,当查询请求次数大于响应次数时则表示查询压力过大,建议通过降低查询频率或建立关系库表索引等方式,保证每次请求都能够返回结果。
(3)一个SqlAsyn程序可同时为多个DB提供查询服务。SqlAsyn本身为多线程运行,当SqlAsyn对同一个关系库有多项并发查询请求时(源DB、查询的库名和表名三项为唯一源),每一个源均会使用独立的线程进行查询,此时要根据实际情况合理地设置关系库的并发访问数量和异步查询
(4)异步查询使用到的回调函数建议已最小作用域为原则,若查询返回的结果在窗口使用,则相应使用窗口变量和自定义函数。
- SQL异步查询的函数
(1)SQL异步查询时,与关系库通讯的连接和断开均由SqlAsyn自动处理,在脚本中只需编写要使用的SQL语句即可。
函数定义
bool Query(string SelectString, func CallBack)
说明:向指定的数据源发出数据查询请求,异步返回结果。结果返回时调用回调函数CallBack,回调函数需带有ObTable参数。
bool Insert(string TableName, obtable Table, func CallBack)
说明:将指定数据表的内容插入到关系数据库中。数据表支持多行,列数应与关系数据库中的表一致,回调函数需带有String参数。
bool Update(string TableName, obtable Table, string Where, func CallBack)
说明:按照数据表第一行内容更新符合条件的记录,回调函数需带有String参数。
bool Delete(string TableName, string Where, func CallBack)
说明:删除指定条件的记录,回调函数需带有String参数。
bool ExecNoRet(string SqlCommand, func CallBack)
说明:执行无返回记录集的SQL命令,如建表、插入、更新和删除等SQL命令,回调函数需带有String参数。
QQ 953408511 ;VX:13564399432
工业实时数据库的SQL异步查询相关推荐
- 【EFCORE笔记】异步查询工作原理注释标记
异步查询 当在远程数据库中执行查询时,同步查询可能会阻止当前线程,异步查询可避免阻止线程,这有助于避免冻结户端界面, 异步操作还可以增加 Web 应用程序的吞吐量,可以在数据库操作完成前释放线程去处理 ...
- php异步查询数据库,php中mysql数据库异步查询实现
问题 通常一个web应用的性能瓶颈在数据库.因为,通常情况下php中mysql查询是串行的.也就是说,如果指定两条sql语句时,第二条sql语句会等到第一条sql语句执行完毕再去执行.这个时候,如果执 ...
- java异步处理同步化_java 异步查询转同步多种实现方式:循环等待,CountDownLatch,Spring EventListener,超时处理和空循环性能优化...
异步转同步 业务需求 有些接口查询反馈结果是异步返回的,无法立刻获取查询结果. 正常处理逻辑 触发异步操作,然后传递一个唯一标识. 等到异步结果返回,根据传入的唯一标识,匹配此次结果. 如何转换为同步 ...
- MySQL 异步查询提高查询速度
本文解决什么问题 什么是 MySQL 异步查询 MySQL 异步查询的优缺点 一个例子 异步查询功能 MySQLi 扩展提供了异步查询功能,需要使用 mysqlnd ( MySQL Native Dr ...
- oracle图书操作、sql语句查询+授权、视图、索引、表操作
oracle图书操作.sql语句查询+授权.视图.索引.表操作 一.创建一张表book,表结构为(总编号,分类号,书名,作者,出版单位,单价),插入若干记录 二.创建一张表reader,表结构为(借书 ...
- HIVE:窗口函数,用sql语句查询MySQL安装路径和版本
数据大师: Jmx's Blog | Keep it Simple and Stupid! 猴子 - 知乎公众号(猴子数据分析)著有畅销书<数据分析思维>科普中国专家 回答数 647,获得 ...
- 数据库 ----- 实验三:SQL的查询
实验三 SQL的查询 [实验目的和要求] 1.掌握SQL Server Management Studio中SQL 查询操作: 2.掌握SQL 的单表查询命令: 3.掌握SQL 的连接查询操作: 4. ...
- sql子查询示例_SQL更新查询示例说明
sql子查询示例 In this article, we're going to learn how to use the SQL update statement - what it is, wha ...
- R语言构建仿真数据库(sqlite)并使用dplyr语法和SQL语法查询数据库、将dplyr语法查询语句翻译为SQL查询语句
R语言构建仿真数据库(sqlite)并使用dplyr语法和SQL语法查询数据库.将dplyr语法查询语句翻译为SQL查询语句 目录
最新文章
- JAVA事物API JTA
- matlab-代数方程
- 转移操作主机角色至Windows Server 2012 R2
- PHP 在 Nginx 下主动断开连接 Connection Close 与 ignore_user_abort 后台运行
- C++ Primer 5th笔记(chap 19 特殊工具与技术)将成员函数用作可调用对象
- 使用事务码DBCO实现SAP链接外部数据库以及读取例程
- NVIDIA 显卡与 CUDA 在深度学习中的应用
- 3.12 - Tuples in Python
- Dev--Config Files
- jquery easyui
- 调试错误解决方案之VC++
- 域中计算机改名,找不到网络路径,电脑加域失败提示”找不到网络路径”的解决办法...
- 有助于理解分辨率、帧率、压缩率、码率和视频大小的关系式
- 小米手机更改 MIUI 内测机制,每周必须提交 Bug
- tweepy抓取Twitter数据
- 软件测试,软件测试练习题
- OPPO折叠屏发布后,外媒把“矛头”对准三星,Find N和Fold 3哪个好?
- Cisco路由器进行ip限速的配置方法
- 易课寄在线购课系统开发笔记(二十九)--完成用户登录功能
- 教育培训行业如何通过拼团活动拉新引流、裂变