gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 04:06:49 26 4
gpt4 key购买 nike

这是我第一次尝试读取和写入 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

最佳答案

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

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

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

关于java - 使用 Java JDBC 写入时 VSAM 文件锁定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34205767/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com