...

IBM Informix 11.50 Java Application Development Information Management Partner Technologies

by user

on
Category: Documents
12

views

Report

Comments

Transcript

IBM Informix 11.50 Java Application Development Information Management Partner Technologies
IBM Informix 11.50
Java Application Development
Information Management Partner Technologies
1
Contents
Table of Contents
1.
2.
3.
4.
Introduction.............................................................................................................3
Suggested reading...................................................................................................4
Creating the Sample Database................................................................................5
Using the IBM Data Server Driver for JDBC and SQLJ........................................7
4.1 Setting up the Driver.................................................................................................7
4.2 Using the Provided VMware image..........................................................................7
4.3 General Setup............................................................................................................9
5.
Writing a JDBC (JCC) application using Data Studio..........................................11
5.1 Calling a Stored Procedure......................................................................................19
6.
Troubleshooting....................................................................................................21
2
1. Introduction
In this lab, you will learn how to set up and use the IBM Data Server Driver for
JDBC and SQLJ (also known as the JCC driver).
You will also learn how to use the pureQuery technology in conjunction with Data
Studio to simplify application programming.
For a Java application to access Informix Dynamic Server, it requires a driver
that handles the actual access. A common specification for such a driver is the
Java DataBase Connectivity specification – or JDBC. For Informix, there are two
drivers that implement this specification:
1. Informix JDBC Driver
2. IBM Data Server Driver for JDBC and SQLJ (also known as Java Common
Client driver – JCC)
The Informix JDBC Driver is older and the recommended driver is the IBM Data
Server Driver for JDBC and SQLJ.
The Informix JDBC Driver uses the Informix proprietary SQLI protocol whereas
the IBM Data Server Driver uses the Distributed Relational Database
Architecture (DRDA) protocol. The protocol is also used by DB2 for example and
the specification is openly available.
However, there are still some issues that might force you to use the Informix
JDBC Driver. The following table serves as an overview of features that might
impact your decision as to which driver to use (as of IBM Data Server Driver
Version 3.53):1
Informix JDBC Driver
DRDA Connections
IBM Data Server Driver
x
SQLI Connections
x
Informix version < 11.10
x
JDBC 4.0 Functionality
x
1 Not a complete list of differences, for more information see: http://publib.boulder.ibm.com/
infocenter/idshelp/v115/topic/com.ibm.jccids.doc/com.ibm.db2.luw.apdv.java.doc/doc/
r0052865.htm
3
Informix JDBC Driver
INTERVAL,opaque- and
user-defined data types,
collection data types
IBM Data Server Driver
x
Automatic client re-route
(failover)
x
In this lab we will only use the IBM Data Server Driver for JDBC and SQLJ.
2. Suggested reading
IBM Informix 11.50 Information Center
publib.boulder.ibm.com/infocenter/idshelp/v115/index.jsp
IBM Data Server Driver for JDBC and SQLJ for Informix guide:
publib.boulder.ibm.com/infocenter/idshelp/v115/topic/com.ibm.jccids.doc/jcc.htm
developerWorks series on pureQuery technology:
www.ibm.com/developerworks/views/db2/libraryview.jsp?
search_by=understanding%20purequery
4
3. Creating the Sample Database
In this Lab, you will write a simple time tracking application that periodically polls
the user for information about what they are doing. For this purpose, there is a
database table containing activities that a user can choose from, and a table that
tracks what the user was doing during the last interval.
This information will be stored in a simple database, that you will create by
following these steps:
Open a terminal window in your VMware session and set up your environment
for the “demo_on” Informix instance:
$ . setDemo
(note the space after the “.” )
Next, start DB-Access to create the database:
$ dbaccess - (note the space between hyphens)
Important: If you do not want to create the database manually, you can run the
following script and ignore the rest of this section:
$ dbaccess - /home/informix/scripts/sqls/javalab_create_act_tracks.sql
5
Enter the following DDL statements in DB-Access to create the database:
create database javalab;
database javalab;
CREATE TABLE activities
(
aid SERIAL NOT NULL,
name CHAR(20) NOT NULL,
description VARCHAR(100),
PRIMARY KEY(aid) CONSTRAINT activities_PK
);
CREATE TABLE tracks
(
aid INTEGER NOT NULL,
start DATETIME YEAR TO SECOND NOT NULL,
end DATETIME YEAR TO SECOND NOT NULL,
PRIMARY KEY(aid, start, end) CONSTRAINT tracks_PK,
FOREIGN KEY(aid) REFERENCES activities(aid) ON DELETE CASCADE
);
Note that deleting an activity also deletes the corresponding tracking information,
but not the other way around.
Insert a couple of activities into the ACTIVITIES table by issuing the following
INSERT statements in the DB-Access window:
INSERT INTO activities(name, description) VALUES('Email', 'Checking and
answering emails');
INSERT INTO activities(name, description) VALUES('Calls', 'Conference
and regular phone calls');
INSERT INTO activities(name, description) VALUES('Education', 'Reading,
getting up to date, Training classes etc.');
INSERT INTO activities(name, description) VALUES('Random', 'Time spent
for random things, that do not fit into the other activities');
This will serve as the example database for this lab. Of course you can add
further activities if you would like.
6
4. Using the IBM Data Server Driver for JDBC and
SQLJ
4.1 Setting up the Driver
The Java Common Client (JCC) is the IBM Data Server Driver for JDBC and
SQLJ. The driver itself requires no installation, you just have to make sure that
the driver file is accessible from your application.
First we describe the steps necessary to get a JAVA project up in running in IBM
Data Studio with the JCC driver, and then we describe the general set up
procedure that you can follow on any other machine.
4.2 Using the Provided VMware image
Start IBM Data Studio by double-clicking the Data Studio icon on the Desktop in
your VMware session. You can accept the default workspace when prompted.
And click “Ignore” if you get a message that the trial license will expire soon.
Also close the welcome screen.
You should now see Data Studio using the Data perspective. If it does not look
like the following screenshot, try Window->Open Perspective->Other and
select the “Data” perspective):
7
•
From the main menu at the top of the window select
“Window ->Preferences...” and navigate to “Java”->”Build Path”->”User
Libraries”
You will now add a new user library for the JCC driver. This way, you can easily
include it in future projects and have a central place to change the driver, for
example, when a new version becomes available.
•
Click “New...” , as the name type “JCC” and click OK
•
Click “Add JARs...”
•
Navigate to and add “/opt/IBM/SDPShared/plugins/
com.ibm.datatools.db2_2.1.0.v20090605_2309/driver/db2jcc.jar” (NOTE:
the path might be slightly different, depending on the driver version)
You should see the following window:
8
•
Click OK.
You have just created a user library for easy inclusion in future projects.
4.3 General Setup
Important: You do NOT have to perform these steps in the classroom
environment. You will do this when configuring your own development
environment.
Download the “IBM Data Server Driver for JDBC and SQLJ” from
https://www14.software.ibm.com/webapp/iwm/web/reg/download.do?
lang=en_US&source=swg-informixfpd&S_PKG=dl&cp=UTF-8
The download contains the files db2jcc.jar, db2jcc4.jar and sqlj.zip. If you want
to develop an application that uses JDBC 4.0 functionality, you need the file
db2jcc4.jar, otherwise db2jcc.jar is sufficient (to use SQLJ you need sqlj.zip).
If you are developing with Data Studio, all you need to do is include the proper
driver files from the download above and put them in your project build path.
Right-click on your JAVA project and select “Build Path”->”Add External
Archives...” from the context menu to add the file (or read the previous section
about how to add the driver as a user library.)
9
To have the driver always available (or if you are not using Data Studio) you
might also want include the driver file(s) in your JAVA CLASSPATH.
To do so, copy the appropriate files to a location of your choice and include this
directory in the CLASSPATH environment variable.
For example, under Windows, if you needed JDBC 4.0 functionality, you could
copy db2jcc4.jar to C:\java\libs and append C:\java\libs to the CLASSPATH
environment variable.
10
5. Writing a JDBC (JCC) application using Data
Studio
Launch IBM Data Studio by double clicking on the Data Studio icon on the
Desktop in your VMware session. You can accept the default workspace when
prompted.
You should now see Data Studio using the Data perspective. If it does not look
like the following screenshot, try Window->Open Perspective->Other and select
the “Data” perspective):
•
Right click somewhere in the “Data Project Explorer” area and select
“New”->”Project...”. You can also do this by going to
“File”->”New”->”Project...”.
•
Expand the “Java” folder, select “Java Project” and click “Next”. You should
now see the following window:
11
•
As the project name, enter “TimeTrackerJCC” and change the project layout
to “Create separate source and output folders” to get a tidier project.
•
Click “Next” and select the “Libraries” tab:
•
Click “Add Library...”
Select “User Library”
Select the “JCC” library that you created in the previous section.
Click “Finish” to complete the creation of your JAVA project.
•
•
•
12
Data Studio may prompt you to change into the JAVA perspective. You can
instruct it to do so at this time.
You can get back to the “Data” perspective by selecting it from the top right
corner or “Window->Open Perspective...”.
You will now create a new Java Class:
•
Right-click on the source folder of your new project and select “New->Class”
from the context menu
•
As the package, enter “com.ibm.bootcamp.ids”.
For the name, enter “TimeTracker”.
Check the option to create “public static void main”.
Click “Finish” to create the Class.
•
•
•
13
You will now fill in the “main” method with the necessary steps to create a JDBC
connection to an Informix instance (using the DRDA protocol). In this document
we will describe the data access related steps. The source code can be found in
the file: /home/informix/scripts/java/TimeTracker.java
There are two ways to access the data:
• using the DriverManager interface from the java.sql package
• using the DataSource interface
If you need more flexibility regarding the underlying data source, you should use
the DataSource interface. That way you can, for example, have a WebSphere
application server manage the data source resources.
In this example, we will use the DriverManager interface. You can obtain more
information about the DataSource interface in the Informix v11.50 Information
Center2.
The first step is to load the driver class via the Class.forName method. In JDBC
4.0 (db2jcc4.jar) this is no longer required, but in this lab you are using
db2jcc.jar.
2 http://publib.boulder.ibm.com/infocenter/idshelp/v115/topic/com.ibm.jccids.doc/
com.ibm.db2.luw.apdv.java.doc/doc/tjvdscon.htm
14
String driverClass = "com.ibm.db2.jcc.DB2Driver";
try{
Class.forName( driverClass );
} catch( ClassNotFoundException e){
System.out.println("error loading class " + driverClass );
e.printStackTrace();
}
Next, create a connection string. To obtain a connection object, you need to
build up the connection string first. For Informix, it starts with “jdbc:ids:”, then
the Informix server address and the database name. For example:
String url = "jdbc:ids://ids1150srvr:9089/
javalab:retrieveMessagesFromServerOnGetMessage=true;DELIMIDENT=true;";
You can also add additional configuration properties to the end of the string. The
following table summarizes some of the commonly used ones.
15
Property
retrieveMessagesFromServerOnGet
Message=true
Description
When you call getMessage for an
SQLException object you also get a
more meaningful message from the
server, for example also “A syntax
error has occurred..” and not only “
SQLCODE=-201, SQLSTATE=42000,
DRIVER=3.52.90”
DELIMIDENT=true
Causes Informix to interpret strings in
double quotes as SQL identifiers and
strings in single quotes as string
literals
blockingReadConnectionTimeout=x
Number of seconds before a socket
read times out (default is 0, which
means no timeout)
deferPrepares
True or false, default is to defer
prepares until the statement is
executed. Depending on your
application scenario it might be better
performing to execute prepares
immediately (deferPrepares=false)
STMT_CACHE
0 turned off
1 enables a 512KB statement-cache
traceXXX
See troubleshooting section
For more properties see http://publib.boulder.ibm.com/infocenter/idshelp/v115/index.jsp?topic=/com.ibm.jccids.doc/
com.ibm.db2.luw.apdv.java.doc/doc/rjvdsprp.htm
Now, obtain a connection object via the DriverManger interface:
Connection con = DriverManager.getConnection(url, "informix", "informix");
If the connection fails, the method throws an SQLException, otherwise you will
be connected to the Informix instance.
To issue an SQL statement, you first need a Statement object:
Statement stmt = con.createStatement();
16
By default, each statement is automatically wrapped into an transaction.
If you want to commit your changes manually you have to toggle the
AUTOCOMMIT property on the connection object using the
con.setAutoCommit(false); statement and then issuing the con.commit(); statement to
commit your changes. You can use the default behavior for this exercise.
Create a timer object, which will be used to mark the beginning of the current
activity:
Timestamp start = new Timestamp(System.currentTimeMillis());
Now, you will issue a query to retrieve all activities from the ACTIVITIES table
and handle the ResultSet returned, in order to present the user with a list of
activities to choose from:
String queryActivities = "SELECT aid, name, description FROM activities";
ResultSet rs = stmt.executeQuery( queryActivities);
int aid;
String name;
String description;
System.out.println("What are you doing right now?");
System.out.println();
while( rs.next() ){
aid = rs.getInt("aid");
name = rs.getString("name");
description = rs.getString("description");
System.out.println( aid + ") " + name + " " + description);
}
rs.close();
stmt.close();
Now it is time to get the selection from the user. The user will need to enter an
integer value. To quit the program, the user can simply type an integer value
that does not exist as a key value for an activity, as this will generate an
SQLException.
The following loop is a nice and simple way to make sure that the user actually
entered a valid integer value:
17
String input = "";
int sel;
BufferedReader br = new BufferedReader(
new InputStreamReader(System.in) );
while(true)
{
System.out.println("Please type the number for an activity from
above (none existing to exit): ");
try{
input = br.readLine();
}catch(IOException e)
{
System.out.println("error reading from standard input");
}
try{
sel = Integer.parseInt(input);
}catch(NumberFormatException e)
{
System.out.println("input was no number");
continue;
}
// we got a number, exit loop
break;
}
Now that you know which activity the user is doing, you can insert it into the
database. This time, you will use a Prepared Statement:
Timestamp end = new Timestamp(System.currentTimeMillis());
PreparedStatement pstmt = con.prepareStatement( "INSERT INTO tracks(aid,
start, end) VALUES(?, ?, ?)");
pstmt.setInt(1, sel);
pstmt.setTimestamp(2, start);
pstmt.setTimestamp(3, end);
pstmt.execute();
pstmt.close();
start.setTime( System.currentTimeMillis() );
At the end of the program, don't forget to close the connection:
con.close();
This small time tracking program is now ready. The source file in /home/
informix/scripts/java/TimeTracker.java in your VMWare image also contains a
loop to periodically poll the user for activity information.
Right-click on the file “TimeTracker.java” in the Package Explorer and select
“Run as->Java Application”. As you already know, you will be prompted to
enter what you are doing right now :-) .
18
5.1 Calling a Stored Procedure
First, create a stored procedure called “activity_time_for_day” that computes
how much time was spent for an activity for a specified day. If you are familiar
with the Informix Stored Procedure Language (SPL) please feel free to try writing
it yourself3).
We have also included a script to automatically create this procedure for you.
Execute the following command in your terminal window:
$ dbaccess javalab /home/informix/scripts/sqls/javalab_spl.sql
Now that the stored procedure is created, you can extend the simple Java
program to call the stored procedure after the user selects the activity in order to
print how much time was already spent on that activity today.
You can enter the following code after the user selection is contained in the “sel”
variable and before the connection is closed.
To call a stored procedure, you need a CallableStatement object:
CallableStatement cstmt = con.prepareCall( "CALL
activity_time_for_day(?, ?, ?)" );
cstmt.setInt(1, sel);
Date today = new Date( System.currentTimeMillis() );
cstmt.setDate(2, today);
cstmt.registerOutParameter(3, Types.VARCHAR);
This code creates the object, and sets the parameters for the stored procedure.
The first one is an integer that specifies the activity code and the second one is a
DATETIME YEAR TO SECOND which maps to a java.sql.date (NOT
java.util.date) object.4 The third parameter is an OUT parameter with a data type
of java.sql.Types.VARCHAR.
3 You have to use an OUT parameter and not a return value, otherwise Data Studio (as of
version 1.2) will sort it under User-Defined Functions and not allow the generation of
pureQuery code
4 We want to use the local time from the client here, this is why we do not simply use the
“CURRENT” keyword.
19
Call the stored procedure and retrieve the OUT parameter:
cstmt.execute();
String interval = cstmt.getString(3);
System.out.println("Time already spent for this activity
today (hh:mm:ss): " + interval);
cstmt.close();
At the end close the CallableStatement, and you are done!
Right-click on the file in the Package Explorer and select “Run as->Java
Application” to test out the modifications.
Result Sets
If the stored procedure returned a result (or a result set), you could handle that
using the following code:
ResultSet r = cstmt.executeQuery();
while( r.next() )
{
String name = r.getString(1);
System.out.println("Name): " + name);
}
r.close();
cstmt.close();
20
6. Troubleshooting
This section provides an introduction to troubleshooting. It contains some
commonly encountered issues and shows how to take a JDBC trace, among
other things.
Finderr
The Informix Client SDK contains a very useful utility called “finderr”. If you
installed the CSDK it is in the $INFORMIXDIR/bin directory.
You can use it to get meaningful explanations for error codes. This is also helpful
for the errors returned by SQLException.getMessage. If for example you see
SQLCODE=-201 in the output of getMessage you can then open a terminal window
and navigate to $INFORMIXDIR/bin (not necessary if it is in your path) and type:
$ finderr 201
The finderr utility then prints very detailed information about what might have
caused that error and that, in this case, it was most likely a syntax error.
If you do not get an SQLCODE, but an ERRORCODE for example, you can use
the connection URL property retrieveMessagesFromServerOnGetMessage=true to get a
meaningful error message when catching SQLException and calling getMessage
for that exception (as described earlier).
pureQuery and SERIAL Columns
If you generate pureQuery code for a column with a SERIAL data type, you will
get an error like the following for the method generated for @Update
21
Since SERIAL columns can not be updated in Informix, you have to remove the
“AID=?” from the SQL statement for the two @Update statements. In our
example, remove the “Integer aid” from the first method signature so that it looks
like the following:
Afterwards the project has to be rebuilt.
Connection to Informix failed.
When using the IBM Data Server Driver for JDBC and SQLJ, you have to
connect to an Informix instance running at least version 11.10 which has a
DRDA entry in the SQLHOSTS file.
If you are trying to connect to a port that uses the SQLI protocol, you will get the
following error message (in Data Studio when testing the connection):
22
(Connection to Informix failed. [jcc][t4][2030][11211][3.52.90] A communication error occured
during operations on the connection's underlying socket, socket input stream or socket output
stream. Error location: Reply.fill(). Message: Insufficient data. ERRORCODE=-4499,
SQLSTATE=08001)
Solution:
Make sure that you have an entry in your SQLHOSTS file with the connection
type drsoctcp as well as a corresponding DBSERVERALIASES value.
For example, in the following SQLHOSTS file, the second entry is configured for
DRDA:
fox1
fox1drda
onsoctcp suse1 9088
drsoctcp suse1 9089
and in the ONCONFIG file:
DBSERVERNAME
fox1
DBSERVERALIASES fox1drda
Connection to Informix (still) failed.
If you still cannot connect to your Informix Instance but you are sure that the
server is reachable (e.g. via ping), you might want to check that the hosts file on
the machine that runs Informix is correct. Especially if it is inside a VMware
image, make sure that you have an entry with the correct IP Address (127.0.0.1
is NOT sufficient) and the hostname used in the SQLHOSTS file. For example
on a Linux host in /etc/hosts:
192.168.42.133 suse1.localdomain
suse1
would be a valid entry if you can reach your VMware host system with this
interface.
23
JDBC trace
To troubleshoot an application, it is often very useful to get a trace of the JDBC
calls and actions that the application performed. There are several ways to start
a JDBC trace5. We will use the simplest method here by providing several trace
parameters via the connection URL:
String url = "jdbc:ids://suse1:9089/
javalab:retrieveMessagesFromServerOnGetMessage=true;DELIMIDENT=true;"
+ "traceDirectory=/home/informix/trace;traceFile=traces_;traceFileAppend=true;traceLevel="
+ com.ibm.db2.jcc.DB2BaseDataSource.TRACE_STATEMENT_CALLS + ";";
The relevant trace parameters are “traceDirectory” which specifies a directory to
which all the trace files are written. “traceFile” gives a prefix with which each
trace file starts. If a trace file already exists, the trace output is appended
because of “traceFileAppend=true”. The last parameter sets the “traceLevel” to
trace statement calls. If you run your sample application with this modified
connection URL you will produce a trace file that contains something like:
[jcc][Time:2008-12-28-22:24:52.734][Thread:main][Statement@23cc23cc] executeQuery (SELECT aid, name, description FROM
activities) called
[jcc][Time:2008-12-28-22:24:52.812][Thread:main][Statement@23cc23cc] executeQuery () returned ResultSet@4b804b8
[jcc][Time:2008-12-28-22:24:52.828][Thread:main][Statement@23cc23cc] close () called
[jcc][Time:2008-12-28-22:24:55.984][Thread:main][PreparedStatement@7cf87cf8] setInt (1, 2) called
[jcc][Time:2008-12-28-22:24:55.984][Thread:main][PreparedStatement@7cf87cf8] setTimestamp (2, 2008-12-28 22:24:33.562)
called
[jcc][Time:2008-12-28-22:24:55.984][Thread:main][PreparedStatement@7cf87cf8] setTimestamp (3, 2008-12-28 22:24:55.937)
called
[jcc][Time:2008-12-28-22:24:55.984][Thread:main][PreparedStatement@7cf87cf8] execute () called
[jcc][Time:2008-12-28-22:24:56.000][Thread:main][PreparedStatement@7cf87cf8] execute () returned false
[jcc][Time:2008-12-28-22:24:56.000][Thread:main][CallableStatement@245e245e] setInt (1, 2) called
[jcc][Time:2008-12-28-22:24:56.000][Thread:main][CallableStatement@245e245e] setDate (2, 2008-12-28) called
[jcc][Time:2008-12-28-22:24:56.000][Thread:main][CallableStatement@245e245e] executeQuery () called
[jcc][Time:2008-12-28-22:24:56.015][Thread:main][CallableStatement@245e245e] executeQuery () returned ResultSet@57c257c2
[jcc][Time:2008-12-28-22:24:56.015][Thread:main][CallableStatement@245e245e] close () called
[jcc][Connection@48e848e8] IDS ID: 192.168.42.133.33059.081212134954.0001
Transactions and logging
If at some point you get an error saying that transactions are not supported (for
example if you are using the setAutoCommit(false) ) you have to turn on logging
for the database you are working with. In our example, you could do this by
opening a terminal window, setting your environment using
$ . setDemo
(note the space after the “.”)
5 For other possibilities to turn on JDBC tracing see
http://publib.boulder.ibm.com/infocenter/idshelp/v115/index.jsp?topic=/com.ibm.jccids.doc/jcc.htm
24
and then using ontape
$ ontape -s -B javalab
This turns on buffered logging for the database javalab.
This concludes the lab, if you finished ahead of time, you can help your
classmates or write a simple report application that creates a ranking of the
activities regarding how much time you spent for each one.
25
© Copyright IBM Corporation 2010
All Rights Reserved.
IBM Canada
8200 Warden Avenue
Markham, ON
L6G 1C7
Canada
Printed in United States of America
01/2010
IBM, IBM (logo), and Informix are trademarks or registered
trademarks of International Business Machines Corporation in the
United States, other countries, or both.
Any performance data contained herein was determined in a
controlled environment. Therefore, the results obtained in other
operating environments may vary significantly. Some
measurements may have been made on development-level
systems and there is no guarantee that these measurements will
be the same on generally available systems. Furthermore, some
measurement may have been estimated through extrapolation.
Actual results may vary. Users of this document should verify
the applicable data for their specific environment.
Information concerning non-IBM products was obtained from the
suppliers of those products, their published announcements or
other publicly available sources. IBM has not tested those
products and cannot confirm the accuracy of performance,
compatibility or any other claims related to non-IBM products.
Questions on the capabilities of non-IBM products should be
addressed to the suppliers of those products.
Linux is a trademark of Linus Torvalds in the United States, other
countries, or both
UNIX is a registered trademark of The Open Group in the United
States, other countries, or both
Windows is a trademark of Microsoft Corporation in the United
States, other countries, or both.
Other company, product, or service names may be trademarks or
service marks of others.
References in this publication to IBM products or services do not
imply that IBM intends to make them available in all countries in
which IBM operates. The following paragraph does not apply to the
United Kingdom or any other country where such provisions are
inconsistent with local law:
INTERNATIONAL BUSINESS MACHINES CORPORATION
PROVIDES THIS PUBLICATION "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT
NOT LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A
PARTICULAR PURPOSE.
Some states do not allow disclaimer of express or implied warranties
in certain transactions, therefore, this statement may not apply to
you.
This information could include technical inaccuracies or
typographical errors. Changes are periodically made to the
information herein; these changes will be incorporated in new
editions of the publication. IBM may make improvements and/or
changes in the product(s) and/or the program(s) described in this
publication at any time without notice.
The information in this publication is provided AS IS without
warranty. Such information was obtained from publicly available
sources, is current as of January 2010, and is subject to change.
Any performance data included in the paper was obtained in the
specific operating environment and is provided as an illustration.
Performance in other operating environments may vary. More
specific information about the capabilities of products described
should be obtained from the suppliers of those products.
Information concerning non-IBM products was obtained from the
suppliers of those products, their published announcements or
other publicly available sources. IBM has not tested those
products and cannot confirm the accuracy of performance,
compatibility or any other claims related to non-IBM products.
Questions on the capabilities of non-IBM products should be
addressed to the suppliers of those products.
The information in this publication is provided AS IS without
warranty. Such information was obtained from publicly available
sources, is current as of January 2009, and is subject to change.
Any performance data included in the paper was obtained in the
specific operating environment and is provided as an illustration.
Performance in other operating environments may vary. More
specific information about the capabilities of products described
should be obtained from the suppliers of those products.
26
Fly UP