January
2008
Даже если ваш проект использует новейшие разработки в области кросс-платформенного ПО, рано или поздно придется столкнуться с технологиями, с которыми не очень хотелось сталкиваться.
Так случилось и со мной, когда заказчик захотел получать отчеты в виде базы данных MS Access.
Пришлось порыться в поисках java-библиотеки для работы с форматом mdb.
О результатах своих поисков я и хочу вам рассказать.
Первое, что пришло на ум - JDBC-ODBC Bridge. Стандартная реализация находится в JDK - класс sun.jdbc.odbc.JdbcOdbcDriver - это драйвер, с помощью которого можно общаться с файлами mdb.
Но данный подход был отвергнут сразу, так как этот мост работает через msjet40.dll. То есть на Linux это работать не будет.
Второй вариарт - использование pure JDBC драйвера. Хорошей библиотекой для этого является HXTT Access. Но у нее есть один недостаток - она платная. Evaluation версия работает 30 дней и не позволяет выполнять более 50 запросов на одно соединение. Да и не серьезно как-то использовать нелицензионные версии библиотек для коммерческих продуктов (вот все остальное - можно, сказал c0nst незаметно сворачивая Idea в taskbar Windows).
Для тех, кто все же решит использовать эту библиотеку - выполнение create database if not exists создавало новый файл mdb, который потом корректно не открывался. Возможно, это очередное ограничение на использование пробной версии. Workaround - лучше создать пустую базу, например template.mdb, а потом ее копировать и уже тогда использовать копию для своих нужд.
Наконец, взгляд был брошен на open source сообщество. В частности была обнаружена библиотека с оригинальным названием jackcess.
API библиотеки достаточно прозрачное. Никаких глюков не обнаружено. Со скоростью есть небольшие проблемы: с ростом базы данных скорость записи уменьшается. 500 тысяч записей писало около 4-х часов, тогда как 50 тысяч - около 10-ти минут.
О нюансах использования библиотеки можно почитать на сайте проекта. Я лишь хочу дать минимально представление об ее использовании.
Итак, для создания новой базы данных (или открытия старой) используется следующая конструкция:
File file = new File("d:/test.mdb")
Database db = Database.create(file);
Чтобы создать новую таблицу, необходимо сперва описать все колонки, из которых она будет состоять:
Listcolumns = new ArrayList (); Column col = new Column(); col.setName("Mobile"); col.setSQLType(Types.VARCHAR); columns.add(col);
Для установки типов используйте Types из пакета java.sql. Для типа MEMO подойдет LONGVARCHAR.
Непосредственно создание новой таблицы:
db.createTable("tabl", columns);
Для того, чтобы создать запись в таблице, нужно выполнить следующий код:
Table newTable = db.getTable("tabl");
newTable.addRow(new Object[] {"value"});
Ну и последнее, базу данных после работы необходимо закрывать:
db.flush(); db.close();
Самое главное - не забыть выполнить flush, особенно если сразу после наполнения базы данными необходимо отдать mdb-файл пользователю на скачивание или использовать внутри приложения для других целей. В первый раз я совершил такую ошибку и сразу закрывал базу данных. Результат - скачивался недописанный файл.
Если вы знаете еще какие-нибудь библиотеки для работы с MS Access, пишите - обсудим.
Всего хорошего.
9 Comments »
RSS feed for comments on this post.
А я бы посоветовал бы использовать биплатный хибернэйт. Правда
там почему-то нет соответствующего диалекта. Однако это не беда, можно и свой отнаследовать от стандартного Dialect, по типу этого -
SQL dialect for Microsoft Access.
Не так много работал с hibernate, но, если я не ошибаюсь, hibernate использует jdbc драйвер. А с драйверами для access’а проблемы.
Samsonych ну вы и предложили из пушки по воробьям. Я долго работал с Hibernate и думаю, что не ошибусь, утверждая, что данное решение лучше всего подходит для больших приложений из сферы J2EE. Мне трудно представить себе Java приложение, работающее с Access которому необходимо тащить за собой в зависимостях хибернейт. Все-таки если надо 3 связанных таблички замапить можно и что-то полегче взять (да и даже как вариант свое написать), а если нужно что-то сложнее, то зачем Access?
Да, хибернейт тут не нужен.
Есть другая тема - можно генерировать специфический для MS Access SQL в текстовом формате, а потом из базы его импортировать. Это и по скорости генерации будет классно и для клиента не очень напряжно :). Если дойдут до этого руки, обязательно выложу код генератора.
2 Samolisov Pavel:
В общем вы конечно правы насчет тяжеловесности hibernate для данного приложения. Я просто исходил из беспланости и кросссубдшности решения. Хотя согласитесь использование MS Access в качестве контейнера под Linux - выглядит несколько извращенно. В данном случае отлично подошел бы hsqldb. А если приложение будет использоваться только под виндой, то можно и jdbc-odbc мостом обойтись.
>> Хотя согласитесь использование MS Access в качестве контейнера под Linux - выглядит несколько извращенно.
Согласен с вами, тем более ходят слухи что в 2009м офисе MS отказывается от Access в пользу MS SQL Server Expres. А сейчас очень пиарит SQL Server Compact.
Кстати не знаток, а есть кросс-платформенная файл-ориентированная СУБД?
Hibernate использует jdbc драйвера для коннектов к базам. Так что он не то что не нужен, он никак не поможет, даже если очень захочет ![]()
Вариантов файл-ориентирванных баз данных довольно много. В т.ч. реализованных на чистой яве. HSQLDB - яркий пример) В IBM есть даже продакшн разработка на эту тему.
Народ ктонибуть знает как сделать чтобы вордпресс работал с акцесовскими базами. нужно чтобы таблицы выводились на разных страницах с одной базы.