使用Java JDBC写入时VSAM文件锁定

使用Java JDBC写入时VSAM文件锁定,java,jdbc,mainframe,vsam,Java,Jdbc,Mainframe,Vsam,这是我第一次尝试读取和写入VSAM文件。我所做的是: 使用VSE Navigator为文件创建映射 将JavaBeans VSE连接器库添加到我的EclipseJava项目中 使用下面显示的代码写入和读取KSDS文件 读取文件不是问题,但当我试图写入文件时,只有在运行java程序之前在大型机上关闭文件,它才会起作用,但它会将文件锁定一个小时。您无法在大型机上打开该文件或对其执行任何操作 任何人都可以帮助解决这个问题。是否需要为大型机上的文件设置特殊设置?为什么首先需要关闭CICS上的文件才能对其

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

  • 使用VSE Navigator为文件创建映射
  • 将JavaBeans VSE连接器库添加到我的EclipseJava项目中
  • 使用下面显示的代码写入和读取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

    z/VSE下的IBM大型机有不同的分区,运行不同的作业。例如,分区F7 CICS、分区F8批处理作业等

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

    因此,当从Java调用的批处理程序(位于CICS分区的另一个分区中)试图写入文件时,除非我首先在CICS中关闭该文件,否则无法写入该文件

    为了修复它,我使用SHAREOPTIONS(4 3)重新定义了CICS文件。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) -                 
              ) -                                
              .
              .  
              .              
    

    最初问题的简短答案是KSDS VSAM不是DBMS

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


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

    那么您的问题是,到底是什么?为什么写入文件需要独占锁?为什么写这么长时间?请尽量说得更具体些。我更新了我的问题。但我的问题是。为什么我需要先关闭CICS上的文件才能写入该文件。为什么在我写入文件后文件会锁定(无法打开、读取或写入)?首先,我没有看到您关闭与该文件的连接-这可能会使其保持打开和锁定。Jan感谢您的帮助!:)。我们解决了这个问题。问题是JDBC使用的服务器端(大型机)上的VSE连接器使用批处理程序。CISC文件是使用以下选项创建的:只有CICS程序可以向其写入,而不是批处理程序。我们用批处理程序可以写入的属性重新定义文件,现在它可以工作了。如果大型机的术语或解释不是最好的,我是一名PC程序员,非常抱歉。如果你花点时间回答自己的问题(并接受它!),那么下一个人就会知道如何解决这个问题。通过搜索解决此问题。放慢速度:“对于选项3和4,您负责维护程序访问的数据的读写完整性。这些选项要求您的程序使用ENQ/DEQ来维护数据完整性,同时共享数据集,包括打开和关闭处理。忽略写完整性准则的用户程序可能会导致VSAM程序检查、记录丢失或无法访问、无法纠正的数据集故障以及其他不可预测的结果。这些选项让每个共享数据集的用户承担了沉重的责任。“嘿,比尔,我应该提到我是一名PC程序员,而不是大型机程序员。当你谈论我使用ENQ/DEQ的程序时,你是在谈论一个读/写VSAM文件的CISC程序吗?如果是两个”程序“拥有对同一文件的更新访问权限—他们需要代码来加密资源、完成工作,然后将资源出列。否则,充其量您会不时丢失数据,最坏的情况下,您会损坏文件,无法修复。将消息从Java发送到CICS(注意字母顺序)程序来执行更新是保持简单的一种方法。另外请注意,使用SHAREOPTIONS 3或SHAREOPTIONS 4可能会降低性能,即使只是读取文件也是如此。对于刚接触大型机的人,您需要依赖大型机同事和技术支持。它们会像任何东西一样快速反弹,所以你无论如何都需要一个不同的解决方案。所以在设计的某个地方,这应该被涵盖。如果您想从不同的“程序”同时执行多个更新(松散地使用术语,将CICS视为一个程序),那么您需要在两个/所有程序中处理它。SHAREOPTIONS 4有助于多次更新,但数据完整性取决于用户(程序员)。