【发布时间】:2015-12-10 15:29:48
【问题描述】:
这是我第一次尝试读写 VSAM 文件。我所做的是:
- 使用 VSE Navigator 为文件创建了地图
- 将 Java beans VSE 连接器库添加到我的 eclipse Java 项目中
- 使用下面显示的代码写入和读取 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
【问题讨论】:
-
那么你的问题到底是什么?为什么写入文件需要排他锁?为什么写这么久?请尝试更具体。
-
我更新了我的问题。但我的问题是。为什么我需要先关闭 CICS 上的文件才能写入文件。以及为什么在我写入文件后文件锁定(无法打开、读取或写入)?
-
我没有看到您关闭与该文件的连接 - 这可能会使其保持打开和锁定状态。
-
一月感谢您的帮助! :)。我们解决了这个问题。问题是 JDBC 使用的服务器端(大型机)上的 VSE 连接器使用批处理程序。 CISC 文件是使用只有 CICS 程序可以写入而不是批处理程序的选项创建的。我们使用批处理程序可以写入的属性重新定义文件,现在它可以工作了。如果术语或解释不是关于大型机的最佳,我是一名 PC 程序员,非常抱歉。
-
如果你花时间回答你自己的问题(并接受它!)那就太好了,所以下一个人有一些关于如何通过搜索解决这个问题的信息。