Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Одно приложение - две БД / 19 сообщений из 19, страница 1 из 1
18.10.2016, 11:48
    #39328827
am_sasa
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Одно приложение - две БД
Всем привет!
Сделал под Tomcat два приложения (папки в WEBAPPS), которое может работать и с MSSQL и PostGreeSql, на основе SPRING.
Все основано на xml-конфигах spring и javascript-ах и теперь приложения полностью одинаковы, а различаются только конфигом подключения к базе. Замучился синхронизировать и копировать две папки приложения.
Что можно придумать, чтобы был одна папка и два URL с различным подключением?
...
Рейтинг: 0 / 0
18.10.2016, 11:57
    #39328840
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Одно приложение - две БД
am_sasaСделал под Tomcat два приложения (папки в WEBAPPS), которое может работать и с MSSQL и PostGreeSql, на основе SPRING.

Блин. Хватит издеваться над названиями!
SQL Server
PostgreSQL
Spring Framework

am_sasaВсе основано на xml-конфигах spring и javascript-ах и теперь приложения полностью одинаковы, а различаются только конфигом подключения к базе. Замучился синхронизировать и копировать две папки приложения.
Что можно придумать, чтобы был одна папка и два URL с различным подключением?
Для начала перепишите работу с базой, чтобы выкинуть строку соединения из проекта. Вместо неё используйте JNDI DataSource
https://tomcat.apache.org/tomcat-7.0-doc/jndi-datasource-examples-howto.html
Второй шаг сложнее. И я не уверен что он сработает. Но стоит попробовать.
Вам нужно в server.xml прописать два контекста на один и тот же docBase, но разные path
Как здесь http://stackoverflow.com/a/12092861
А затем каждому контексту прописать локальный JNDI ресурс. И вот тут-то нужно провернуть финт ушами и дать одинаковое имя этому ресурсу. В доке написано что ресурс будет иметь scope контекста. Так что, в теории, должно получиться.
...
Рейтинг: 0 / 0
18.10.2016, 12:03
    #39328850
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Одно приложение - две БД
am_sasa,
другой вариант работы с несколькими базами - строка коннекта как параметр из выпадающего списка.
Неужели не видел ни разу примеров такого входа?
...
Рейтинг: 0 / 0
18.10.2016, 12:08
    #39328860
am_sasa
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Одно приложение - две БД
Petro123,

Спасибо, но это много переделывать... мне нужно только для отладки и тестов, а в продакшене база одна, естественно.
все равно, спасибо, если ничего другого не получится, придется сделать примерно это.
...
Рейтинг: 0 / 0
18.10.2016, 12:15
    #39328873
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Одно приложение - две БД
am_sasaмне нужно только для отладки и тестов, а в продакшене база одна, естественно.
а сразу написать нельзя? )).
Если отладка, то в самом IDE переключаются базы тоже легко.
Тут надо про работее место программиста говорить.
Удачи!
...
Рейтинг: 0 / 0
18.10.2016, 12:19
    #39328878
am_sasa
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Одно приложение - две БД
Petro123Если отладка, то в самом IDE переключаются базы тоже легко.

К сожалению или к счастью, IDE нет, программистов тоже (утрирую).
Есть Notepad++ в нем правят xml конфиги spring и javascript, потом F5 в браузере и все.
...
Рейтинг: 0 / 0
18.10.2016, 12:22
    #39328883
am_sasa
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Одно приложение - две БД
Blazkowicz,

Спасибо. Есть место, где по имени контекста, например, можно попробовать это сделать.
...
Рейтинг: 0 / 0
18.10.2016, 16:35
    #39329125
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Одно приложение - две БД
am_sasaЧто можно придумать, чтобы был одна папка и два URL с различным подключением? Контексты и развёртывание - читаете, как вынести описатели развёртывания (вместе с приложением) за пределы webapps.
Прописываете параметры подключения в описателе развёртывания и вычитываете их в init-методе сервлета.

P.S. Не надо ничего прописывать в server.xml без веской причины - это глобальный контекст, единый на все приложения контейнера.
...
Рейтинг: 0 / 0
18.10.2016, 16:55
    #39329151
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Одно приложение - две БД
Basil A. SidorovP.S. Не надо ничего прописывать в server.xml без веской причины - это глобальный контекст, единый на все приложения контейнера.
А два Context.xml ты в один war модуль как запихивать предлагаешь?
...
Рейтинг: 0 / 0
18.10.2016, 17:17
    #39329170
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Одно приложение - две БД
BlazkowiczА два Context.xml ты в один war модуль как запихивать предлагаешь?Никак: админу - админово.
В war-е располагается context.xml с (какими-то) умалчиваемыми настройками.
Админ создаёт описатели развёртывания, используя поставляемый context.xml в качестве образца и из одного war (каталога) развёртывается два (и более) контекста со своими настройками в каждом.
пример реального описателя
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
<?xml version="1.0" encoding="windows-1251"?>
<!--
  Глобальные параметры
    proxy.debug: необязательный, по умолчанию - выключено
    proxy.mode : необязательный, по умолчанию - CORBA
                 Допустимые значения - CORBA, RMI, LOCAL

  Параметры RPC-режимов (CORBA, RMI)
    proxy.target.port: обязательный, от 1025 до 65535
    proxy.target.host: необязательный, по умолчанию - 127.0.0.1
    proxy.pool.size  : необязательный, по умолчанию - 250

  Параметры хост-режима (LOCAL)
    gz.config  : имя файла настроек СП, обязательный
                 Дополнительно проверяется имя относительно
                 ${gz.base}, если параметр gz.base - задан
    gz.home    : каталог сборки сервера, обязательный
    gz.base    : каталог настроек СП, необязательный,
                 по умолчанию - пусто (не используется)
    gz.instance: имя экземпляра СП, необязательный,
                 по умолчанию - пусто (не используется)

  Прочие параметры контекста определяются сервлет-контейнером
  -->

<Context docBase="${catalina.base}/../proxy">
  <!-- Parameter name = "proxy.mode"
             value = "CORBA"
             override = "false" / -->

  <!-- RPC-режимы (CORBA, RMI) -->
  <Parameter name = "proxy.target.port"
             value = "2100"
             override = "false" />

  <!-- Parameter name = "proxy.target.host"
             value = "127.0.0.1"
             override = "false" / -->

  <!-- Parameter name = "proxy.pool.size"
             value = "250"
             override = "false" / -->

  <!-- хост-режим (LOCAL) -->
  <Parameter name = "gz.home"
             value = "${gz.base}"
             override = "false" />

  <Parameter name = "gz.base"
             value = "${catalina.base}/.."
             override = "false" />

  <!-- если не найдено, и задан gz.base,
       проверяется ${gz.base}/${gz.config}
    -->

  <Parameter name = "gz.config"
             value = "gz-conf/gz0.properties"
             override = "false" />

  <!-- Parameter name = "gz.instance"
             value = null
             override = "false" / -->

  <!-- Parameter name = "proxy.debug"
             value = "false"
             override = "false" / -->

  <!-- Только Tomcat - ускоряет загрузку приложения -->
  <!-- ищем веб-фрагменты только в каталоге приложения -->
  <JarScanner scanClassPath="false" />
</Context>


настройки контейнера
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
<?xml version='1.0' encoding='utf-8'?>

<Server port="-1">
  <Listener className="org.apache.catalina.security.SecurityListener" />
  <!-- Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" / -->
  <Listener className="org.apache.catalina.core.JasperListener" />
  <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
  <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
  <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />

  <GlobalNamingResources>
  </GlobalNamingResources>

  <Service name="Catalina">

    <Connector protocol="org.apache.coyote.http11.Http11NioProtocol"
               address="127.0.0.1"
               port="${port}"
               URIEncoding="UTF-8"
               acceptCount="200"
               minSpareThreads="500"
               maxThreads="500"
               maxKeepAliveRequests="-1" />

    <Engine name="Catalina" defaultHost="localhost">

     	<Host name="localhost"
              createDirs="false"
              autoDeploy="true"
              xmlBase="../gz-conf/${port}"
              unpackWARs="true"
              workDir="${java.io.tmpdir}/${port}">

        <Valve className="org.apache.catalina.valves.AccessLogValve"
               directory="${user.dir}/.logs"
               prefix="${port}_access"
               suffix=".log"
               renameOnRotate="true"
               fileDateFormat="-yyyyMMdd"
               pattern="%{yyyy-MM-dd HH:mm:ss.SSS Z}t|%s|%a|%B|%D ms|'%{Host}i %r'" />

      </Host>
    </Engine>
  </Service>
</Server>


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

P.S. Мне безразлично, как это вписывается в CI и прочие автоматизации, но если вам не требуется рулить кластерами из десятков узлов для каждого из сотни клиентов - мой вариант много удобнее для админа.

P.P.S. Это всё - не теория, а проверенная промышленной эксплуатацией практика.
...
Рейтинг: 0 / 0
18.10.2016, 17:24
    #39329176
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Одно приложение - две БД
Basil A. SidorovНикак: админу - админово.
Ну, так мы сейчас договоримся о том что автор вообще ерундой страдает. Проблема-то у него не с администрированием, а с локальной разработкой. Но только почему он из IDE не запускает? Зачем деплоить каждый раз?
...
Рейтинг: 0 / 0
18.10.2016, 17:43
    #39329190
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Одно приложение - две БД
BlazkowiczНу, так мы сейчас договоримся о том что автор вообще ерундой страдает.Нет. Да и хоть ерундой - копировать-то её зачем?Проблема-то у него не с администрированием, а с локальной разработкой.Рано или поздно разработка закончится ..Но только почему он из IDE не запускает?... и запускать придётся без IDE. Тем более, что автор и сейчас не использует среду разработки.
Вопрос "как развернуть" два приложения не копируя две почти идентичные сборки - останется.
Зачем деплоить каждый раз?Развёртывание необходимо, если изменились классы или/и настройки приложения.
Если собственного кода немного, код несложный и нет жёстких ограничений по времени (инициативный "проект выходного дня") - установка, настройка и освоение интегрированной среды - трата времени, а:
Код: plaintext
 javac ... -d WEB-INF/lib src/*.java
поместит скомпилированные классы в "нужном" сервлет-контейнеру виде без всякого пакетирования. Далее обновляем (touch или "copy файл+,,") дату-время описателя развёртывания и контейнер перезапустит соответствующий контекст.
Если всё, что не меняется (все сторонние библиотеки) вынесены в ${catalina.base}/lib, то время перезапуска контекста будет определятся только собственным кодом. В моём случае это было пара-тройка секунд.

P.S. Да, всё это сильно отличается от общепринятого, но если нет задачи создавать код в промышленных масштабах - всё это работает ничуть не хуже.
Это как завод-гигант и кустарная мастерская - разные масштабы и разные приёмы, хотя могут делать одно и то же.
...
Рейтинг: 0 / 0
18.10.2016, 17:49
    #39329195
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Одно приложение - две БД
Basil A. Sidorov Да и хоть ерундой - копировать-то её зачем?
Так это у меня к тебе вопрос, куда ты два context.xml поместишь при одном war модуле?
...
Рейтинг: 0 / 0
18.10.2016, 17:58
    #39329204
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Одно приложение - две БД
BlazkowiczТак это у меня к тебе вопрос, куда ты два context.xml поместишь при одном war модуле?Есть разные варианты развёртывания:
0. Умалчиваемое развёртывание при отсутствии других описателей;
1. Описатель, встроенный в WAR (contex.xml внутри META-INF);
2. Отдельный (внешний) описатель развёртывания.
Вариант один (почему-то) используется всегда, хотя его удел - начальная поставка.
Далее админ заказчка или конечный пользователь создаёт два отдельных описателя, под управлением которых сервлет-контейнер развернёт одно и то же приложение в двух контекстах.

Если программист считает, что использование текстового редактора и общекомпьютерная грамотность не являются свойствами его целевой аудитории - программист пишет установщик, который создаст два описателя при минимальном участии пользователя.
...
Рейтинг: 0 / 0
18.10.2016, 19:09
    #39329264
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Одно приложение - две БД
Basil A. Sidorov0. Умалчиваемое развёртывание при отсутствии других описателей;

Не подходит.

Basil A. Sidorov1. Описатель, встроенный в WAR (contex.xml внутри META-INF);

Тогда нужно 2 war

Basil A. Sidorov2. Отдельный (внешний) описатель развёртывания.

Верно. Вот только располагается он по пути относительно имени контекста. А что можно там отдельный путь к одному и тому же war указать?
...
Рейтинг: 0 / 0
18.10.2016, 21:03
    #39329330
вадя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Одно приложение - две БД
а чем отличаются машины/оси/или ещё что?
у меня аналогиное есть в пути для картинок, для окон и линукса они отличаются. поэтому эти пути берутся в зависимости от системы. просто идет определение системы - и подставляется тот или иной путь.
...
Рейтинг: 0 / 0
19.10.2016, 02:42
    #39329452
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Одно приложение - две БД
BlazkowiczBasil A. Sidorov2. Отдельный (внешний) описатель развёртывания.Верно. Вот только располагается он по пути относительно имени контекста.Относительно ${catalina.base}: Defining a context . А что можно там отдельный путь к одному и тому же war указать? DocBase в моём примере.
Относительные пути "отсчитываются" от appBase Host -а. Чтобы "выйти за пределы" appBase требуется "много двоеточий", поэтому я использовал абсолютный путь, "привязанный" к ${catalina.base}.
Внутри appBase приложение с внешним описателем развёртывания лучше не помещать, чтобы не попасть на двойное развёртывание контекста.
...
Рейтинг: 0 / 0
19.10.2016, 02:49
    #39329454
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Одно приложение - две БД
вадяпути берутся в зависимости от системы. просто идет определение системы - и подставляется тот или иной путь.Tomcat team сделал всё, чтобы программистов это не парило, но велосипеды продолжают изобретаться ...
В xml-файлов настроек "рублёвая запись" используется для подстановки значений java-свойств (${имя.свойства}).
Есть стандартные - catalina.home и catalina.base, например. Первое определяет каталог, в котором установлен сам tomcat, второе - каталог, в котором работает конкретный сервер (jvm сервлет-контейнера). Да, эти каталоги могут, а по хорошему - должны отличаться.
...
Рейтинг: 0 / 0
19.10.2016, 09:39
    #39329554
am_sasa
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Одно приложение - две БД
Спасибо за помощь!
Это просто этап отладки проекта. IDE не используется, потому что правятся xml конфиги spring и javascript файлы, Notepad++ достаточно.

Чтобы более предметно, xml конфиг spring:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
<!--	************	ПОДКЛЮЧЕНИЕ К БАЗЕ ДАННЫХ	****************	-->
<bean id="dataSource" class="org.apache.tomcat.dbcp.dbcp2.BasicDataSource" destroy-method="close">
	<property name="driverClassName" value="${jdbc.driver}"/>
	<property name="url"	  		 value="${jdbc.url}"/>
	<property name="username" 		 value="${jdbc.userDB}"/>
	<property name="password" 		 value="${jdbc.passwordDB}"/>
	<property name="validationQuery" value="select 1"/>
	<property name="testOnBorrow" 	 value="true"/>
	<property name="timeBetweenEvictionRunsMillis" value="30000"/>
</bean>


отличия:
Код: java
1.
2.
3.
4.
jdbc.driver=org.postgresql.Driver
jdbc.url=jdbc:postgresql://10.10.20.116:5432/...
jdbc.userDB=postgres
jdbc.passwordDB=...


Код: java
1.
2.
3.
4.
jdbc.driver=net.sourceforge.jtds.jdbc.Driver
jdbc.url=jdbc:jtds:sqlserver://dbsrv2/...
jdbc.userDB=sa
jdbc.passwordDB=...



только один файл с подключением
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Одно приложение - две БД / 19 сообщений из 19, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]