Блокировка файла VSAM при записи в него с использованием Java JDBC
Это моя первая попытка чтения и записи в файл VSAM. То, что я сделал, было:
- Создана карта для файла с помощью VSE Navigator
- Добавлена библиотека VSE Connector для Java-компонентов в мой Java-проект Eclipse.
- Используйте приведенный ниже код для записи и чтения в файл 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
2 ответа
Короткий ответ на ваш первоначальный вопрос: KSDS VSAM не является СУБД.
Как вы обнаружили, вы можете определить файл VSAM так, чтобы вы могли обновлять его как из пакета, так и из CICS, но, как указывает @BillWoodger, вы должны сами сериализовать свои обновления.
Другой подход заключается в том, чтобы делать все обновления из региона CICS, и чтобы ваше приложение Java отправляло сообщение REST, SOAP или MQ в CICS для запроса своих обновлений. Для этого требуется наличие программы CICS, чтобы перехватывать запросы из приложения Java и выполнять обновления.
Мэйнфрейм IBM в z/VSE имеет разные разделы, которые выполняют разные задания. Например, раздел F7 CICS, раздел F8 Batch Jobs, ETC.
Когда вы определяете новый файл VSAM, вы должны установить SHAREOPTIONS этого файла. Когда я определяю файл, я устанавливаю SHAREOPTIONS (2 3). 2 Означает, что только один раздел может записывать в файл.
Поэтому, когда пакетная программа (в другом разделе, чем раздел CICS), вызываемая из Java, пыталась записать в файл, она не смогла записать в файл, если сначала я не закрою файл в CICS.
Чтобы исправить это, Я ПЕРЕСМОТРЕЛ файл CICS с помощью SHAREOPTIONS (4 3). 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) -
) -
.
.
.