我有一个应用程序,它使用不同地理位置的四个数据库。所有数据库都包含相同的表,只有数据库名称根据位置不同。我必须在我的应用程序中创建一些报告,这些报告使用来自每个数据库的数据。从 java 应用程序创建这些数据库连接的正确方法是什么,我可以使用这个任务的合适设计模式吗?
6 回答
由于您没有用任何此类标记您的问题,,,,,hibernate
我JPA
假设ORM
您正在处理普通的 JDBC。
话虽如此,我建议你有一个 DAO 层来处理底层数据库,并将连接细节留给特定的实现。.properties
可以说,您可以在某些文件中配置连接字符串。
[补充]
您还可以使用 DAO 工厂,这是抽象工厂或工厂方法模式的实现,无论哪种方式都适合这里。
[链接]
- BalusC的 DAO 和 DAO 工厂的一个非常好的实现
- 核心 J2EE 模式——可以说是过时了,但可能会提供一些想法。
有多种方法可以实现这一目标:
- 如果您使用任何支持分布式事务的 Java EE 容器,那么您可以使用那里的功能。
- 如果您使用的是普通 JDBC,那么您将必须为每个数据库维护自己的连接。对于 JDBC:
- 提供所有连接详细信息
- 有一个 Facade,它通过调用抽象的通用 DAO 为您提供所需的对象。
- 拥有一个基于连接创建 dao 的工厂。
- 使用像 Hibernate 这样的 ORM 工具,您可以在其中使用多个数据库的配置。教程。
- 如果您使用的是 Spring,那么您可以为每个数据库配置一个数据源。文档
设计模式:
- Facade Pattern - 用于隐藏复杂性和多个数据库的使用。
- 工厂 - 如果您自己管理数据库连接。
- 单例 - 用于数据源
您可以使用像 Hibernate 这样的 ORM 工具轻松处理多个连接。您可以在单独的配置文件中指定每个连接,并通过每次获取新的会话工厂来实例化所需的连接。
其他方法是使用数据源和 JNDI:Java 连接到多个数据库
我认为您可以为此目的使用工厂模式和单例模式的组合。
实现这一目标的理想方法是使用像 OLAP 这样的多维系统。但是看看你是否可以从这些数据库中创建一个视图。然后你只需要查询视图(即只是一个单一的数据库连接)。如果需要,您仍然可以使用多个数据库连接。
很容易:)
1.创建数据源尝试连接数据库
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.创建一个DataBase类,记住此时关闭所有连接。
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();
}
}
好看。
假设您使用带有 XML 配置的 Hibernate 的 Spring MVC,请执行以下步骤:
spring-servlet
在文件中创建所有数据库的 bean 。<bean id="dataSource1" Class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="com.microsoft.sqlserver.jdbc.SQLServerDriver" /> <property name="url" value="jdbc:sqlserver://localhost:1433;databaseName=database1"/> <property name="username" value="abc" /> <property name="password" value="abc@123" /> </bean>
在 Spring-servlet 文件中创建
sessionFactory
所需的所有数据库的 bean。<bean id="datasource1SessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean"> <property name="dataSource" ref="database1"/> <property name="packagesToScan" value="com.id4.iprod.entity"/> <property name="hibernateProperties"> <props> <prop key="hibernate.hbm2ddl.auto"> </prop> <prop key="hibernate.dialect"> org.hibernate.dialect.SQLServer2012Dialect </prop> </props> </property> </bean>
现在您只需要在 DAO 中打开您想要的数据库会话并从所需数据库访问所需的结果。
Session datasource1= this.datasource1SessionFactory.openSession();