These are the results of running i-net Software's BenchTest
2.1 for MS SQL Server. The tests were run against an SQL Server 2000 over
a 100Mbit network connection. The client machine was an AMD Duron 900MHz with
512MB RAM (no idea about the server).

5 drivers were tested: i-net
Merlia 6.0, Microsoft SQL Server Driver for JDBC SP2, JNetDirect JSQLConnect
3.3023, jTDS 0.7 and the JDBC-ODBC bridge bundled with J2RE 1.4.2-b28. All tests
were run twice and the final result is the average of the two test runs.

Unfortunately, the license of NetDirect JSQLConnect does not allow any benchmarking
results to be made public, but it has failed the CursorUpdate test and the results
would not have affected the final standings too much. If you want some more
exact results for JSQLConnect, download it and the i-net Software BenchTest
and do the testing yourself. It's very easy.

All tests use a table with an INT primary key and nullable columns of
each SQL Server base type (about 20 in all). The rowcount is a parameter
that determines the size of each test (number of rows inserted/updated/retrieved
or Blob size).

UnpreparedInsert - Insert rowcount rows with default values with a classic
INSERT using a plain statement.

DeleteAll - Delete all rows with a single statement ('DELETE FROM Table').
Not very relevant, it only tests the server, that's why the results vary so
wildly from the 1000 rows test to the 100 rows test.

CursorInsertEmpty - Insert rowcount rows using insertRow() and without setting
the value of any column.

CursorFetchPaged - Create a scrollable ResultSet, set the fetch size to
rowcount/100 and scroll through it. (jTDS doesn't "know" how to
fetch more than one row of a cursor-based ResultSet at once yet, so it's somewhat
slower than the i-net driver, but still a lot faster than the others.)

CursorUpdate - Update rowcount rows using updateRow().

PreparedUpdate - Update rowcount rows using a classic UPDATE with a PreparedStatement.

PreparedUpdateWProc - Update rowcount rows using a stored procedure with
a PreparedStatement.

BatchPreparedUpdate - Update rowcount rows using a classic UPDATE with a
PreparedStatement and executeBatch() in batches of 10 updates.

ResultSetReadAllRows - Scroll through a scrollable ResultSet and call the
getXXX() methods for each column.

PreparedBlobUpdate - Update a Blob of rowcount KB using a classic UPDATE
with a PreparedStatement.

PreparedBlobUpdateWProc - Update a Blob of rowcount KB using a stored procedure
with a PreparedStatement.

1
MS Cursor stands for the Microsoft driver with SelectMethod set to 'Cursor'
(the other uses the default 'Direct' method).2 The JDBC-ODBC bridge failed on the CursorDelete
test and closed the connection causing the rest of the tests to also fail.