0

这是我第一次尝试读写 VSAM 文件。我所做的是:

  1. 使用 VSE Navigator 为文件创建了地图
  2. 将 Java beans VSE 连接器库添加到我的 eclipse Java 项目中
  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

4

2 回答 2

2

对您最初问题的简短回答是 KSDS VSAM 不是 DBMS。

正如您所发现的,您可以定义 VSAM 文件,以便您可以从批处理和 CICS 更新它,但正如@BillWoodger 指出的那样,您必须自己序列化更新。

另一种方法是从 CICS 区域进行所有更新,并让您的 Java 应用程序向 CICS 发送 REST 或 SOAP 或 MQ 消息以请求其更新。这确实需要有一个 CICS 程序来捕获来自 Java 应用程序的请求并执行更新。

于 2015-12-11T01:38:32.970 回答
0

z/VSE 下的 IBM Mainframe 具有运行不同作业的不同分区。例如分区 F7 CICS、分区 F8 批处理作业、ETC。

当您定义一个新的 VSAM 文件时,您必须设置文件的 SHAREOPTIONS。当我定义文件时,我设置了 SHAREOPTIONS (2 3)。2 表示只有一个分区可以写入文件。

因此,当从 Java 调用的批处理程序(在与 CICS 分区不同的分区中)试图写入文件时,除非我先在 CICS 中关闭文件,否则它无法写入文件。

为了修复它,我使用 SHAREOPTIONS (4 3) 重新定义了 CICS 文件。4 表示 Mainframe 的多个分区可以写入。解决问题

以下是您设置 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) -                 
          ) -                                
          .
          .  
          .              
于 2015-12-10T18:34:26.227 回答