< All Topics
Print

Multiple PB Servers with a Shared SQL Server

Environment Structure: Multiple PB Servers with a Shared SQL Server

Environment Structure: Multiple PB Servers with a Shared SQL Server

Scenario Overview

This setup involves multiple PB Servers accessing a single shared SQL Server. This configuration is beneficial for managing distributed workloads while centralizing data storage and processing. Each PB Server relies on SQL Server stored procedures to handle operations consistently across all servers, preventing conflicts and ensuring efficient resource management.

In this environment, it’s essential to utilize several dedicated SQL stored procedures to manage IDs and transactions across the PB servers. This ensures that each server can generate unique identifiers and manage resources without data collision.

Environment Structure Diagram

The following diagram illustrates the connection between multiple PB servers and the shared SQL Server:

Environment Structure Diagram

Required SQL Stored Procedures

Below are the necessary SQL stored procedures used in this configuration, which are executed to generate unique identifiers across PB Servers:

1. Stored Procedure: sp_getnextjobid


USE [PrintBOS]
GO
-- Description: Get next job ID
CREATE PROCEDURE [dbo].[sp_getnextjobid] AS
BEGIN
    SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
    BEGIN TRANSACTION;
    BEGIN TRY
        DECLARE @result int;
        EXEC @result = sp_getapplock @Resource = 'getnextjobid', @LockMode = 'Exclusive', @DbPrincipal = 'dbo';
        IF @result = -3
            BEGIN
                -- Handle lock failure
                SELECT CAST(SUBSTRING(CAST(CAST(599266080000000000 + (864000000000 * CAST(GETDATE() AS FLOAT)) AS BIGINT) AS VARCHAR(20)), 10, 20) AS INT)
                ROLLBACK TRANSACTION;
            END
        ELSE
            BEGIN
                UPDATE AutoNumbers SET AutoNumbers.JobId = AutoNumbers.JobId + 1;
                SELECT AutoNumbers.JobId FROM AutoNumbers;
                COMMIT TRANSACTION;
            END
    END TRY
    BEGIN CATCH
        -- Handle error
    END CATCH
    EXEC @result = sp_releaseapplock @Resource = 'getnextjobid';
END
GO
    

2. Stored Procedure: sp_getnextadvpackid


USE [PrintBOS]
GO
-- Description: Get next advanced package ID
CREATE PROCEDURE [dbo].[sp_getnextadvpackid] AS
BEGIN
    SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
    BEGIN TRANSACTION;
    BEGIN TRY
        DECLARE @result int;
        EXEC @result = sp_getapplock @Resource = 'getnextadvpackid', @LockMode = 'Exclusive', @DbPrincipal = 'dbo';
        IF @result = -3
            BEGIN
                -- Handle lock failure
                SELECT CAST(SUBSTRING(CAST(CAST(599266080000000000 + (864000000000 * CAST(GETDATE() AS FLOAT)) AS BIGINT) AS VARCHAR(20)), 10, 20) AS INT)
                ROLLBACK TRANSACTION;
            END
        ELSE
            BEGIN
                UPDATE AutoNumbers SET AutoNumbers.AdvPackageId = AutoNumbers.AdvPackageId + 1;
                SELECT AutoNumbers.AdvPackageId FROM AutoNumbers;
                COMMIT TRANSACTION;
            END
    END TRY
    BEGIN CATCH
        -- Handle error
    END CATCH
    EXEC @result = sp_releaseapplock @Resource = 'getnextadvpackid';
END
GO
    

3. Stored Procedure: sp_getnextadvjobid


USE [PrintBOS]
GO
-- Description: Get next advanced job ID
CREATE PROCEDURE [dbo].[sp_getnextadvjobid] AS
BEGIN
    SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
    BEGIN TRANSACTION;
    BEGIN TRY
        DECLARE @result int;
        EXEC @result = sp_getapplock @Resource = 'getnextadvjobid', @LockMode = 'Exclusive', @DbPrincipal = 'dbo';
        IF @result = -3
            BEGIN
                -- Handle lock failure
                SELECT CAST(SUBSTRING(CAST(CAST(599266080000000000 + (864000000000 * CAST(GETDATE() AS FLOAT)) AS BIGINT) AS VARCHAR(20)), 10, 20) AS INT)
                ROLLBACK TRANSACTION;
            END
        ELSE
            BEGIN
                UPDATE AutoNumbers SET AutoNumbers.AdvJobId = AutoNumbers.AdvJobId + 1;
                SELECT AutoNumbers.AdvJobId FROM AutoNumbers;
                COMMIT TRANSACTION;
            END
    END TRY
    BEGIN CATCH
        -- Handle error
    END CATCH
    EXEC @result = sp_releaseapplock @Resource = 'getnextadvjobid';
END
GO
    

SQLite Configuration Parameters for PBAppParams.IDB

The following SQLite script configures necessary parameters in the file:PBAppParams.IDB

Script:


DELETE FROM SQL_PARAMS WHERE (SECTION_NAME_S255 = 'SQL' AND VALUE_NAME_S255 = '2001');
DELETE FROM SQL_PARAMS WHERE (SECTION_NAME_S255 = 'SQL' AND VALUE_NAME_S255 = '2002');
DELETE FROM SQL_PARAMS WHERE (SECTION_NAME_S255 = 'SQL' AND VALUE_NAME_S255 = '2037');
DELETE FROM SQL_PARAMS WHERE (SECTION_NAME_S255 = 'SQL' AND VALUE_NAME_S255 = '2038');
DELETE FROM SQL_PARAMS WHERE (SECTION_NAME_S255 = 'SQL' AND VALUE_NAME_S255 = '2040');
DELETE FROM SQL_PARAMS WHERE (SECTION_NAME_S255 = 'SQL' AND VALUE_NAME_S255 = '2041');

INSERT INTO SQL_PARAMS (SECTION_NAME_S255, VALUE_NAME_S255, VALUE_S2048) VALUES ('SQL', '2001', NULL);
INSERT INTO SQL_PARAMS (SECTION_NAME_S255, VALUE_NAME_S255, VALUE_S2048) VALUES ('SQL', '2002', 'EXEC |QUOTE_S||SCHEMA_NAME||QUOTE_E|.|QUOTE_S|sp_getnextjobid|QUOTE_E|');
INSERT INTO SQL_PARAMS (SECTION_NAME_S255, VALUE_NAME_S255, VALUE_S2048) VALUES ('SQL', '2037', NULL);
INSERT INTO SQL_PARAMS (SECTION_NAME_S255, VALUE_NAME_S255, VALUE_S2048) VALUES ('SQL', '2038', 'EXEC |QUOTE_S||SCHEMA_NAME||QUOTE_E|.|QUOTE_S|sp_getnextadvjobid|QUOTE_E|');
INSERT INTO SQL_PARAMS (SECTION_NAME_S255, VALUE_NAME_S255, VALUE_S2048) VALUES ('SQL', '2040', NULL);
INSERT INTO SQL_PARAMS (SECTION_NAME_S255, VALUE_NAME_S255, VALUE_S2048) VALUES ('SQL', '2041', 'EXEC |QUOTE_S||SCHEMA_NAME||QUOTE_E|.|QUOTE_S|sp_getnextadvpackid|QUOTE_E|');
    

Conclusion

By structuring the environment with multiple PB Servers accessing a shared SQL Server and utilizing dedicated stored procedures, you can ensure consistent ID generation and efficient resource management. This setup reduces data conflicts and centralizes key operations, making it ideal for distributed workloads.

תוכן עיניינים