Блокировка файла VSAM при записи в него с использованием Java JDBC

Это моя первая попытка чтения и записи в файл VSAM. То, что я сделал, было:

  1. Создана карта для файла с помощью VSE Navigator
  2. Добавлена ​​библиотека VSE Connector для Java-компонентов в мой Java-проект Eclipse.
  3. Используйте приведенный ниже код для записи и чтения в файл KSDS.

Чтение файла не является проблемой, но когда я пытаюсь записать файл, он работает, только если я захожу на мэйнфрейм и закрываю файл перед запуском моей java-программы, но он блокирует файл примерно на час. Вы не можете открыть файл на мэйнфрейме или сделать что-нибудь с ним.

Любой может помочь с этой проблемой. Есть ли особые настройки, которые мне нужно установить для файла на мэйнфрейме? Почему вам сначала нужно закрыть файл на CICS, чтобы иметь возможность записи в него? И почему он блокирует файл после записи в него?

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.sql.*;
public class testVSAM {

public static void main(String argv[]){
    Integer test = Integer.valueOf(2893);
    String vsamCatalog = "VSESP.USER.CATALOG";
    String FlightCluster = "FLIGHT.ORDERING.FLIGHTS";       
    String FlightMapName = "FLIGHT.TEST2.MAP";
    try{

        String ipAddr = "10.1.1.1";                     
        String userID = "USER1";            
        String password = "PASSWORD"; 

        java.sql.Connection jdbcCon;            
        java.sql.Driver jdbcDriver = (java.sql.Driver) Class.forName(
        "com.ibm.vse.jdbc.VsamJdbcDriver").newInstance();
        // Build the URL to use to connect
        String url = "jdbc:vsam:"+ipAddr;
        // Assign properties for the driver
        java.util.Properties prop = new java.util.Properties();
        prop.put("port", test);
        prop.put("user", userID);
        prop.put("password", password);
        // Connect to the driver
        jdbcCon = DriverManager.getConnection(url,prop);

        try {
            java.sql.PreparedStatement pstmt = jdbcCon.prepareStatement(
            "INSERT INTO "+vsamCatalog+"\\"+FlightCluster+"\\"+FlightMapName+
            " (RS_SERIAL1,RS_SERIAL2,RS_QTY1,RS_QTY2,RS_UPDATE,RS_UPTIME,RS_EMPNO,RS_PRINTFLAG,"+
            "RS_PART_S,RS_PART_IN_A_P,RS_FILLER)"+" VALUES(?,?,?,?,?,?,?,?,?,?,?)");
            //pstmt.setString(1, "12345678901234567890123003");
            pstmt.setString(1, "1234567890");
            pstmt.setString(2,"1234567890123");
            pstmt.setInt(3,00);
            pstmt.setInt(4,003);
            pstmt.setString(5,"151209");
            pstmt.setString(6, "094435");
            pstmt.setString(7,"09932");
            pstmt.setString(8,"P");
            pstmt.setString(9,"Y");
            pstmt.setString(10,"Y");
            pstmt.setString(11," ");
            // Execute the query
            int num = pstmt.executeUpdate();
            System.out.println(num);
            pstmt.close();

            }
            catch (SQLException t)
            {

                System.out.println(t.toString());                       
            } 

        try
        {
        // Get a statement
        java.sql.Statement stmt = jdbcCon.createStatement();
        // Execute the query ...
        java.sql.ResultSet rs = stmt.executeQuery(
        "SELECT * FROM "+vsamCatalog+"\\"+FlightCluster+"\\"+FlightMapName);

        while (rs.next())
        {                                           
        System.out.println(rs.getString("RS_SERIAL1") +  " " + rs.getString("RS_SERIAL2")+  " " + rs.getString("RS_UPTIME")+ " " + rs.getString("RS_UPDATE"));
        }
        rs.close();
        stmt.close();
        }
        catch (SQLException t)
        {

        } 
    }
    catch (Exception e)
    {
        // do something appropriate with the exception, *at least*:
        e.printStackTrace();
    } 

}

}

Примечание: ОС z/VSE

2 ответа

Короткий ответ на ваш первоначальный вопрос: KSDS VSAM не является СУБД.

Как вы обнаружили, вы можете определить файл VSAM так, чтобы вы могли обновлять его как из пакета, так и из CICS, но, как указывает @BillWoodger, вы должны сами сериализовать свои обновления.

Другой подход заключается в том, чтобы делать все обновления из региона CICS, и чтобы ваше приложение Java отправляло сообщение REST, SOAP или MQ в CICS для запроса своих обновлений. Для этого требуется наличие программы CICS, чтобы перехватывать запросы из приложения Java и выполнять обновления.

Мэйнфрейм IBM в z/VSE имеет разные разделы, которые выполняют разные задания. Например, раздел F7 CICS, раздел F8 Batch Jobs, ETC.

Когда вы определяете новый файл VSAM, вы должны установить SHAREOPTIONS этого файла. Когда я определяю файл, я устанавливаю SHAREOPTIONS (2 3). 2 Означает, что только один раздел может записывать в файл.

Поэтому, когда пакетная программа (в другом разделе, чем раздел CICS), вызываемая из Java, пыталась записать в файл, она не смогла записать в файл, если сначала я не закрою файл в CICS.

Чтобы исправить это, Я ПЕРЕСМОТРЕЛ файл CICS с помощью SHAREOPTIONS (4 3). 4 Означает, что на него могут записываться несколько разделов мэйнфрейма. Исправление проблемы

Ниже приведена часть кода определения, где вы устанавливаете SHAREOPTION:

* $$ JOB JNM=DEFFI,CLASS=9,DISP=D,PRI=9         
* $$ LST CLASS=X,DISP=H,PRI=2,REMOTE=0,USER=JAVI
// JOB DEFFI                                    
// EXEC IDCAMS,SIZE=AUTO                                                         
DEFINE  CLUSTER -                            
          ( -                                
          NAME (FLIGHT.ORDERING.FLIGHTS) -  
          RECORDS (2000 1000) -              
          INDEXED -                          
          KEYS (26 0) -                      
          RECORDSIZE (128 128) -             
          SHAREOPTIONS (4 3) -               
          VOLUMES (SYSWKE) -                 
          ) -                                
          .
          .  
          .              
Другие вопросы по тегам