2013-04-29 2 views
0

Я работаю над webapp, где я вручную создаю свой DataSource. (также см. мой другой вопрос: How to use Spring to manage connection to multiple databases), потому что мне нужно подключиться к другим базам данных (dev, prod, qa, test).Java Datasource, как его распорядиться

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

private DataSource createDataSource(Environment e) { 
    OracleDataSource ds = null;   
    String url = null; 
    try { 
     if (myDs != null) { 
      logger.info("myDs connection: " + etmetaDs.getConnection().getMetaData().getURL()); 
      url = myDs.getConnection().getMetaData().getURL(); 
     } 
    } catch (SQLException exc) { 
     // TODO Auto-generated catch block 
     exc.printStackTrace(); 
    } 

    if (myDs == null) {    
     try { 
      ds = new OracleDataSource(); 
     } catch (SQLException ex) { 
      ex.printStackTrace(); 
     } 

     ds.setDriverType("oracle.jdbc.OracleDriver"); 
     ds.setURL(e.getUrl()); 
     try { 
      Cryptographer c = new Cryptographer(); 
      ds.setUser(c.decrypt(e.getUsername())); 
      ds.setPassword(c.decrypt(e.getPassword())); 
     } catch (CryptographyException ex) { 
      logger.error("Failed to connect to my environment [" + e.getName() + "]"); 
      ex.printStackTrace(); 
      return null; 
     } 
     logger.info("Connecting to my environment [" + e.getName() + "]"); 

     myDs = ds; 
    } else if (url.equals(e.getUrl())) { 

    } else { 

    } 

    return myDs; 
} 
+0

Вы пробовали использовать Singleton в качестве источника данных? – Crowlix

ответ

1

Если вы прочтете ответ Резы в другом вопросе, вы можете увидеть, как создать несколько DataSource.
Я думаю, что проблема заключается не в DataSource, а в том, как вы храните информацию в своем коде. Я полагаю, что ваши etmetaDs являются общими, но все ваши пользователи, поэтому распоряжайтесь им, когда пользователь выходит из системы (= установить его в null), не является хорошим вариантом.

Что вам нужно сделать, это поддерживать статус соединения для каждого пользователя. И когда пользователь выходит из системы, вы можете сбросить статус, чтобы получить новое соединение при следующем подключении.

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

public class UserData 
{ 
String id; 
String name; 
String database; 
} 

Вы можете иметь в своем приложении выпадающий список с именем базы данных (Dev, тест, ...) с пустой первый элемент. Когда пользователь выбирает базу данных, вы получаете соединение с createDataSource(). Если он уже существует, вы возвращаете DataSource, иначе вы создаете новый. Когда пользователь отключается (или когда пользователь входит в систему), вы устанавливаете базу данных в «", чтобы заставить его выбрать базу данных в раскрывающемся списке. Нет необходимости перезагружать источник данных.

+0

Как это сделать? Я искал, но не нашел никаких методов, где я могу (повторно) установить статус источника данных – 8bitboy

+0

Спасибо, рассмотрим это. – 8bitboy