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

суббота, 26 ноября 2011 г.

Berkeley DB Java Edition, ч.3

Импортировал в БД 7 записей, исходный файл занимал 2Кб, при том что большая часть это вспомогательный мусор, который в базу никоим образом попасть не может. Реальный объем данных - байт 100, не больше.

 

База после импорта заняла 100Кб. Проверил программу - ничего лишнего я туда не толкаю. Буду надеяться, что это просто резервируется место и следующие 7777 записей займут столько же сколько заняли 7. Иначе придется плотно разбираться что это за ерунда такая .

пятница, 11 ноября 2011 г.

Подземный стук

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

 

Тем временем переделал серверную часть. В место программного поллинга сокетов (который грузил сервер на 100% просто так, ничего не делая) использовал SocketChannel. Серверу сразу полегчало. Вполне возможно что и мышиные проблемы росли оттудова же. Поскольку сервер и клиент на одной машине.

 

Отдельного доброго слова заслуживают разработчики ObjectInputStream. Конструктор, блокирующий исполнение - это что-то новое в моей небогатой практике. Они не могли потерпеть и выполнить первое чтение из InputStream при первом обращении к функции чтения? Пока писал, понял почему не захотели. Функций чтения у ObjectInputStream много, не хотелось им в каждую вставлять лишнюю строчку вида if (!checkInputHeader()) throw new BadDataException().

 

А вот авторам этих двух туториалов настоящее спасибо:

Действительно помогли разобраться

 

Вообще с этими объектными потоками проблем было больше чем с каналами. Очевидно им не хватает простой, очевидной вещи - буфферизации и функции isObjectReady(). Т.е. при вызове этой функции из потока должен считываться очередной объект, и если он полностью считан, то возвращается true. Если нет - естественно false. А готовый объект, или некие промежуточные недочитанные данные ложатся  в буфер для дальнейшей обработки.

 

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