четверг, 16 июня 2011 г.

MySQL: Получение значение ID добавляемой записи при генерации этого ID с помощью auto_increment

Добрый день.
Когда Вы работаете с MySQL, то так или иначе Вам необходимо работать с записями, имеющими уникакльный ID.
Для ряда таблиц такого рода ID генерируется автоматически, путем использования директивы auto_increment.
Иногда необходимо знать, а какой же ID получился для только что добавленных данных ...
Сделать это можно просто, а именно воспользоваться встроенной в MySQL ф-й LAST_INSERT_ID(), которая возвращает ID добавленных данных.
Для примера:

mysql> SELECT LAST_INSERT_ID();
+------------------+
| LAST_INSERT_ID() |
+------------------+
| 33 |
+------------------+
1 row in set (0.00 sec)

Показывает, что последнаяя добавленная запись имела ID 33.

среда, 20 апреля 2011 г.

Java - собственные исключения

Добрый день.
Сегодня мы коротко поговорим о механизме исключений в Java.
Причем не просто о механизме как таковом, а о том, зачем необходимы собственные исключения и как их использовать на практике.
Итак - начнем с азов. Исключение (Java) — это некий объект, описывающий исключительное состояние, воз­никшее в каком-либо месте работы программы.
При этом (при возникновении исключения) создается объект класса Exception.
Затем может быть несколько вариантов развития событий:
1) Исключение не обрабатывается, то есть для данного участка кода нет обработчика соот. типа исключения.
В этом случае происходит завершение работы потока, в котором произошло исключение.
2) Исключение обрабатывается, и в этом случае управление передается в блок обработки исключений или-же в блок финализации.
Для примера:
try
{
// участок, где мы ожидаем исключение
}
catch (ИсключениеА еxt)
{
// обработчик Исключения А
}
catch (ИсключениеБ еxt)
{
// обработчик Исключения Б
}
finally
{
// блок финализации, который должен всегда выполняться.
}
Со стандартными исключениями все просто. Они определены и их обработка - это рутина
программирования.
Но в Java можно определять о обрабатывать свои исключения.
Сделано это по многим причинам, но одно из основных применений этой возможности
мы сейчас рассмотрим.
Итак - есть некое приложение, в котором есть некая процедура,
обрабатывающая некие, полученные извне, данные.
Так или иначе, данные могут быть некорректны (к примеру вместо число - строка и др.)и
состояние (некорректности входящих данных) необходимо обработать.
Это сделать можно множеством путей, одним из которых есть использование механизма
исключений.

// класс собственного исключения, описывающего некорректность пары ключ <> значение
class ParceError extends Exception
{
String KeyName,KeyValue;
// конструктор
ParceError(String inKeyName,String inKeyValue)
{
KeyName = inKeyName;
KeyValue = inKeyValue;
}
// конструктор по умолчанию
ParceError()
{
this("not","not");
}
// view
public String toString()
{
return "KeyName="+KeyName+" "+"KeyValue="+KeyValue;
}
}
// расшифровка ключей
// мы указываем, что наша процедура может генерировать исключение ParceError
// которое необходимо обработать
DecodeKeys(HashMap In,String Data) throws ParceError
{
// ..
// в случае некорректности некой пары ключ <> значение
// генерируем исключение
throw new ParceError(Key,Value);
// ..
}
try
{
Result = DecodeKeys(Result,Data);
}
catch (ParceError ext)
{
// обрабатываем сгенерированное исключение
}

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

четверг, 7 апреля 2011 г.

Java - поток демона (автоматическое завершение дочерних потоков)

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

1) В ручном режиме "гасить" дочерние потоки.
2) Сделать это автоматически.

Про первый случай мы говорить не будем.
Поговорим про второй.
Для того, что-бы дочерние потоки завершались сами при завершении родительского потока,
необходимо дочерние потоки объявить как потоки демона.

Для примера:
Простой поток мы порождаем:

SimpleThread = new Thread(this,"Simple Thread");
SimpleThread.start();

Поток демона мы описывает так:

SimpleThread = new Thread(this,"Simple Thread");
SimpleThread.setDaemon(true);
SimpleThread.start();

Для проверки того, является ли поток потоком демона применяется метод isDaemon().
Возвращаемое значение - boolean.

Также необходимо пару слов сказать о области применения такого рода потоков. Чаще всего применять этот тип в том случае, когда отдельный поток должен делать некую работу, но только тогда, когда работает основное приложение.
Самый ходовой пример - менеджер заметок.