1. 程式人生 > 其它 >專案小記:解決sqlserver直接呼叫外部程式速度慢

專案小記:解決sqlserver直接呼叫外部程式速度慢

技術標籤:sqlserver觸發器

【遇到的問題】:

sqlserver觸發器去觸發程式需要一段時間,另外每次去訪問區域網的共享資料夾也要時間,再加上程式本身打包的時間,導致整個專案時耗不理想。
(導師聯絡公司把系統給換了,可以不用共享檔案夾了)

【解決方案】:

用空間換時間,java程式打包成windows服務,藏在後臺永遠執行。

USE [gjdb]
GO
/****** Object:  Trigger [dbo].[qx_trigger]    Script Date: 2020/12/30 19:02:52 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER TRIGGER [
dbo].[qx_trigger] ON [dbo].[Sysj_QX] after insert AS BEGIN declare @Sum int ,@Result varchar(100) ,@Result2 varchar(100),@Recid varchar(50),@Wtbh varchar(50) ,@Csylb varchar(50) ,@Zh varchar(50) select @Recid=Recid from inserted select @Sum=COUNT(*) from Sysj_QX where Recid=@Recid Select @Wtbh=
wtbh,@Csylb=csylb,@Zh=zh from SYSJ where RECID=@Recid set @Result = 'D:\WL1024\autoUpload\start.bat'+' '[email protected]+' '[email protected]+' '[email protected]+' '+cast(@Sum as varchar) EXEC master..xp_cmdshell @Result SET NOCOUNT ON; END

觸發器改成不直接觸發exe程式,而是觸發一個bat檔案,這個檔案createTMP.bat中寫:

@echo off 
echo %1,%2,%3,%4 > D:\WL1024\autoUpload\task\%1_%2_%3_%4.tmp
  1. %1 %2等就是sqlserver中傳入的值
  2. 傳來的值寫到TMP檔案中
目的:

目的是在task資料夾中記錄所有插入的資料特徵。%4是記錄資料條數的,這個值是為了在java程式中判定這條TMP檔案是否符合打包條件,不符合就會刪除。(java原始碼的邏輯在這不敘述,以後想寫得話會拿出來寫)

TMP檔案:

在這裡插入圖片描述

實現原理:

此時,task資料夾成了一個佇列,先進先出(資料夾如果按時間順序排列得話),之前做的windows服務,每隔幾秒去查一次task資料夾,有記錄就進行判斷、打包、上傳、刪除記錄等操作,沒有記錄就進行下一次休眠繼續等待。

改進:

這樣就不用在sqlserver中等待程式完成,而是由序列狀態變成了併發的狀態,sqlserver記錄插入的資料特徵,win服務查詢task資料夾去進行後續操作。時間會變快很多,並且支援多個數據同時插入資料庫,但是空間上,win服務永遠佔用部分記憶體。

【打包windows服務或者exe】:

見下一章。