2015-10-26 1 views
0

Я использую Spring успокоительной веб-служб в моем проекте, здесь у меня есть две категории пользователейКак переключаться между двумя базами данных, на основе запроса пользователя в веб-приложении Java?

1) среднее (Студент изучения класса от 6 до 10)

2) среди (студент, изучающий класс между 11-й и 12).

В каждом URI, мы указываем тип пользователя, например, смотри ниже: (http://localhost:8080/TestProject/login/вторичной/Authenticate)

Для запроса выше, мне нужно извлечь данные из «вторичных» d.b таблиц.

Аналогичным образом для запроса другого пользователя, необходимо связаться с другим d.b (Inter).

В классе '' DAO:

NamedParameterJdbcTemplate jdbcTemplate = new NamedParameterJdbcTemplate(
      getDataSource()); 
    jdbcTemplate.getJdbcOperations().execute(
       "SET SCHEMA " + **UriUtils.getSchema()**); 

В выше UriUtils.getSchema(), метод возвращает имя 'базы данных'.

private DataSource getDataSource() { 
    String db = UriUtils.getDataBaseName(); 
    DataSource dataSource = null; 
    try { 
     InitialContext initialContext = new InitialContext(); 
     Context environmentContext = (Context) initialContext 
       .lookup("java:comp/env"); 
     dataSource = (DataSource) environmentContext.lookup(db); 
    } catch (NamingException e) { 
     logger.error(e.getMessage()); 
     logger.info(db + " resource is not available in server.xml file"); 
     e.printStackTrace(); 
    } 
    return dataSource; 
} 

В сервере Tomcat я настроил пул соединений.

server.xml

<Resource auth="Container" driverClassName="org.postgresql.Driver" 
     logAbandoned="true" maxActive="20" maxIdle="10" maxWait="-1" 
     name="secondary" password="admin" removeAbandoned="true" 
     removeAbandonedTimeout="90" type="javax.sql.DataSource" 
     url="jdbc:postgresql://localhost:5432/postgres?currentSchema=secondary" 
     username="postgres" /> 
    <Resource auth="Container" driverClassName="org.postgresql.Driver" 
     logAbandoned="true" maxActive="20" maxIdle="10" maxWait="-1" 
     name="inter" password="admin" removeAbandoned="true" 
     removeAbandonedTimeout="90" type="javax.sql.DataSource" 
     url="jdbc:postgresql://localhost:5432/postgres?currentSchema=inter" 
     username="postgres" /> 

context.xml

<ResourceLink name="secondary" global="secondary" 
    type="org.postgresql.Driver" /> 
<ResourceLink name="inter" global="inter" 
    type="org.postgresql.Driver" /> 

загружающие источника данных объекта каждый раз, когда это хорошая практика?

Просьба предложить, если имеется лучший подход.

+1

Как правило, при использовании Spring вы будете * вводить * DataSource в свои классы DAO. В вашем случае вы должны добавить два из них, а затем выбрать, какой из них использовать при построении 'JdbcTemplate'. – Andreas

ответ

1

Является ли загрузка объекта источника данных каждый раз хорошей практикой?

NO, IMV.

Определить два datasources (secondaryDS, interDS), как пружинная фасоль по умолчанию для Синглтона, и ввести соответствующие datasource в JDBCTemplate классе согласно вашему требованию.

0

Вы не загружаете базу данных каждый раз. Операция поиска не загружает базу данных. Это нормально выполнять поиск по каждому запросу. Также я не вижу две базы данных в вашем примере. У вас есть два источника данных по одной базе данных postgresql. Вы можете использовать один источник данных и выполнять SET SCHEMA при каждом запросе клиента для переключения схемы.

Смежные вопросы