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

Я впервые пытаюсь читать и писать в файл VSAM. Я сделал следующее:

  1. Создал карту для файла с помощью VSE Navigator
  2. В мой проект Java eclipse добавлена ​​библиотека Java-бинов VSE Connector.
  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.


person CodeEngine    schedule 10.12.2015    source источник
comment
Итак, ваш вопрос, что именно? Почему запись в файл требует эксклюзивной блокировки? Почему так долго пишут? Пожалуйста, постарайтесь быть более конкретным.   -  person Jan    schedule 10.12.2015
comment
Я обновил свой вопрос. Но мой вопрос будет. Почему мне нужно сначала закрыть файл в CICS, чтобы иметь возможность записи в файл. И почему файл блокируется (не может открыться, прочитать или записать) после записи в файл?   -  person CodeEngine    schedule 10.12.2015
comment
во-первых, я не вижу, чтобы вы закрывали свое соединение с этим файлом - это могло бы оставить его открытым и заблокированным.   -  person Jan    schedule 10.12.2015
comment
Ян спасибо за помощь! :).Мы исправляем эту проблему. Проблема заключалась в том, что коннектор VSE на стороне сервера (мейнфрейм), который используется JDBC, использует пакетную программу. Файл CISC был создан с возможностью записи в него только программ CICS, а не пакетных программ. Мы переопределяем файл со свойством, что пакетные программы могут писать в него, и теперь он работает. Я программист ПК, поэтому извините, если терминология или объяснение не самые лучшие в отношении мэйнфреймов.   -  person CodeEngine    schedule 10.12.2015
comment
Было бы хорошо, если бы вы нашли время и ответили на свой вопрос (и приняли его!), чтобы у следующего человека была некоторая информация о том, как это исправить, выполнив поиск.   -  person Jan    schedule 10.12.2015
comment
Хорошо, я собираюсь! Благодарность !   -  person CodeEngine    schedule 10.12.2015


Ответы (2)


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

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

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

person cschneid    schedule 11.12.2015

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

Когда вы определяете новый файл 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) -                 
          ) -                                
          .
          .  
          .              
person CodeEngine    schedule 10.12.2015
comment
Замедление: с вариантами 3 и 4 вы отвечаете за поддержание целостности данных, к которым обращается программа, как при чтении, так и при записи. Эти параметры требуют, чтобы ваша программа использовала ENQ/DEQ для поддержания целостности данных при совместном использовании набора данных, включая обработку OPEN и CLOSE. Пользовательские программы, которые игнорируют рекомендации по целостности записи, могут привести к проверкам программы VSAM, потере или недоступности записей, неисправимым ошибкам набора данных и другим непредсказуемым результатам. Эти параметры возлагают большую ответственность на каждого пользователя, предоставляющего доступ к набору данных. - person Bill Woodger; 10.12.2015
comment
Эй, Билл, я должен был упомянуть, что я программист ПК, а не программист мэйнфреймов. Когда вы говорите о моей программе для использования ENQ/DEQ, вы говорите о программе CISC, которая читает/записывает в файл VSAM? - person CodeEngine; 10.12.2015
comment
Если две программы имеют доступ к обновлению одного и того же файла, им нужен код для постановки ресурса в очередь, выполнения работы, а затем удаления ресурса из очереди. В противном случае в лучшем случае вы будете время от времени терять данные, а в худшем — безвозвратно повредить файл. Отправка сообщений с Java в программу CICS (обратите внимание на порядок букв) для выполнения обновлений — это один из способов упростить задачу. Также обратите внимание, что вы можете/будете снижать производительность при использовании SHAREOPTIONS 3 или 4 даже при простом чтении файла. - person Bill Woodger; 10.12.2015
comment
Для тех, кто плохо знаком с мэйнфреймами, вам нужно полагаться на своих коллег по мэйнфреймам и службу технической поддержки. Они отскочат так же быстро, как и все, поэтому вам все равно понадобится другое решение. Так что в дизайне где-то это должно было быть предусмотрено. Если вы хотите выполнять несколько одновременных обновлений из разных программ (используя этот термин в широком смысле, рассматривая CICS как программу), вам нужно иметь дело с этим в обеих/всех программах. - person Bill Woodger; 10.12.2015
comment
SHAREOPTIONS 4 поддерживает несколько обновлений, но целостность данных зависит от пользователя (программиста). - person Bill Woodger; 10.12.2015
comment
И не беспокойтесь о том, что вы новичок в этом. Четверкой не пользовались даже люди с многолетним стажем. Не для слабонервных. - person Bill Woodger; 10.12.2015
comment
Я изучаю ENQ / DEQ, так что это код, который вы пишете на PL1 или COBOL и т. Д. На CICS для обработки файла VSAM, когда к нему обращаются разные программы? Это правильно ? Спасибо за комментарии и за то, что нашли время, чтобы объяснить эту проблему! - person CodeEngine; 10.12.2015
comment
Не КОБОЛ. Возможно PL/I. Конечно Ассемблер. Однако хотите ли вы делать все это, если вы можете просто передать сообщение в CICS, а то, что обрабатывает сообщение в CICS, выполняет обновления? - person Bill Woodger; 11.12.2015