As most Db2 developers and DBAs know, when you modify a Db2
program you have to prepare the program to enable it to be executed. This
program preparation process requires running a series of code preprocessors
that—when enacted in the proper sequence—creates an executable load module and
a Db2 application package. The combination of the executable load module and
the application package is required before any Db2 program can be run, whether
batch or online.
But it is not our intent here to walk through and explain
all of the steps and nuances involved in Db2 program preparation. Instead, we
are taking a look at the impact of converting COBOL programs to Java programs,
particularly when it comes to the need to bind as a part of the process.
We all know that issuing the BIND command causes Db2 to
formulate access paths for SQL. If enough things (statistics, memory, buffers,
etc.) have changed, then access paths can change whenever you BIND or REBIND.
And this can be troublesome to manage.
But if the SQL does not change, then it is not technically necessary
to bind to create a new package. You can prevent unnecessary BIND operations by
comparing the new DBRM from the pre-compile with the previous version. Of
course, there is no native capability in Db2 or the BIND command to compare the
DBRM. That is why there are third-party tools on the market that can be used
for this purpose.
But again, it is not the purpose of today’s post to discuss
such tools. Instead, the topic is converting COBOL to Java. I have discussed
this previously in the blog in the post Consider Cross-Compiling COBOL to Java
to Reduce Costs, so you might want to take a moment to read through that
post to acquaint yourself with the general topic.
Converting COBOL to Java and BIND
So, let’s consider a COBOL program with Db2 SQL statements
in it. Most COBOL uses static SQL, meaning that the access paths are determined
at bind time, not at execution time. If we convert that COBOL program to Java
then we are not changing the SQL, just the code around it. Since the SQL does
not change, then a bind should not be required, at least in theory, right?
Well, we first need to get into a quick discussion about
types of Java programs. You can use either JDBC or SQLJ for accessing Db2 data
from a Java program. With JDBC the program will use dynamic SQL whereas SQLJ will
deliver static SQL. The Db2 BIND command can be issued using a DBRM (precompiler
output) or a SQLJ customized profile.
So, part of the equation to avoid binding
is to utilize SQLJ for converted COBOL programs.
CloudFrame,
the company and product discussed in the referenced blog post above can be
used to convert COBOL programs into modular Java. And it uses SQLJ for the Db2
access. As such, with embedded SQLJ, static SQL will be used and the access
paths will be determined at bind time instead of execution time.
But remember, we converted business logic, not SQL. The same
SQL statements that were used in the COBOL program can be used in the converted
Java. CloudFrame takes advantage of this and re-purposes the existing package
from the previous COBOL program to the new Java SQLJ. CloudFrame automates the entire
process as part of the conversion from COBOL to Java. This means that the static
SQL from the COBOL program is converted and customized into SQLJ in java. This
is a built-in capability of CloudFrame that allows you to simply reuse the same
package information that was already generated and bound earlier.
This means no bind is required when you use CloudFrame to
convert your Db2 COBOL applications to Java… and no access paths will change. And
that is a good thing, right? Conversion and migration are already
time-consuming processes; eliminating performance problems due to changing
access paths means that one less issue to worry about during a COBOL to Java
conversion when you use CloudFrame.