У меня есть приложение, которое использует четыре базы данных в разных географических точках. Все базы данных содержат одни и те же таблицы, и только имя базы данных отличается от местоположения. Мне нужно создать несколько отчетов в моем приложении, которое использует данные из каждой базы данных. Каким будет правильный способ создания этих соединений с базой данных из приложения java и есть ли подходящий шаблон для этой задачи, который я мог бы использовать?
Как создать несколько соединений с базами данных для разных баз данных в java
Ответ 1
Поскольку вы не пометили свой вопрос каким-либо из перечисленного, hibernate
, JPA
, ORM
, я предполагаю, что вы имеете дело с простым JDBC.
Сказав это, я предлагаю вам иметь уровень DAO для работы с базовыми базами данных и оставить детали подключения для конкретных реализаций. Допустим, вы можете настроить строки подключения в некоторых файлах .properties
.
[Комплемент]
Вы также можете использовать фабрику DAO, реализацию шаблона Abstract Factory или Factory Method, в зависимости от того, что здесь подходит.
[Ссылка]
- Очень хорошая реализация DAO и DAO Factory от BalusC
- Базовые шаблоны J2EE - возможно устаревшие, но могут дать некоторую идею.
Ответ 2
Существует несколько способов добиться этого:
- Если вы используете какой-либо контейнер Java EE, который поддерживает распределенную транзакцию, вы можете использовать там функциональность.
- Если вы используете простой JDBC, вам необходимо будет поддерживать собственное соединение для каждой базы данных.
Для JDBC:
- Предоставить все сведения о подключении
- У вас есть фасад, который дает вам желаемый объект, вызывая абстрактный общий DAO.
- Имейте factory, который создает dao на основе подключения.
- Используйте инструменты ORM, такие как Hibernate, где вы можете использовать конфигурацию для нескольких баз данных. Учебник.
- Если вы используете Spring, вы можете настроить один источник данных для каждой базы данных. Docs
Шаблоны проектирования:
- Facade Pattern - для скрытия сложности и использования нескольких баз данных.
- Factory - Если вы сами управляете подключением к базе данных.
- Singleton - для источников данных
Ответ 3
С помощью инструмента ORM, такого как Hibernate, вы можете обрабатывать несколько подключений. Вы можете указать каждое соединение в отдельном файле конфигурации и создать требуемое соединение, получив новый сеанс factory каждый раз.
Другим способом было бы использовать datasource и JNDI: Java, подключающиеся к нескольким базам данных
Я думаю, вы можете использовать комбинацию шаблона factory и шаблона Singleton для этой цели.
Ответ 4
Идеальный способ добиться этого - использование многомерной системы, такой как OLAP. Но посмотрите, можете ли вы создать представление из этих баз данных. Затем вам просто нужно запросить представление (т.е. Просто подключение к одной базе данных). Также вы можете использовать несколько соединений с базой данных, если хотите.
Ответ 5
очень просто:)
1.Создание источника данных для подключения к DB
public DataSource getDataSource(String db) throws Exception {
DataSource dt = null;
InitialContext ic = null;
try {
if(db.trim().equals("you_database_name")) {
dt = (DataSource)ic.lookup("jdbc/connection_name");
} else if(db.trim().equals("you_database_name")) {
dt = (DataSource) ic.lookup("jdbc/connection_name");
}
return dt;
} catch(NamingException n) {
throw new Exception("Err getDataSource (ServiceLocator) NamingException - " + n.getMessage());
}
2.Создайте базовую базу данных класса, запомните все соединения в этой точке.
public class DataBases {
public YouNameDataSourceClass dataSrc;
public DataBases() throws Exception {
super();
dataSrc = new YouNameDataSourceClass.getDataSource();
}
public Connection getConnectionAS400() throws Exception {
return locator.getDataSource("you_database_name").getConnection();
}
public Connection getConnectionOracle() throws Exception {
return locator.getDataSource("you_database_name").getConnection();
}
public Connection getConnectionSQLServer() throws Exception {
return locator.getDataSource("you_database_name").getConnection();
}
}
Хороший внешний вид.