2016-11-18 3 views
4

Quote from the Jooq manual:Jooq/Java Константа бассейн предел 64K

Выключение генерации указанных файлов могут быть необходимы для очень больших схем, которые превышают количество разрешенных констант в постоянного пула класса (64k) или, чей статический инициализатор будет превышать 64К байт-код

Я понимаю вопрос, но как одну меру или план для этого. У кого-то есть хорошая оценка того, сколько таблиц с количеством столбцов на таблицу с разумной средней длиной имени? Я действительно ценю тот факт, что это вопрос типа «длинных строк», но любая формула разумной точности или хорошо оцененная оценка.

ответ

7

Генератор кода JOOQ добавляет поле в таблицу/последовательность/ключ в базу кода. Генератор кода уже гарантирует, что код устанавливает это поле, но не создает сложный оператор, что уменьшает размер кода. Поскольку поле является статическим, это дополнительно уменьшает требуемый байтовый код. Каждая инструкция инициализации представляет собой пару прочитанного поля и полевую запись. В байт-код, каждая такая инструкция:

GETSTATIC (reference) 
PUTSTATIC (reference) 

байт-код представляет собой один байт, где каждая ссылка поле является индексом два байта делая каждый счет 6 команд байт. Поскольку для статического инициализатора требуется закончить с помощью (неявного) оператора return, это добавляет еще один байт к методу. С доступными байтами на 64 КБ - 1 Б в каждом методе и 6 байтами на поле это говорит нам о том, что инициализатор может содержать не более 10.922 таких полей для каждого класса, прежде чем пересекать лимит, т. Е. Поддерживать не более (65536 - 1)/6 = 10.922 таблиц, последовательностей или ключей.

constant pool может содержать не более 65536 записей. Вычисление предела немного сложнее, так как постоянный пул не содержит повторяющихся значений, но повторно использует существующую запись. Мы делаем расчет для наихудшего случая, когда имена не используются более одного раза.

Каждая ссылка на поле является составной частью ссылки на класс и ссылкой на имя и тип. Ссылка на класс содержит другую ссылку на строку с именем типа. Ссылка на имя и тип содержит две ссылки на имя поля и дескриптор поля в виде строки. Тип владельца заданной команды всегда дублируется, мы предполагаем, что команда get в худшем случае никогда не дублируется, составляя 2 записи на пару команд. Типы и имена полей set и get всегда равны для каждой пары команд, что составляет две записи для каждой пары команд. Запись имени и типа обертки всегда уникальна для обеих сторон, при этом учет двух записей на пару команд. Это оставляет нам 2 + 1 + 1 + 2 = 6 записей за пару команд. Тип владельца заданной команды всегда будет находиться в постоянном пуле, так как требуется определить класс. Кроме того, мы должны учитывать основную информацию, такую ​​как имя определенного класса и его конструктор по умолчанию. К счастью, аннотации имеют задержку источника, так что они исключены из файла класса. Общая уборка требует 12 записей, что оставляет нам (65536 - 12)/6 = 10.920 таблиц, последовательностей или ключей.

Мы должны соблюдать оба предела, поэтому 10.920 таблицы, последовательности или ключи - это номер, на который вы связаны.

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

Смежные вопросы