Как делают Вас данные конфигурации структуры в базе данных?

В Java все переменные, которые вы объявляете, на самом деле являются «ссылками» на объекты (или примитивы), а не самими объектами.

При попытке выполнить один метод объекта , ссылка просит живой объект выполнить этот метод. Но если ссылка ссылается на NULL (ничего, нуль, void, nada), то нет способа, которым метод будет выполнен. Тогда runtime сообщит вам об этом, выбросив исключение NullPointerException.

Ваша ссылка «указывает» на нуль, таким образом, «Null -> Pointer».

Объект живет в памяти виртуальной машины пространство и единственный способ доступа к нему - использовать ссылки this. Возьмем этот пример:

public class Some {
    private int id;
    public int getId(){
        return this.id;
    }
    public setId( int newId ) {
        this.id = newId;
    }
}

И в другом месте вашего кода:

Some reference = new Some();    // Point to a new object of type Some()
Some otherReference = null;     // Initiallly this points to NULL

reference.setId( 1 );           // Execute setId method, now private var id is 1

System.out.println( reference.getId() ); // Prints 1 to the console

otherReference = reference      // Now they both point to the only object.

reference = null;               // "reference" now point to null.

// But "otherReference" still point to the "real" object so this print 1 too...
System.out.println( otherReference.getId() );

// Guess what will happen
System.out.println( reference.getId() ); // :S Throws NullPointerException because "reference" is pointing to NULL remember...

Это важно знать - когда больше нет ссылок на объект (в пример выше, когда reference и otherReference оба указывают на null), тогда объект «недоступен». Мы не можем работать с ним, поэтому этот объект готов к сбору мусора, и в какой-то момент VM освободит память, используемую этим объектом, и выделит другую.

24
задан Ola Eldøy 10 November 2011 в 13:47
поделиться

17 ответов

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

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

21
ответ дан RB. 28 November 2019 в 23:18
поделиться

Я использую соединение опции 2 и столбцов XML в SQL-сервере. Вы можете также wan't для добавления проверочного ограничения для хранения таблицы в одной строке.

CREATE TABLE [dbo].[MyOption] (
  [GUID] uniqueidentifier CONSTRAINT [dfMyOptions_GUID] DEFAULT newsequentialid()  ROWGUIDCOL NOT NULL,
  [Logo] varbinary(max) NULL,
  [X] char(1)  CONSTRAINT [dfMyOptions_X] DEFAULT 'X' NOT NULL,
  CONSTRAINT [MyOptions_pk] PRIMARY KEY CLUSTERED ([GUID]),
  CONSTRAINT [MyOptions_ck] CHECK ([X]='X')
)
0
ответ дан Tom 28 November 2019 в 23:18
поделиться

Я голосую за опцию 2. Легкий понять и поддержать.

0
ответ дан Andrew Cowenhoven 28 November 2019 в 23:18
поделиться

Опция 1 хороша для легко расширяемого местоположения централизованного хранения. В дополнение к некоторым большим предложениям столбца людьми как RB, Hugo, и elliott, Вы могли бы также рассмотреть:

Включают флаг установки Global / User с пользовательским полем или даже полем пользователя/машины (для определенных для машины настроек типа UI).

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

0
ответ дан Doug L. 28 November 2019 в 23:18
поделиться

Я использовал и 1 и 2 в прошлом, и я думаю, что они - оба ужасные решения. Я думаю, что Опция 2 лучше, потому что она позволяет вводить, но это намного более ужасно, чем опция 1. Самой большой проблемой, которую я имею с любым, является управление версиями файл конфигурации. Можно присвоить версию SQL, обоснованно хорошо использующему системы управления стандартной версии, но объединяющий изменения обычно проблематично. Учитывая возможность сделать это правильно, я, вероятно, создал бы набор таблиц, один для каждого типа параметра конфигурации (не обязательно для каждого параметра самого), таким образом извлекая пользу из ввода и преимущество парадигмы ключа/значения в соответствующих случаях. Можно также реализовать более усовершенствованные структуры этот путь, такие как списки и иерархии, которые тогда будут непосредственно queryable приложением вместо того, чтобы иметь необходимость загрузить конфигурацию и затем преобразовать его так или иначе в память.

0
ответ дан rmeador 28 November 2019 в 23:18
поделиться

Я пошел бы с опцией 1, если количество опций конфигурации не было ОЧЕНЬ маленькое (семь или меньше)

0
ответ дан James Curran 28 November 2019 в 23:18
поделиться

В моей компании мы работаем над использованием опции одна (простая подобная словарю таблица) со скручиванием. Мы позволяем, чтобы строковая замена использовала маркеры, которые содержат название переменной конфигурации, которой заменят.

, Например, таблица могла бы содержать строки ('строка соединения с базой данных', 'jdbc://%host %...') и ('хост', 'foobar'). Инкапсуляция этого с простым сервисом или слоем хранимой процедуры допускает чрезвычайно простую, но гибкую, рекурсивную конфигурацию. Это поддерживает нашу потребность иметь несколько изолированных сред (dev, тест, напоминание, и т.д.).

0
ответ дан Jeb 28 November 2019 в 23:18
поделиться

Я могу думать о еще по крайней мере двух путях:

(a) Составляют таблицу с ключом, строковым значением, значением даты, международным значением, столбцами действительного значения. Оставьте неиспользованный ПУСТОЙ УКАЗАТЕЛЬ типов.

(b) Использование формат сериализации как XML, YAML или JSON и хранилище все это в блобе.

2
ответ дан jakber 28 November 2019 в 23:18
поделиться

Пойдите с опцией 2. Опция 1 является действительно способом реализовать базу данных сверху базы данных, и это - известный антишаблон, который просто собирается дать Вам проблему в конечном счете.

2
ответ дан JacquesB 28 November 2019 в 23:18
поделиться

Мой проект использует таблицу базы данных с четырьмя столбцами:

  1. идентификационный [pk]
  2. Объем ('Приложение' по умолчанию)
  3. Значение Установки

Настройки с Объемом 'Приложения' являются глобальными настройками, такими как Максимальное количество одновременных пользователей.

Каждый модуль имеет свой собственный базирующийся объем; таким образом, наш ResultsLoader и UserLoader имеют различные объемы, но у обоих есть Установка, названная 'inputPath'.

Значения по умолчанию или обеспечиваются в исходном коде или введены через наш контейнер МОК. Если никакое значение не введено или обеспечено в базе данных, значение по умолчанию от кода используется (если Вы существуете). Поэтому значения по умолчанию никогда не хранятся в базе данных.

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

3
ответ дан Elliot 28 November 2019 в 23:18
поделиться

Я предполагаю, что это - больше опроса, таким образом, я скажу подход столбца (опция 2). Однако это будет зависеть от того, как часто Ваша конфигурация изменяется, насколько динамичный это, и сколько данных, там, и т.д.

я, конечно, использовал бы этот подход для пользовательских конфигураций / предпочтения, и т.д.

3
ответ дан Ady 28 November 2019 в 23:18
поделиться

Это кажется излишеством для использования DB для данных конфигурации.

РЕДАКТИРОВАНИЕ (извините слишком долго за поле комментария): Конечно, нет никаких строгих правил о том, как Вы реализуете любую часть своей программы. Ради аргумента вставленные отвертки работают над некоторыми винтами Philips! Я предполагаю, что судил слишком рано прежде, чем знать, каков Ваш сценарий.

Реляционная база данных выделяется в значительном хранилище данных, которое дает Вам быстрое хранение, обновление и извлечение, поэтому если Ваши данные конфигурации обновляются и постоянно считываются, то любой ценой используют дб.

Другой сценарий, где дб может иметь смысл, - когда у Вас есть ферма сервера, где Вы хотите, чтобы Ваша база данных сохранила Вашу центральную конфигурацию, но тогда можно сделать то же с общим сетевым диском, которые указывают на xml файл конфигурации.

XML-файл лучше, когда Ваша конфигурация иерархически структурирована. Можно легко организовать, определить местоположение и обновить то, в чем Вы нуждаетесь, и для бонусного преимущества Вы можете управление версиями файл конфигурации наряду с Вашим исходным кодом!

, В целом, все это зависит от того, как данные конфигурации используются.

, Который завершает мое мнение с ограниченными знаниями Вашего приложения. Я уверен, что можно принять правильное решение.

4
ответ дан Haoest 28 November 2019 в 23:18
поделиться

Я использую опцию 1.

4
ответ дан johnstok 28 November 2019 в 23:18
поделиться

Так как конфигурация обычно может храниться в текстовом файле, типа данных String должно быть более чем достаточно для хранения значений конфигурации. При использовании управляемого языка это - код, который знает, каков тип данных должен быть, не база данных.

, Что еще более важно, рассмотрите эти вещи с конфигурацией:

  • Иерархия : Очевидно, конфигурация извлечет выгоду из иерархии
  • Управление версиями : Рассмотрите преимущество способности откатывать к конфигурации, которая была в действительности в определенную дату.
  • Распределение : Некоторое время, могло бы быть хорошо быть в состоянии кластеризировать приложение. Некоторые свойства должны, вероятно, быть локальны для каждого узла в кластере.
  • Документация : В зависимости от того, если у Вас есть веб-инструмент или что-то, вероятно, хорошо сохранить документацию о свойстве близко к коду, который использует его. (Аннотации кода очень хороши для этого.)
  • Уведомление : Как код собирается знать, что изменение было внесено где-нибудь в репозитории конфигурации?

Лично, мне нравится инвертированный способ обработать конфигурацию, где свойства конфигурации введены в модули, которые не знают, куда значения прибыли из. Таким образом, система управления конфигурацией может быть очень сложной или очень простой в зависимости от Ваших (текущих) потребностей.

9
ответ дан Hugo 28 November 2019 в 23:18
поделиться

Где делают Вас, Вы храните параметры конфигурации, которые Ваше приложение должно подключить к базе данных?

, Почему бы не сохранить другую информацию о конфигурации там также?

0
ответ дан Dov Wasserman 28 November 2019 в 23:18
поделиться

Для настроек, которые не имеют отношения к любым таблицам БД, я бы, вероятно, пошел на подход EAV, если вам нужна БД для работы со значениями. В противном случае значение сериализованного поля хорошее, если это действительно просто магазин для кода приложения.

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

, как одно поле на пользователя, который содержит все их настройки, связанные с их представлением по доску объявлений (например, порядок сортировки по умолчанию, заблокированные темами и т. Д.), И, может быть, другой со всеми их настройками для их темы (например, цвет текста, цвет BG, и т. Д.)

0
ответ дан 28 November 2019 в 23:18
поделиться

Хранение иерархии и документов в реляционной БД - безумие. Во-первых, вы должны либо их измельчить, чтобы потом снова объединить. Или там наколотили внутри BLOB, что еще глупее.

Не используйте реляционную базу данных для нереляционных данных, инструмент не подходит. Рассмотрим для этого что-нибудь вроде MongoDB или CouchDB. Безсхемные нереляционные хранилища данных. Сохраните его как JSON, если он каким-либо образом передается клиенту, используйте XML для сервера.

CouchDB дает вам возможность управлять версиями прямо из коробки.

0
ответ дан 28 November 2019 в 23:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: