
本文详细介绍了在cayenne 4.1及更高版本中,如何在单个serverruntime实例下配置和管理多个具有不同连接参数(url、凭据)的数据节点。教程提供了两种主要方法:通过系统属性进行声明式配置,以及实现自定义datasourcefactory以实现更灵活的动态数据源创建。这些方法使得应用程序能够高效地连接和操作多个后端数据库,同时保持运行时环境的统一性。
在企业级应用开发中,一个应用程序常常需要与多个数据库进行交互,每个数据库可能拥有不同的连接地址、驱动和认证凭据。Cayenne ORM框架提供了强大的能力来管理这些数据源。对于Cayenne 4.1及更高版本,我们可以在不创建多个ServerRuntime实例的情况下,在一个单一的运行时环境中配置和使用多个数据节点。这极大地简化了资源管理,并提高了应用程序的效率。
Cayenne 允许通过系统属性(或通过ServerModule.contributeProperties)来定义数据节点的连接参数。这种方式特别适用于连接信息相对固定,或者希望在应用程序启动时集中配置的场景。
配置原理:
Cayenne 运行时会查找特定命名模式的属性来解析数据节点的连接信息。这些属性通常遵循 cayenne.jdbc.<property>.<project_name>.<node_name> 的格式。通过在构建 ServerRuntime 时贡献这些属性,我们可以为每个数据节点指定其独立的URL、驱动、用户名和密码。
示例代码:
以下代码展示了如何在一个 ServerRuntime 中配置两个不同的数据节点(例如 node1 和 node2),它们分别连接到不同的数据库:
import org.apache.cayenne.configuration.server.ServerModule;
import org.apache.cayenne.configuration.server.ServerRuntime;
public class MultiDataNodeConfig {
    public static void main(String[] args) {
        ServerRuntime runtime = ServerRuntime.builder()
                // 添加一个模块,用于贡献自定义属性
                .addModule(b -> ServerModule.contributeProperties(b)
                        // 配置第一个数据节点 'node1' 的连接信息
                        .put("cayenne.jdbc.url.project.node1", "jdbc:postgresql://localhost:5432/db1")
                        .put("cayenne.jdbc.driver.project.node1", "org.postgresql.Driver")
                        .put("cayenne.jdbc.username.project.node1", "user1")
                        .put("cayenne.jdbc.password.project.node1", "pass1")
                        // 同样,可以添加连接池相关的属性,例如:
                        // .put("cayenne.jdbc.min_connections.project.node1", "5")
                        // .put("cayenne.jdbc.max_connections.project.node1", "20")
                        // 配置第二个数据节点 'node2' 的连接信息
                        .put("cayenne.jdbc.url.project.node2", "jdbc:mysql://localhost:3306/db2")
                        .put("cayenne.jdbc.driver.project.node2", "com.mysql.cj.jdbc.Driver")
                        .put("cayenne.jdbc.username.project.node2", "user2")
                        .put("cayenne.jdbc.password.project.node2", "pass2")
                )
                // 构建运行时
                .build();
        // 应用程序逻辑...
        // 使用 runtime.newContext() 获取 ObjectContext,然后根据数据节点名称选择上下文
        // 例如:ObjectContext context1 = runtime.newContext("node1");
        // ObjectContext context2 = runtime.newContext("node2");
        runtime.shutdown();
    }
}注意事项:
当数据源的创建逻辑更为复杂,或者需要根据运行时条件动态生成连接信息时,实现一个自定义的 DataSourceFactory 是一个更灵活的选择。这种方法允许你完全控制 DataSource 的创建过程。
配置原理:
Cayenne Modeler 允许你为每个数据节点指定一个自定义的 DataSource Factory 类。当 Cayenne 运行时需要为该数据节点创建 DataSource 时,它会实例化并调用你指定的工厂类。
实现步骤:
创建自定义 DataSourceFactory 类: 实现 org.apache.cayenne.configuration.server.DataSourceFactory 接口。这个接口只有一个方法 getDataSource(DataNodeDescriptor nd),你可以在其中编写创建 DataSource 的逻辑。
import org.apache.cayenne.configuration.DataNodeDescriptor;
import org.apache.cayenne.configuration.server.DataSourceFactory;
import org.apache.cayenne.di.Inject;
import org.apache.cayenne.di.ObjectFactory;
import org.apache.cayenne.dba.DataSourceInfo;
import org.apache.cayenne.datasource.DataSourceBuilder;
import javax.sql.DataSource;
import java.sql.Driver;
public class MyDataSourceFactory implements DataSourceFactory {
    @Inject
    private ObjectFactory objectFactory; // 用于实例化驱动等类
    @Override
    public DataSource getDataSource(DataNodeDescriptor nd) throws Exception {
        // DataNodeDescriptor 包含了在 Modeler 中配置的数据节点信息
        DataSourceInfo info = nd.getDataSourceDescriptor();
        // 根据数据节点名称或其他自定义属性,动态获取连接信息
        String nodeName = nd.getName();
        String url;
        String driverClass;
        String username;
        String password;
        // 示例:根据节点名称获取不同的连接信息
        if ("node1".equals(nodeName)) {
            url = "jdbc:postgresql://localhost:5432/db1_dynamic";
            driverClass = "org.postgresql.Driver";
            username = "user1_dynamic";
            password = "pass1_dynamic";
        } else if ("node2".equals(nodeName)) {
            url = "jdbc:mysql://localhost:3306/db2_dynamic";
            driverClass = "com.mysql.cj.jdbc.Driver";
            username = "user2_dynamic";
            password = "pass2_dynamic";
        } else {
            // 可以使用 Modeler 中配置的默认值,或抛出异常
            url = info.getJdbcUrl();
            driverClass = info.getDriverClassName();
            username = info.getUserName();
            password = info.getPassword();
            // 也可以从外部配置源(如Spring配置、环境变量等)获取
        }
        // 实例化驱动
        Driver driver = (Driver) objectFactory.getJavaClass(driverClass).newInstance();
        // 使用 DataSourceBuilder 构建 DataSource
        return DataSourceBuilder
                .url(url)
                .driver(driver)
                .userName(username)
                .password(password)
                // 可以根据需要配置连接池参数
                .pool(5, 20) // 最小5个连接,最大20个连接
                .maxQueueWaitTime(30000) // 等待连接的最大时间(毫秒)
                .validationQuery("SELECT 1") // 连接验证查询
                .build();
    }
}在 Cayenne Modeler 中配置:
优势与适用场景:
Cayenne 框架为在单一运行时中管理多个数据节点提供了两种强大且灵活的机制:通过系统属性进行声明式配置和通过自定义 DataSourceFactory 进行编程式控制。
根据你的具体需求和复杂性,选择最适合的方法,可以有效管理应用程序的多个数据源,确保高效、安全的数据库操作。
以上就是Cayenne 4.1+:单一运行时多数据源配置指南的详细内容,更多请关注php中文网其它相关文章!
                        
                        每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
                Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号