2009-05-20 3 views
1

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

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

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

ответ

0

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

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

0

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

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

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

1

Это может быть хороший старт:

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.

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