專案小記:解決sqlserver直接呼叫外部程式速度慢
阿新 • • 發佈:2021-01-04
【遇到的問題】:
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 %2等就是sqlserver中傳入的值
- 傳來的值寫到TMP檔案中
目的:
目的是在task資料夾中記錄所有插入的資料特徵。%4是記錄資料條數的,這個值是為了在java程式中判定這條TMP檔案是否符合打包條件,不符合就會刪除。(java原始碼的邏輯在這不敘述,以後想寫得話會拿出來寫)
TMP檔案:
實現原理:
此時,task資料夾成了一個佇列,先進先出(資料夾如果按時間順序排列得話),之前做的windows服務,每隔幾秒去查一次task資料夾,有記錄就進行判斷、打包、上傳、刪除記錄等操作,沒有記錄就進行下一次休眠繼續等待。
改進:
這樣就不用在sqlserver中等待程式完成,而是由序列狀態變成了併發的狀態,sqlserver記錄插入的資料特徵,win服務查詢task資料夾去進行後續操作。時間會變快很多,並且支援多個數據同時插入資料庫,但是空間上,win服務永遠佔用部分記憶體。
【打包windows服務或者exe】:
見下一章。