Для очень простых случаев можно поместить бизнес-логику в хранимые процедуры. Обычно даже простые случаи имеют тенденцию быть сложными со временем. Вот причины, я не помещаю бизнес-логику в базу данных:
Помещение бизнес-логики в базе данных сильно связывает его к технической реализации базы данных. Изменение таблицы заставит Вас изменять много хранимых процедур, снова вызывающих много дополнительных ошибок и дополнительного тестирования.
Обычно UI зависит от бизнес-логики для вещей как проверка. Помещение этих вещей в базе данных вызовет плотное соединение между базой данных, и UI или в различных случаях копирует логику проверки между теми двумя.
станет трудным иметь несколько работа приложений на той же базе данных. Изменения для одного приложения заставят других повреждаться. Это может быстро превратиться в кошмар обслуживания. Таким образом, это действительно не масштабируется.
более практически SQL не является хорошим языком для реализации бизнес-логики понятным способом. SQL является большим для основанных на наборе операций, но он пропускает конструкции для "программирования в большом", трудно поддержать большие суммы хранимых процедур. Современные языки OO лучше подходят и более гибки для этого.
Это не означает, что Вы не можете использовать сохраненный procs и представления. Я думаю, что это иногда - хорошая идея поместить дополнительный слой хранимых процедур и представлений между таблицами и приложением (приложениями) для разъединения двух. Тем путем можно изменить расположение базы данных, не изменяя внешний интерфейс, разрешающий Вам осуществлять рефакторинг базу данных независимо.
Что касается части массива Java, документация Sun JNI включает этот комментарий, спрятанный в обсуждении строк:
Например, виртуальная машина Java может не хранить массивы непрерывно.
Что касается вашего последнего вопроса, если у вас есть два int []
, то каждый из этих массивов будет непрерывным блоком памяти, но они могли быть очень "далекими" в памяти. Если у вас есть массив объектов с двумя полями int, тогда каждый объект может быть далеко друг от друга, но два целых числа в каждом объекте будут близко друг к другу. Что еще более важно, вы в конечном итоге займете на много больше памяти с решением «много объектов» из-за накладных расходов на каждый объект. В .NET вы могли бы вместо этого использовать пользовательскую структуру struct с двумя целыми числами и иметь их массив, чтобы хранить все данные в одном большом блоке.
Я считаю, что и в Java, и в .NET , если вы размещаете много небольших объектов в быстрой последовательности в одном потоке, то эти объекты , вероятно, будут иметь хорошую локальность ссылки. Когда сборщик мусора сжимает кучу, это может улучшить - или потенциально может стать хуже, если куча с
A B C D E
сжимается до
A D E B
(где собирается C) - внезапно A и B, которые, возможно, были "
Во-первых, ваш заголовок подразумевает C #. «Управляемый код» - это термин, придуманный Microsoft, если я не ошибаюсь.
Примитивные массивы Java гарантированно представляют собой непрерывный блок памяти. Если у вас есть
int[] array = new int[4];
, вы можете из JNI (собственный C) получить int * p
, чтобы указать на фактический массив. Я думаю, это относится и к классу контейнеров Array * (ArrayList, ArrayBlockingQueue и т. Д.).
Я думаю, что ранние реализации JVM имели объекты как непрерывную структуру, но этого нельзя предполагать с новыми JVM. (JNI абстрагирует это.)
Два целых числа в одном объекте, как вы говорите, вероятно, будут «ближе», но могут и не быть. Это, вероятно, будет отличаться даже при использовании одной и той же JVM.
Объект с двумя полями int является объектом, а я не Не думаю, что любая JVM дает какие-либо гарантии, что участники будут «закрыты». Скорее всего, массив int с двумя элементами будет поддерживаться массивом длиной 8 байт.
Что касается массивов, вот выдержка из спецификации CLI (Common Language Infrastructure):
Элементы массива должны быть расположены внутри объекта массива в строчном значении порядок (т. е. элементы, связанные с крайним правым размером массива должны располагаться непрерывно от самого низкого до самого высокого индекса ). В фактическое хранилище, выделенное для каждого элемент массива может включать обивка для конкретной платформы. (Размер этого хранилища в байтах возвращается по размеру инструкции, когда это применяется к типу этого массива элементы.
Хороший вопрос! Думаю, я бы прибег к написанию расширений на C ++, которые обрабатывают память более тщательно управляемым образом и просто предоставляют достаточно интерфейса, чтобы остальная часть приложения могла манипулировать объектами. Если бы меня так беспокоила производительность, я бы, вероятно, все равно прибегнул к расширению C ++.
Я не думаю, что кто-то говорил о Python, поэтому попробую
Могу ли я ожидать, что массив будет соседним блоком памяти (да) ?
В Python массивы больше похожи на массивы указателей в C. Таким образом, указатели будут смежными, но фактические объекты маловероятны.
Два целых числа в одном экземпляре ближе, чем два в разных экземплярах тот же класс (вероятно)?
Вероятно, не по той же причине, что и выше. Экземпляр будет содержать только указатели на объекты, которые являются действительными целыми числами. Python не имеет собственного int (например, Java), только Int (на языке Java) в коробке.
Занимает ли объект непрерывную область памяти (нет)?
Вероятно, нет. Однако если вы используете оптимизацию __ slots __
, то некоторые ее части будут смежными!
What ' (этот пример, вероятно, специфичен для Java)
В Python с точки зрения локализации памяти они почти одинаковы! Один будет создавать массив указателей на объекты, который, в свою очередь, будет содержать два указателя на целые числа, другой - два массива указателей на целые числа.
Если вам нужно оптимизировать до этого уровня, я подозреваю, что язык на основе виртуальной машины не для вас;)