Рубрика «jdbc» - 2

Незаслуженно обошли вниманием появление SQL JOIN операций в проекте на основе Elasticsearch — Crate.io
SQL JOIN, Elasticsearch и установка из binary repository manager - 1
Читать полностью »

Незаслуженно обошли вниманием появление SQL JOIN операций в проекте на основе Elasticsearch

JOIN the dark side of the SQL - 1
Читать полностью »

В этой статье я расскажу о решении проблемы кодогенерации при разработке приложений для СУБД Oracle. Хотя написанное ниже можно частично применить и к другим СУБД, и для генерации не только кода.

Проблема

При разработке приложений иногда возникают ситуации, когда требуется написать много похожих кусков кода, которые в силу различных ограничений нельзя заменить одной универсальной программной единицей. Следуя принципу DRY, вместо того чтобы копировать похожие фрагменты кода вручную с заменой отличающихся частей, лучше воспользоваться техникой кодогенерации из статичных заготовок на основе метаданных, вносящих разнообразие в получившиеся экземпляры кода. К кодогенерации приходится прибегать как в develop/deploy-time (когда все вариации известны заранее и есть возможность создать весь спектр экземпляров кода в статичном виде), так и в runtime, когда код генерируется на основе неизвестных заранее данных и сразу же исполняется.

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

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

  • формирование SQL/DML/DDL-выражений на основе пользовательского выбора;
  • создание процедуры загрузки в систему-приемник очередного источника данных по его метаописанию в удаленной (remote) системе-источнике;
  • разворачивание системы в разных окружениях, версиях и редакциях СУБД, где необходимо (де)активировать некоторые опции или создать вспомогательные объекты: например, при разворачивании Oracle-приложения на редакции EE секционировать таблицы и строить локальные индексы; или при разворачивании на версии Oracle ниже 11 вместо виртуальных колонок и индексов по ним создавать представления-обертки с дополнительными вычислимыми колонками и строить function-based-индексы.

Читать полностью »

Добрый день.

Я занимаюсь IT-образованием.
В данный момент готовлю курс «JDBC for Java Developer» для одной западной MOOC-платформы. Думаю этот детальный план может быть полезен кому-то для подготовки к собеседованию.

По некоторому размышлению выходит, что за 4-5 часов видео (стандартный формат на платформе) максимум полезного, что можно рассказать в 5-10 минутных кусочках, попадает в Первую часть (6 тем: «Intro», «Connect to database», «Query database», «ResultSet», «Optimizations», «Transactions» + 35 вложенных подтем).

Ценное, но не помещающееся, пошло во Вторую часть (3 темы: «ThreadLocal Tx-Manager», «Distributed Transactions», «Query Meta-Information» + 10 вложенных подтем).

Ожидается, что слушатель после курса будет готов приступить к технологиям «следующего уровня» после JDBC — Spring JDBC Template, JavaEE transactions, ORM.

Знаю, что разумное замечание состоит в том, что можно «просто почитать JDBC 4.2 Specification». Да, можно. Этот план и строится как анализ спецификации + предлагаемые целевые варианты использования (Dao Patter, TxManager, Connection pooling, ...).

Читать полностью »

Оригинал статьи носит название «10 SQL ошибок, которые делают Java разработчики», но, по большому счёту, приведённые в ней принципы можно отнести к любому языку.

10 потенциальных SQL ошибок, которые делают программисты

Java программисты мешают объектно-ориентированное и императивное мышление в зависимости от их уровня:
— мастерства (каждый может программировать императивно)
— догмы (шаблон для применения шаблонов где-либо и их именование)
— настроения (применять истинный объектный подход немного сложнее чем императивный)

Но всё меняется, когда Java разработчики пишут SQL код.
Читать полностью »

Некоторое время назад, я написал статью посвященную вопросам оптимизации загрузки данных в БД Oracle. Судя по обилию последовавших комментариев, статья вызвала живой интерес, но, судя по тем-же комментариям (а также последовавшей статье о загрузке данных в PostgreSQL) многими она была понята не так, как я на то рассчитывал. По большей части, виноват в этом я сам, поскольку, в процессе упрощения изложения материала, оторвался от жизни настолько, что задача перестала быть понятна окружающим (это, в свою очередь, негативно сказалось на понимании причин выбора методов, использованных для ее решения).

Сегодня, я хочу исправить допущенные ошибки. Я расскажу о реальной задаче обработки данных SNMP-мониторинга, уделяя максимальное внимание техническим подробностям. Я постараюсь обосновать выбор подходов для ее решения и сравнить их производительность. Также, я уделю внимание тем техническим моментам, которые могут вызвать сложности у новичков. Прежде чем двигаться дальше, я хочу выразить свою признательность DenKrep, xlix123, zhekappp и всем прочим товарищам, давшим невероятное количество полезных советов, в процессе обсуждения предыдущей статьи.
Читать полностью »

В своей предыдущей статье я показал, что при использовании асинхронных запросов, скорость опроса устройств по протоколу SNMP может достигать 9000 запросов в секунду (при условии, что у нас есть достаточное количество устройств для формирования такого потока ответов). Вопрос о том, что делать с этим потоком данных остался открытым.

Обычной практикой является обработка данных мониторинга посредством RDBMS (таких как Oracle Database). Но способны ли традиционные реляционные базы данных справиться с такой нагрузкой? Попробуем в этом разобраться.
Читать полностью »

В PHPStorm есть встроенная возможность подключения автодополнения имен таблиц и полей в редакторе кода, однако не все об этом знают.

Автодополнение SQL кода прямо в редакторе PHPStorm

Если у вас код отображается примерно так, то прошу под кат.
Читать полностью »

Поддержка транзакций, тестового окружения и другие удобные надстройки над commons-dbutils.

Поддержка транзакций, тестового окружения и другие удобные надстройки над commons dbutils"/>
  Если обращение к RDBMS вашего проекта ведется не через ORM или Spring JdbcTemplate, то работу через голый JDBC может сильно скрасить commons-dbutils.
Особенно если его надстроить транзакциями, работой с разными окружениями, авто-открытием/закрытием ресурсов, запрсами read-only, обработкой SqlException, возвратом pk при вставке и т.д.
Т.е, например, чтобы можно было бы сделать так:

int userId = Sql.queryForValue("SELECT ID FROM OU.USERS WHERE LAST_NAME=?", "IVANOV");
Sql.update("DELETE FROM OU.USERS WHERE FIRST_NAME=? AND LAST_NAME=?", fname, lname);
List<User> list = Sql.query("SELECT FROM OU.USERS", USER_LIST_HANDLER);
int newId = Sql.insert("INSERT INTO OU.USERS VALUES (?,?)", fname, lname);

И этот код работал бы внутри транзакции, через Application Server Connction pool и в JUnit без изменений и mock-ов.
За чуть меньше года моей работы с commons-dbutils он оброс различными классами и утильными методами, о которых и хочу здесь рассказать.
Читать полностью »

Как известно, Caché можно использовать как реляционную СУБД, в том числе через JDBC/ODBC драйверы, с возможностью исполнения произвольных SQL-запросов и вызова SQL-процедур.
Известно также, что все данные в Caché хранятся в многомерных разреженных массивах — глобалах. Это позволяет в случае недостаточной производительности отдельно взятой SQL-процедуры не использовать стандартный CachéSQL-движок, а переписать ее код исполнения на языке серверной бизнес-логики Caché ObjectScript (COS), в котором можно реализовать оптимальный алгоритм выполнения SQL-процедуры, часто используя более оптимальные NoSQL-структуры данных (глобалы).
Однако в стандартной библиотеке классов Caché существует одно ограничение: для SQL-процедур, в которых отбор выполняется самописным COS-кодом, необходимо определять набор возвращаемых полей на этапе компиляции — т.е. нет возможности динамически задать метаданные для SQL-процедуры, работающей с NoSQL структурами.

О том, как снять это ограничение, рассказано под катом.
Читать полностью »


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js