[an error occurred while processing this directive] IT • archiv :: Print

IT • archiv


[an error occurred while processing this directive]

[an error occurred while processing this directive]

В дебрях JDBC драйверов

[an error occurred while processing this directive](none) [an error occurred while processing this directive](none)[an error occurred while processing this directive] ::
[an error occurred while processing this directive](none)
[an error occurred while processing this directive]([an error occurred while processing this directive] Нитин Нанда [an error occurred while processing this directive])

[an error occurred while processing this directive](none)

Как развертывать, использовать и измерять производительность JDBC драйверов 1, 2, 3 и 4 типов.

JDBC Tutorial
PDF versionPDF версия
Обзор
В статье рассматриваются основы архитектуры 4-х различных типов JDBC драйверов, анализируются их сильные и слабые стороны. Приводятся результаты тестирования и сравнения пяти драйверов являющихся промышленными стандартами в отрасли. Сравнение производится с точки зрения: времени доступа к базе данных, времени установления соединения, типа драйвера и т.д. В качестве драйверов выбраны: JDBC-ODBC бридж, драйвер IDS, MERANT SequeLink, JTurbo компании Ashna и I-net Sprinta 2000. Даны подробные инструкции по их развертыванию и использованию. (3000 слов)

Почему надо рассматривать JDBC драйверы отдельно от JDBC-ODBC бриджей? Какие JDBC драйверы подходят вашему приложению? На какие параметры надо обращать внимание при использовании JDBC драйверов? Данная статья рассматривает различные JDBC драйверы и дает ответы на эти вопросы.

Как правило, когда программисты начинают разработку JDBC приложения, то стартуют обычно с использования JDBC-ODBC бриджей для соединения с базой данных, но со временем, когда приложение достигает определенной стадии, например, когда требуется поддержка многозадачности JDBC-ODBC бридж начинает создавать определенные проблемы. Таким образом, встает задача поиска приемлемого JDBC драйвера. Проблема выбора зависит от нескольких параметров: приложение является Интернет или интранет приложением, необходима ли поддержка различных гетерогенных баз данных, количество одновременных пользователей и т.д.

В первой части статьи мы рассмотрим архитектуру четырех различных типов JDBC драйверов, перечислим плюсы или минусы той или иной архитектуры — информацию требуемую для принятия решения о выборе типа JDBC драйвера наиболее подходящего для вашего приложения.

Во второй части мы рассмотрим 5 различных драйверов широко применяющихся в индустрии: JDBC-ODBC бридж от Sun Microsystems, IDS драйвер от IDS Software, JTurbo от  компании Ashna, I-net Sprinta от I-net Software и Merant Sequelink. Эта часть снабжена подробными пошаговыми инструкциями необходимыми для работы с драйверами, кусками кода для указания CLASSPATH, загрузки драйвера, установления соединения с базой данных, запроса и вставки записей. Возможно кому-нибудь окажутся полезными куски кода с последовательным следованием инструкциям для тестирования драйверов и определения насколько подходит тот или иной драйвер вашим требованиям по ПО и «железу».

Типы JDBC драйверов

JDBC драйверы делятся на четыре типа или уровня. Каждый тип определяет реализацию JDBC драйвера по возрастающей степень независимости от платформы,  производительности и легкости администрирования. Эти четыре типа следующие:

Тип 1: JDBC-ODBC бридж

Драйверы 1-го типа транслируют все вызовы JDBC в вызовы ODBC (Open Database Connectivity), с пересылкой всех данных в ODBC драйвер. Отсюда, конечно же, следует, что ODBC драйвер, а также во многих случаях и клиентское ПО для подключения к базе данных должны быть установлены на клиентской машине. Рис. 1 показывает типичную среду JDBC-ODBC бриджа.

Тип 1: JDBC-ODBC бридж.
Рисунок 1. Тип 1: JDBC-ODBC бридж.

Плюсы

JDBC-ODBC бридж позволяет осуществить доступ практически с любой базе данных, поскольку драйверы ODBC существуют практически к любым СУБД. Драйверы 1-го типа могут быть полезными для тех компаний, где ODBC драйвера уже установлены на клиентских машинах.

Минусы

  • Низкая производительность, JDBC вызов идет через бридж к ODBC драйверу и далее к нативному интерфейсу соединения с базой данных, результат вызова, соответственно идет в обратном порядке. С этой точки зрения драйверы 1-го типа могут не подходить для приложений большого масштаба.
  • ODBC драйвер и специальное клиентское ПО должны быть установлены на клиентской машине, то есть отсутствует возможность использования Java апплетов в интранет среде, иными словами остается проблема развертывания традиционных приложений.

Тип 2: Нативный-API/частичный Java драйвер

JDBC драйвер 2-го типа - нативный-API/частичный Java драйвер – переводит вызовы  JDBC в вызовы специфичные к СУБД таких как например SQL Server, Informix, Oracle или Sybase. Драйвер 2-го типа общается напрямую с сервером базы данных, следовательно он требует, чтобы какой то бинарный код был на стороне клиентской машины.

Тип 2: Нативный-API/частичный Java драйвер.
Рисунок 2. Тип 2: Нативный-API/частичный Java драйвер.

Плюсы

Драйвер 2 типа как правило обеспечивает значительно большую производительность по сравнению с JDBC-ODBC бриджем.

Минусы

Требуется установка на стороне клиента библиотек вендора СУБД. Следовательно, драйверы 2 типа не могут использоваться для Интернет приложений. Драйверы этого типа менее производительны, чем драйверы 3 и 4 типов.

Тип 3: Сетевой протокол/«чистый» Java драйвер

JDBC драйвер 3 типа – сетевой протокол/«чистый» Java драйвер – использует трехуровневую архитектуру, где вызовы JDBC посылаются на промежуточный т.н. сервер приложений, далее этот сервер транслирует вызовы (явно или косвенно) в вызовы специфичного к СУБД нативного интерфейса для дальнейшего обращения к базе данных. Если сервер среднего слоя написан на Java то он может использовать для трансляции JDBC драйверы 1 и 2 типов.

Тип 3: Сетевой протокол/«чистый» Java драйвер.
Рисунок 3. Тип 3: Сетевой протокол/«чистый» Java драйвер.

Плюсы

Данный драйвер является серверным, поэтому нет необходимости в установке  библиотек вендора СУБД на клиентских машинах. Кроме того существует много способов для оптимизации портабельности, производительности и масштабируемости. Более того, использование сетевого протокола дает возможность сделать JDBC драйвер очень маленьким и быстрым для загрузки. Вдобавок, драйверы 3 типа, как правило, поддерживают такие свойства как кэширование (соединений, результатов запросов и т.д.), балансировку нагрузки и расширенные функции администрирования, такие как аудит и логгинг.

Минусы

Драйверы 3-го типа требуют кодирования на среднем слое функций специфичных к СУБД, кроме того, перебор записей в ResultSet может быть достаточно длительным, так как данные проходят через сервер приложений.

Тип 4: Нативный протокол/«чистый» Java драйвер

Нативный протокол/«чистый» Java драйвер (JDBC драйвер 4-го типа) конвертирует вызовы JDBC в специфический протокол вендора СУБД, так что клиентские приложения могут напрямую обращаться с сервером базы данных. Драйверы 4-го типа полностью реализуются на Java с целью достижения платформенной независимости и устранения проблем администрирования и развертывания.

Тип 4: Нативный протокол/«чистый» Java драйвер.
Рисунок 4. Тип 4: Нативный протокол/«чистый» Java драйвер.

Плюсы

Поскольку драйверам 4-го типа не требуется транслировать вызовы к базе данных в ODBC или нативный интерфейс вызова или же перенаправлять на другой сервер, то производительность этих драйверов обычно довольно хорошая.  Эти драйвера могут похвастаться существенно большей производительностью, чем драйверы 1 и 2 типа. Кроме того, нет необходимости в установке специального программного обеспечения, как на стороне клиента, так и на стороне сервера. Более того, эти драйвера могут загружаться динамически.

Минусы

При использовании драйверов 4-го типа, пользователю необходимо использовать различные драйвера для каждой базы данных.

Тестирование производительности пяти различных JDBCдрайверов

Для тестирования производительности пяти JDBC драйверов по различным параметрам таким как: среднее время установления соединения, время выборки данных, время вставки записи, была создана тестовая база данных на SQL Server 7.0. Были выбраны JDBC драйверы являющиеся стандартными в отрасли и представляющие различные типы. Примечание: ни один драйвер 2-го типа не тестировался, так как, во первых не удалось найти готовый к применению драйвер, во вторых было желание в рамках данной статьи ограничиться только «чистыми» Java драйверами.

Для тестирования были выгружены из Интернет и установлены пробные версии драйверов, затем проведены серии тестов для каждого из драйверов, с тем чтобы определить производительность в одинаковых условиях программного и аппаратного окружения. Результаты тестов могут отличаться в других условиях, иными словами результаты тестов приводятся для обеспечения относительной информацией при сравнении каждого из типов драйверов.

Были протестированы следующие JDBC драйверы:

  1. JDBC-ODBC бридж от Sun Microsystems
  2. IDS Driver от IDS Software
  3. SequeLink от MERANT
  4. JTurbo1.22 от Ashna
  5. I-net Sprinta 2000 от I-net Software

Результаты тестов приведены в Таблице 1

JDBC драйвер/данные JDBC-ODBC бридж IDS SequeLink JTurbo 1.22 I-net Sprinta
Вендор Входит в состав Sun JDK IDS Software MERANT Ashna Inc. I-net Software
Тип драйвера 1 3 3 4 4
Размер (сжатый) - 114 KB 269 KB 107 KB 42 KB
Время установления соединения (ms) 55 22 65 25 190
Выборка данных(ms)(33,000 записей) 10 5 10 905 675
Фетчинг (перебор) 33,000 записей (ms) 865 18,700 3,500 910 560
Вставка 1000 записей (ms) 3,700 3,000 3,500 3,600 3,050
Таблица 1. Параметры производительности использованных JDBC драйверов.

Таблица базы данных, на которой производились тесты имела поля следующих типов: int, varchar(255) и datetime. Условия тестирования были следующие:

Условия тестирования
Платформа: Windows NT 4.0
Компьютер с Java VM: Pentium III
SQL Server 7.0: Pentium III
JVM: JDK 1.2.1
Таблица 2. Условия тестирования.

Давайте сейчас рассмотрим описания этих драйверов и основные установки для их использования.

JDBC-ODBC бридж

Драйвер JDBC-ODBC бридж от Sun JavaSoft. Это драйвер 1-го типа, является результатом совместных усилий JavaSoft и MERANT. Входит в состав Java Developer Kit (JDK), позволяет использовать большое количество имеющихся ODBC драйверов, в свое время послужил хорошим рычагом, чтобы JDBC в течение короткого времени получил широкое распространение.

Следуйте следующим шагам, чтобы использовать его:

  1. Создание ODBC DSN Используя Windows Control Panel, создать ODBC DSN (Data Source Name) для базы данных.
  2. Загрузка драйвера В JDBC программе одно из первых дел, которое нужно сделать, это загрузить JDBC драйвер вызовом статического метода forName(), класса Class. Class.forName() принимает один строчный параметр: название класса драйвера вместе с названием пакета. Для JDBC-ODBC бриджа JavaSoft, эта строка будет следующей "sun.jdbc.odbc.JdbcOdbcDriver". Следовательно, вызов будет такой:
    Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
  3. Установка соединения с базой данных После загрузки JDBC драйвера уже можно установить соединение с базой данных, используя метод DriverManager.getConnection(). Первый аргумент этого метода это строка содержащая JDBC URL базы данных. Второй и третий параметры – имя пользователя и пароль соответственно.

    JDBC URL составляется по следующему шаблону:

     jdbc:<subprotocol>:<subname>

    В нашем случае соединение с базой данных может быть установлено следующим образом:

    String stUrl_= "jdbc:odbc:myDSN"; // предполагается, что myDSN
    // это имя ОDBC DSN (источника данных)
    Connection connection_ = DriverManager.getConnection(stUrl_, "sa", "");
    
  4. Проведение тестирования Для вычисления времени установления соединения можно использовать следующий код:
    long ldiff;
    java.util.Date dStart = new java.util.Date();  //время начала
    //установить соединение с базой данных
    String stUrl_= "jdbc:odbc:myDSN";
    connection_ = DriverManager.getConnection(stUrl_,"sa","");
    java.util.Date dEnd = new java.util.Date();  //время окончания
    //получить разницу во времени, которая и является искомым //временем
    ldiff = dEnd.getTime()-dStart.getTime();
    

Заключение

JDBC-ODBC бридж это хорошая стартовая точка для изучения JDBC. Однако его следует считать промежуточным решением, поскольку оно неприемлемо для приложений большого масштаба.

Драйвер IDS компании IDS Software

Драйвер IDS является драйвером 3-го типа, использует IDS Server в качестве промежуточного сервера приложений. Запросы к базе данных и результаты запросов пересылаются между IDS драйвером и IDS Server. Поскольку этот драйвер является 100% чистой Java реализацией, то гарантируется выполнение девиза Java"Напиши раз, запускай везде". И действительно драйвер работает на всех браузерах с поддержкой Java, на Java Plug-in и на JDK и, кроме того, на ваших любимых средствах Java разработки.

IDS Server поддерживает Oracle (как нативный интерфейс OCI или ODBC), Sybase (нативный интерфейс CT-Lib или ODBC), Informix, MS SQL Server, MS Access, ODBC, FoxPro, dBase, DB2, Ingres, mSQL, MySQL, PostgreSQL, Yard-SQL и т.д..

Пошаговые инструкции по использованию IDS драйвера следующие:

  1. Установка IDS Server Вам необходимо установить IDS Server на серверной машине и запустить его. IDS Server запускается на сервере в виде службы.
  2. Создание ODBC DSN Создать ODBC DSN для базы данных на той машине, на которой запущен IDS Server.
  3. Установка CLASSPATH Установить IDS драйвер на клиентской машине. Установки переменной окружения CLASSPATH должны включать IDS драйвер. Установку указанной переменной можно произвести с командной строки следующим образом:
    Set %CLASSPATH% = %CLASSPATH%;<IDS install directory>\classes
    
  4. Загрузка драйвера Для драйвера IDS, параметры метода forName() такие "ids.sql.IDSDriver". Вызов может быть следующим:
    Class.forName("ids.sql.IDSDriver");
    
  5. Установка соединения с базой данных JDBC URL составляется по следующему шаблону:
    jdbc:<subprotocol>:<subname>
    

    Для IDS драйвера <subprotocol> это ids. <subname> часть URL идентифицирует БД, с которой необходимо соединиться, а также имя сервера на котором запущен IDS Server. Шаблон <subname> выглядит так:

    host_address/conn?dbms=odbc&dsn='data source'
    // host_address - IP адрес и порт где установлен
    // IDS Server, например
    // www.foo.com:12
    

    Пример осуществления соединения с базой данных:

    stUrl_="jdbc:ids://myServer:12/conn?dsn='myDSN'";
    Connection connection_ = DriverManager.getConnection(stUrl_,  "sa", "");
    // myDSN имя ODBC DSN
    // и myServer сервер на котором установлен IDS Server
    
  6. Проведение тестирования Для вычисления времени доступа к данным можно использовать приведенный ниже код, здесь осуществляется перебор всех записей.
    Statement statement_ = connection_.createStatement();
    long ldiff;
    java.util.Date dStart = new java.util.Date();  //время начала
    ResultSet rs  = statement_.executeQuery("SELECT * FROM myTable"); //выполнить запрос
    while(rs.next()); // перебрать все записи
    java.util.Date dEnd = new java.util.Date();  //время окончания
    ldiff = dEnd.getTime()-dStart.getTime();  //разница во времени
    statement_.close();
    

Заключение

IDS драйвер является хорошим выбором из-за маленького размера, невысокой цены и хорошей производительности.

Драйвер DataDirect SequeLink Java 5.0 компании MERANT

SequeLink Java5.0 является сертифицированным «чистым» Java драйвером, который поддерживает большинство известных платформ и СУБД. Это драйвер 3-го типа, который полностью реализует спецификацию JDBC 2.0, гарантирует обширную поддержку баз данных и полную совместимость с последними версиями популярных браузеров и Java серверов.

Драйвер включает в себя JDBC клиента и сервер доступа к данным. Он поддерживает операции мониторинга, управления и расширенные функции защиты и безопасности для MS SQL Server, Oracle и DB2 на OS/390 в централизованной конфигурации.

Пошаговые инструкции по использованию SequeLink JDBC драйвера следующие:

  1. Установка SequeLink Server Установить SequeLink Server на серверной машине и запустить сервер. SequeLink Server запускается на серверной машине в виде службы.
  2. Установка CLASSPATH Установить клиента SequeLink на клиентской машине. CLASSPATH должен содержать необходимые jar файлы. CLASSPATH  можно установить с командной строки так:
    Set CLASSPATH = %CLASSPATH%; <SequeLink install directory>\lib/sljc.jar
    
  3. Загрузка драйвера Для драйвера SequeLink, параметр метода forName() будет такой "com.merant.sequelink.jdbc.SequeLinkDriver". То есть вызов будет следующий:
    Class.forName("com.merant.sequelink.jdbc.SequeLinkDriver");
    
  4. Установка соединения с базой данных JDBC URL должен быть составлен по такому шаблону:
    "jdbc:sequelink://<host_address>:port number;databaseName=database name"
    
    host_address это IP адрес машины где запущен сервер SequeLink, а port это номер порта где установлен SequeLink Server (например www.foo.com:12).

    Соединение с базой данных можно осуществить так:

    "jdbc:sequelink://myServer:4006;databaseName=myDb";
    // Скажем myDb это имя базы данных в SQL Server
    // и myServer это сервер где установлен SequeLink Server
    
  5. Проведение тестирования Получить такие параметры как время установления соединения с базой данных, время доступа к данным и время вставки записи для драйвера SequeLink можно используя те же самые куски кодов приведенным в предыдущих секциях.

Заключение

SequeLink подойдет для организаций использующих различные клиентские приложения и гетерогенные базы данных. В этом случае этот драйвер будет лучшим решением, чем использование различных специфичных к СУБД и тонким клиентам JDBC драйверов.

Драйвер JTurbo компании Ashna

Как и любой другой драйвер 4-го типа, Ashna JTurbo не требует никаких установок на клиентской стороне. JTurbo разработан полностью  на Java и поэтому драйвер полностью портабелен на все операционные системы, включая платформы Microsoft Windows NT, HP-UX, Sun Solaris, IBM AIX, Digital Unix, AS/400, и OS/390. JTurbo это полностью выгружаемый из Интернет единичный бинарный файл, который работает в среде любой Java платформы. Более того, JTurbo мультизадачный драйвер с возможностью масштабирования на любое приложение уровня предприятия.

Для тестирования можно использовать следующие шаги:

  1. Установка CLASSPATH JTurbo поставляется в виде файла JTurbo.jar, который должен присутствовать в переменной CLASSPATH клиентской машины. С командной строки это можно задать так:
    Set %CLASSPATH% = %CLASSPATH%;<JTurbo install directory>\JTurbo.jar
    
  2. Загрузка драйвера Для JTurbo, параметр метода forName() выглядит как "com.ashna.jturbo.driver.Driver". То есть вызов может быть следующим:
    Class.forName("com.ashna.jturbo.driver.Driver");
    
  3. Установка соединения с базой данных JDBC URL должен быть составлен по следующему шаблону:
    jdbc:<subprotocol>:<subname>
    

    Для драйвера JTurbo, <subprotocol> это JTurbo. Часть URL <subname> указывает как на базу данных, с которой производится соединение, так и на имя сервера, где находится база данных. <subname> должен следовать шаблону:

    //<machine Name>/<database name>
    

    Соединение с базой данных можно установить так:

    stUrl_="jdbc:JTurbo://myServer/myDatabase";
    Connection connection_ = DriverManager.getConnection(stUrl_, "sa", "");
    
  4. Проведение тестирования Для проверки времени доступа к данным можно использовать нижеследующий код, в данном случае перебор записей не производится:
    Statement statement_ = connection_.createStatement();
    long ldiff;
    java.util.Date dStart = new java.util.Date();   //время начала
     //выполнить запрос
    ResultSet rs  = statement_.executeQuery("SELECT * FROM myTable");
    java.util.Date dEnd = new java.util.Date();   //время окончания
    ldiff = dEnd.getTime()-dStart.getTime();   //получить разницу
    statement_.close();
    

Заключение

JDBC драйвер JTurbo обеспечивает разработчика интерфейсом к MS SQL Server. В качестве драйвера 4-го типа, он обеспечивает высокую производительность совместно с платформенной независимостью. Драйвер поддерживает разработку Java апплетов без всяких зависимостей на стороне клиента.

Драйвер I-net Sprinta 2000 компании I-net Software

I-net Sprinta 2000 первый JDBC 2.0 драйвер для Microsoft SQL Server 2000. Он поддерживает новые типы данных присущие SQL Server 2000. Как драйвер 4-го типа, он не требует никаких установок на стороне клиента. Поддержка стандарта JDBC 2.0 является важным, так как драйвер предлагает набор новых свойств, таких как скроллируемость и обновляемость ResultSet и новые типы данных, которые позволяют разработчикам в полной мере использовать девиз Java платформы: "Напиши раз, запускай везде", для разработки промышленно-стабильных, кросс-платформенных приложений с доступом к данным масштаба предприятия.

Следуйте следующим шагам для использования драйвера:

  1. Установка CLASSPATH/> I-net Sprinta поставляется с несколькими .class файлами, которые должны присутствовать с переменной окружения CLASSPATH в клиентской машине. CLASSPATH можно задать из командной строки так:
    Set CLASSPATH = %CLASSPATH%;<I-net Sprinta 2000 install directory>
    
  2. Загрузка драйвера Для I-net Sprinta 2000, параметр метода forName() будет "com.inet.tds.TdsDriver". Вызов тогда будет таким:
    Class.forName("com.inet.tds.TdsDriver");
    
  3. Установка соединения с базой данных JDBC URL должен следовать шаблону:
    jdbc:<subprotocol>:<subname>
    
    Для этого драйвера, <subprotocol>  это inetdae. Часть URL <subname> указывает как на базу данных, с которой производится соединение, так и на имя сервера, где находится база данных. <subname> должен следовать шаблону:
    jdbc:inetdae:hostname:portnumber?database=MyDb
    

    Пример соединения с базой данных:

    stUrl_="jdbc:inetdae:myServer:1433?database=myDatabase";
    // Скажем, myDatabase имя базы данных
    // и myServer имя сервера где находится база данных
     Connection connection_ = DriverManager.getConnection(stUrl_, "sa", "");
    
  4. Проведение тестирования Приведенный ниже код можно использовать для вычисления среднего времени на вставку записи в базу данных. Таблица куда вставляются записи, имеет следующие поля: int, varchar(255), и datetime:
    Statement statement_ = connection_.createStatement();
    long ldiff;
    SimpleDateFormat sFormat = new SimpleDateFormat("dd-MMMM-yyyy HH:mm:ss:SSS");
    java.util.Date dStart = new java.util.Date();  //время начала
    for(int i=0;i<1000;i++)
    {
    String sDate = sFormat.format(new java.util.Date());
       String stInsert="INSERT INTO test VALUES ("+i+",'"+i+"', '" +sDate+"')";
       Statement_.execute(stInsert);
    }
    java.util.Date dEnd=new java.util.Date();  //время окончания
    ldiff=dEnd.getTime() - dStart.getTime();  //получить разницу
    

Заключение

I-net Sprinta 2000, можно динамически выгрузить через Интернет, не требует установки специального программного обеспечения ни на стороне клиента, ни на стороне сервера. Тоесть это хорошее решение для Интернет приложений.

Заключение

JDBC-ODBC бридж может рассматриваться только в качестве промежуточного решения. Для приложений большого масштаба необходимо рассматривать драйверы 2, 3 или 4 типа.

Для интранет приложений можно было бы рассматривать драйверы 2-го типа, но так как драйверы 3 и 4 типов показывают значительно лучшую производительность по сравнению с драйверами 2-го типа и развитие драйверов направлено в сторону разработки мощных 100% "чистых" Java драйверов, то можно было бы рекомендовать для интранет решений также драйверы 3 и 4 типов.

Для Интернет приложений альтернатив использованию драйверов 3 и 4 типа нет. Драйверы 3 типа больше подходят для ситуаций, когда требуется обеспечить соединение с различными СУБД, гетерогенными базами данных и когда большое количество одновременных пользователей, проивзодительность и масштабируемость являются узкими местами. Драйверы 4 типа в основном нацелены на использование внутри рабочих групп.

Об авторе

Нитин Нанда (Nitin Nanda) работает руководителем группы Индийского центра исследований и разработок компании Quark. Он отвечает за дизайн и разработку 3-х уровневого ПО, разрабатываемого на Java с использованием протокола RMI-IIOP. Перед этим он работал в компании Cadence Design System в качестве старшего члена технической команды.

Ресурсы

Reprinted with permission from the July 2000 edition of JavaWorld magazine. Copyright © ITworld.com, Inc., an IDG Communications company.
View the original article at: http://www.javaworld.com/javaworld/ jw-07-2000/jw-0707-jdbc.html

[an error occurred while processing this directive]
[an error occurred while processing this directive] Перевод на русский © Павел Иванов, 2003
< Вернуться на caйт :: Copyright © 1999 — 2010, IT • archiv.