powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Одно приложение - две БД
19 сообщений из 19, страница 1 из 1
Одно приложение - две БД
    #39328827
am_sasa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет!
Сделал под Tomcat два приложения (папки в WEBAPPS), которое может работать и с MSSQL и PostGreeSql, на основе SPRING.
Все основано на xml-конфигах spring и javascript-ах и теперь приложения полностью одинаковы, а различаются только конфигом подключения к базе. Замучился синхронизировать и копировать две папки приложения.
Что можно придумать, чтобы был одна папка и два URL с различным подключением?
...
Рейтинг: 0 / 0
Одно приложение - две БД
    #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
Одно приложение - две БД
    #39328850
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
am_sasa,
другой вариант работы с несколькими базами - строка коннекта как параметр из выпадающего списка.
Неужели не видел ни разу примеров такого входа?
...
Рейтинг: 0 / 0
Одно приложение - две БД
    #39328860
am_sasa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123,

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

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

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

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

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

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

Не подходит.

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

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

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

Верно. Вот только располагается он по пути относительно имени контекста. А что можно там отдельный путь к одному и тому же war указать?
...
Рейтинг: 0 / 0
Одно приложение - две БД
    #39329330
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а чем отличаются машины/оси/или ещё что?
у меня аналогиное есть в пути для картинок, для окон и линукса они отличаются. поэтому эти пути берутся в зависимости от системы. просто идет определение системы - и подставляется тот или иной путь.
...
Рейтинг: 0 / 0
Одно приложение - две БД
    #39329452
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczBasil A. Sidorov2. Отдельный (внешний) описатель развёртывания.Верно. Вот только располагается он по пути относительно имени контекста.Относительно ${catalina.base}: Defining a context . А что можно там отдельный путь к одному и тому же war указать? DocBase в моём примере.
Относительные пути "отсчитываются" от appBase Host -а. Чтобы "выйти за пределы" appBase требуется "много двоеточий", поэтому я использовал абсолютный путь, "привязанный" к ${catalina.base}.
Внутри appBase приложение с внешним описателем развёртывания лучше не помещать, чтобы не попасть на двойное развёртывание контекста.
...
Рейтинг: 0 / 0
Одно приложение - две БД
    #39329454
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадяпути берутся в зависимости от системы. просто идет определение системы - и подставляется тот или иной путь.Tomcat team сделал всё, чтобы программистов это не парило, но велосипеды продолжают изобретаться ...
В xml-файлов настроек "рублёвая запись" используется для подстановки значений java-свойств (${имя.свойства}).
Есть стандартные - catalina.home и catalina.base, например. Первое определяет каталог, в котором установлен сам tomcat, второе - каталог, в котором работает конкретный сервер (jvm сервлет-контейнера). Да, эти каталоги могут, а по хорошему - должны отличаться.
...
Рейтинг: 0 / 0
Одно приложение - две БД
    #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
19 сообщений из 19, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Одно приложение - две БД
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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