Централизованное управление подключением к БД в Java - PullRequest
1 голос
/ 20 мая 2009

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

Я искал возможность использовать JNDI для достижения этой цели, но на самом деле у меня не было большого опыта в его использовании. У кого-нибудь есть опыт попыток сделать что-то подобное? Или есть идеи о том, как этого достичь?

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

Ответы [ 3 ]

1 голос
/ 20 мая 2009

Это может быть хорошим началом:

HashMap<String,String> dsNames = new HashMap<String,String>();
System.setProperty(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.fscontext.RefFSContextFactory");
    System.setProperty(Context.PROVIDER_URL, "file:/home/user/tmp");
    InitialContext ic = new InitialContext();
    dsNames.put("yourDataSourceName", "jdbc/your_jndi_name");
    // Construct BasicDataSource reference
    Reference ref = new Reference("javax.sql.DataSource",
            "org.apache.commons.dbcp.BasicDataSourceFactory", null);
    ref.add(new StringRefAddr("driverClassName", "theDriver"));
    ref.add(new StringRefAddr("url","theDBURL"));
    ref.add(new StringRefAddr("username", "obvious"));
    ref.add(new StringRefAddr("password", "obvious"));
    ref.add(new StringRefAddr("maxActive", "10"));
    ref.add(new StringRefAddr("maxIdle", "3"));
    ref.add(new StringRefAddr("initialSize", "3"));
    ref.add(new StringRefAddr("maxWait", "5"));
    ic.rebind("jdbc/your_jndi_name", ref);

    //And to get a reference to your data source anywhere else in your program:
    InitialContext ic2 = new InitialContext();
    DataSource myDS = (DataSource) ic2.lookup(dsNames.get(dsName));

Теперь, как вы видите, я использую фабрику соединений в пуле, но вы можете заменить ее в соответствии со своими потребностями. Кроме того, исходной фабрикой контекста является FSContext, что означает, что имя JNDI будет просматриваться в обычной файловой системе, должна быть доступна фабрика контекста URL, но я никогда ее не использовал. Большинство используемых классов находятся в пакете javax.naming.

Надеюсь, это поможет.

0 голосов
/ 20 мая 2009

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

Предположительно, если вам нужно централизовать такие вещи, как конфигурация источника данных, у вас уже есть что-то на месте (CFEngine, puppet, chef, rdist, ...) для управления файлами конфигурации операционной системы - так почему бы просто не использовать что?

0 голосов
/ 20 мая 2009

Какое регулирование вы пытаетесь соблюдать?

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

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

...