使用Java JDBC写入时VSAM文件锁定
这是我第一次尝试读取和写入VSAM文件。我所做的是:使用Java JDBC写入时VSAM文件锁定,java,jdbc,mainframe,vsam,Java,Jdbc,Mainframe,Vsam,这是我第一次尝试读取和写入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/VSEz/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有助于多次更新,但数据完整性取决于用户(程序员)。