0

0

Cayenne 4.1+:单一运行时多数据源配置指南

霞舞

霞舞

发布时间:2025-11-04 19:09:06

|

1000人浏览过

|

来源于php中文网

原创

Cayenne 4.1+:单一运行时多数据源配置指南

本文详细介绍了在cayenne 4.1及更高版本中,如何在单个serverruntime实例下配置和管理多个具有不同连接参数(url、凭据)的数据节点。教程提供了两种主要方法:通过系统属性进行声明式配置,以及实现自定义datasourcefactory以实现更灵活的动态数据源创建。这些方法使得应用程序能够高效地连接和操作多个后端数据库,同时保持运行时环境的统一性。

在企业级应用开发中,一个应用程序常常需要与多个数据库进行交互,每个数据库可能拥有不同的连接地址、驱动和认证凭据。Cayenne ORM框架提供了强大的能力来管理这些数据源。对于Cayenne 4.1及更高版本,我们可以在不创建多个ServerRuntime实例的情况下,在一个单一的运行时环境中配置和使用多个数据节点。这极大地简化了资源管理,并提高了应用程序的效率。

方法一:通过系统属性配置数据节点

Cayenne 允许通过系统属性(或通过ServerModule.contributeProperties)来定义数据节点的连接参数。这种方式特别适用于连接信息相对固定,或者希望在应用程序启动时集中配置的场景。

配置原理:

Cayenne 运行时会查找特定命名模式的属性来解析数据节点的连接信息。这些属性通常遵循 cayenne.jdbc...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();
    }
}

注意事项:

  • 命名约定: project 是你的Cayenne项目名称(通常在cayenne-project.xml中定义),node1和node2是你在Cayenne Modeler中定义的数据节点名称。确保这些名称与你的Cayenne配置一致。
  • 属性完整性: 必须为每个数据节点提供完整的连接信息(URL, driver, username, password)。
  • 安全性: 直接在代码中硬编码密码可能不是最佳实践。在生产环境中,应考虑使用环境变量配置文件或秘密管理服务来获取敏感凭据。

方法二:实现自定义 DataSourceFactory

当数据源的创建逻辑更为复杂,或者需要根据运行时条件动态生成连接信息时,实现一个自定义的 DataSourceFactory 是一个更灵活的选择。这种方法允许你完全控制 DataSource 的创建过程。

NetGou网店购物系统
NetGou网店购物系统

NetGou是一款国内知名的购物系统网店系统,它功能强大完善、运行稳定快速、界面友好人性化、可扩展性强。系统支持无限级商品分类管理、商品品牌管理、商品供货商管理、商品可同时加入多个商品分类商品批发价格,购买不同的商品数量可以设置不同的价格。不同的商品选项可以设置不同的价格订单中可以加入商品、删除商品、更改商品数量和价格、更改配送方式和配送费用新闻管理、销售统计、数据备份恢复,不同的会员等级可以设置

下载

配置原理:

Cayenne Modeler 允许你为每个数据节点指定一个自定义的 DataSource Factory 类。当 Cayenne 运行时需要为该数据节点创建 DataSource 时,它会实例化并调用你指定的工厂类。

实现步骤:

  1. 创建自定义 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();
        }
    }
  2. 在 Cayenne Modeler 中配置:

    • 打开你的 Cayenne 项目。
    • 在左侧导航栏中选择一个数据节点。
    • 在右侧的属性面板中,找到 "DataSource Factory" 字段。
    • 输入你的自定义 DataSourceFactory 类的完全限定名(例如 com.example.MyDataSourceFactory)。
    • 对需要使用此自定义工厂的每个数据节点重复此操作。

优势与适用场景:

  • 高度灵活性: 可以在 getDataSource 方法中实现任何复杂的逻辑,例如从配置服务、加密存储或动态计算中获取连接参数。
  • 动态数据源: 适用于需要根据特定环境、租户ID或其他运行时参数动态调整数据库连接的场景。
  • 自定义连接池: 可以在工厂中集成第三方连接池库(如 HikariCP、Druid),提供更精细的连接池控制。

总结

Cayenne 框架为在单一运行时中管理多个数据节点提供了两种强大且灵活的机制:通过系统属性进行声明式配置和通过自定义 DataSourceFactory 进行编程式控制。

  • 属性配置 适用于连接信息相对固定、易于通过外部配置或启动参数传递的场景,配置简洁明了。
  • 自定义 DataSourceFactory 则提供了极致的灵活性,适用于需要动态获取连接信息、集成复杂认证机制或使用特定连接池实现的场景。

根据你的具体需求和复杂性,选择最适合的方法,可以有效管理应用程序的多个数据源,确保高效、安全的数据库操作。

相关专题

更多
pdf怎么转换成xml格式
pdf怎么转换成xml格式

将 pdf 转换为 xml 的方法:1. 使用在线转换器;2. 使用桌面软件(如 adobe acrobat、itext);3. 使用命令行工具(如 pdftoxml)。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1844

2024.04.01

xml怎么变成word
xml怎么变成word

步骤:1. 导入 xml 文件;2. 选择 xml 结构;3. 映射 xml 元素到 word 元素;4. 生成 word 文档。提示:确保 xml 文件结构良好,并预览 word 文档以验证转换是否成功。想了解更多xml的相关内容,可以阅读本专题下面的文章。

2080

2024.08.01

xml是什么格式的文件
xml是什么格式的文件

xml是一种纯文本格式的文件。xml指的是可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。想了解更多相关的内容,可阅读本专题下面的相关文章。

915

2024.11.28

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

985

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

41

2025.10.17

数据库三范式
数据库三范式

数据库三范式是一种设计规范,用于规范化关系型数据库中的数据结构,它通过消除冗余数据、提高数据库性能和数据一致性,提供了一种有效的数据库设计方法。本专题提供数据库三范式相关的文章、下载和课程。

329

2023.06.29

如何删除数据库
如何删除数据库

删除数据库是指在MySQL中完全移除一个数据库及其所包含的所有数据和结构,作用包括:1、释放存储空间;2、确保数据的安全性;3、提高数据库的整体性能,加速查询和操作的执行速度。尽管删除数据库具有一些好处,但在执行任何删除操作之前,务必谨慎操作,并备份重要的数据。删除数据库将永久性地删除所有相关数据和结构,无法回滚。

2067

2023.08.14

vb怎么连接数据库
vb怎么连接数据库

在VB中,连接数据库通常使用ADO(ActiveX 数据对象)或 DAO(Data Access Objects)这两个技术来实现:1、引入ADO库;2、创建ADO连接对象;3、配置连接字符串;4、打开连接;5、执行SQL语句;6、处理查询结果;7、关闭连接即可。

346

2023.08.31

ip地址修改教程大全
ip地址修改教程大全

本专题整合了ip地址修改教程大全,阅读下面的文章自行寻找合适的解决教程。

27

2025.12.26

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
MySQL 教程
MySQL 教程

共48课时 | 1.5万人学习

MySQL 初学入门(mosh老师)
MySQL 初学入门(mosh老师)

共3课时 | 0.3万人学习

简单聊聊mysql8与网络通信
简单聊聊mysql8与网络通信

共1课时 | 773人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号