пятница, 11 сентября 2009 г.

SQLJet 1.0.0 beta

Проект, которым я был практически полностью занят последнее время, SQLJet, достиг стадии beta 1.0.0. Это достаточно амбициозный проект, призванный создать pure Java реализацию механизма баз данных SQLite.

Причина, по которой такой проект имеет смысл, заключается во все более возрастающей популярности использования SQLite в качестве формата данных для приложений. Например, так поступают Firefox и Skype. Но это еще пол беды, настоящая беда в том, что так поступили и Subversion, а это уже, я бы сказал, хуже. Хуже потому, что существует фактически только одна реализация SQLite и сделана она на языке Си, со всеми вытекающими из этого обстоятельства последствиями (как хорошими так и, к сожалению, плохими). Одним из таких достаточно плохих последствий является зависимость от платформы. Иногда такая зависимость становится серьезной проблемой. Особенно остро это чувствуется в случае необходимости доступа к данным в формате SQLite из среды JVM. Да, существуют варианты (я тестировал http://www.zentus.com/sqlitejdbc/) использования SQLite через JNI или даже эмулятор NestedVM. Однако, эти варианты имеют свои недостатки. Поэтому настоящая чистая реализация формата данных SQLite в среде JVM, на мой взгляд, имеет очень серьезные перспективы.

В данный момент SQLJet имеет, как минимум, два очевидных преимущества для использования в качестве pure Java SQLite-engine:

1. Более высокая производительность. Разумеется, по сравнению только с именно pure Java реализациями, из которых в настоящий момент, кроме SQLJet, существует только основанная на NestedVM эмуляция.

Вот вывод запуска простого сравнения производительности на базе тестов JUnit, которые я использовал для оптимизации SQLjet:

[junit] Testsuite: org.tmatesoft.sqljet.benchmarks.SqlJetBenchmark
[junit] Tests run: 7, Failures: 0, Errors: 0, Time elapsed: 11,935 sec
[junit] Testcase: nothing took 0,59 sec
[junit] Testcase: updateAll took 2,509 sec
[junit] Testcase: deleteAll took 0,491 sec
[junit] Testcase: insertRandoms took 2,89 sec
[junit] Testcase: clear took 0,21 sec
[junit] Testcase: locate took 4,534 sec
[junit] Testcase: selectAll took 0,482 sec

[junit] Testsuite: org.tmatesoft.sqljet.benchmarks.NestedVmBenchmark
[junit] Tests run: 7, Failures: 0, Errors: 0, Time elapsed: 62,108 sec
[junit] Testcase: nothing took 1,612 sec
[junit] Testcase: updateAll took 4,001 sec
[junit] Testcase: deleteAll took 1,065 sec
[junit] Testcase: insertRandoms took 4,821 sec
[junit] Testcase: clear took 0,664 sec
[junit] Testcase: locate took 46,961 sec
[junit] Testcase: selectAll took 2,874 sec

2. Возможность создания расширений и специфической обработки данных в среде JVM. При использовании SQLite через JNI или даже посредством NestedVM, при необходимости создания расширений к SQLite Вам придется это делать тоже на Си что не всегда имеет смысл. Именно в этом случае SQLJet открывает полный контроль над обработкой данных - Вам ничто не мешает вызывать любой Ваш код на любой стадии работы с данными. Вы полностью контроллируете все аспекты работы Вашего приложения с Вашими данными. Я считаю, это очень серьезное преимущество, по крайней мере, в некоторых случаях.

P.S. Да, совсем забыл сказать что SQLJet уже реально используется в новом SVNKit (очень хороший продукт кстати, рекомендую).

2 комментария:

  1. Сергей, здравствуйте. Очень заинтересовался Вашим SqlJet, стал делать тестик, прямо по опубликованному tutorial. И обнаружил вылеты по ошибке при любой операции с собственно базой (beginTransaction, getOptions).
    Среда win Vista, NetBeans, java 1.6.
    Не могли бы Вы прокомментировать ситуацию?

    ОтветитьУдалить
  2. to blackmittel:

    Если не затруднит, сделайте пожалуйста следующее:

    1. Перейдите по ссылке
    http://code.google.com/p/sqljet/issues/entry

    2. и приведите Ваш код. я уже понял что он по tutorial, но все же покажите код, так будет проще.

    3. Обязательно приведите свои stacktraces.

    Спасибо большое.

    В крайнем случае можете сделать это же, прямо здесь.

    ОтветитьУдалить