0

0

Cayenne 单运行时多数据源配置:灵活管理多个 DataNode 连接

DDD

DDD

发布时间:2025-11-04 19:49:01

|

763人浏览过

|

来源于php中文网

原创

Cayenne 单运行时多数据源配置:灵活管理多个 DataNode 连接

本教程深入探讨了在 apache cayenne 4.1 及更高版本中,如何在单个 serverruntime 实例下有效配置和管理多个具有独立连接信息(如url、凭据)的 datanode。文章详细介绍了两种实现路径:一是利用 servermodule 的属性贡献机制进行声明式配置,二是实现自定义 datasourcefactory 以获得更精细的数据源创建和控制能力,旨在为开发者提供在复杂多数据库环境中集成 cayenne 的实用指南。

在企业级应用开发中,一个应用程序常常需要与多个数据库进行交互。Apache Cayenne 作为一款强大的 ORM 框架,提供了灵活的配置选项来应对这种多数据源的场景。本文将详细介绍如何在 Cayenne 4.1 及更高版本中,在保持单个 ServerRuntime 实例的前提下,配置和管理多个具有不同连接参数(如数据库 URL、用户名和密码)的 DataNode。这种方法避免了创建多个 ServerRuntime 实例的开销和复杂性,从而优化了资源利用和代码结构。

1. 通过属性贡献机制进行声明式配置

Cayenne 允许通过 ServerModule 的属性贡献机制,在构建 ServerRuntime 时,以编程方式为不同的 DataNode 配置其连接属性。这种方法适用于连接信息相对固定,或者可以通过外部配置(如配置文件)轻松注入的场景。

实现步骤:

同徽B2B电子商务软件 V46
同徽B2B电子商务软件 V46

同徽B2B电子商务软件是国内第一个基于J2EE架构的电子商务商业程序,在国内同类软件中市场占有率位居第一。目前客户分布二十多个省份,三十几个行业,直接和间接服务500万企业,其中包括多家部级单位和世界500强企业:商务部、农业部、德赛集团、宝钢集团、江苏龙华集团、深圳中农股份、中集集团等。 。 网站参数管理运营商可对整个网站进行灵活的配置,适应不同的运营需求网站更新将信息生成静态页面,加快浏览速

下载
  1. 在构建 ServerRuntime 时,使用 addModule 方法添加一个模块,并在其中通过 ServerModule.contributeProperties 贡献特定于 DataNode 的属性。
  2. 属性的命名遵循特定约定:cayenne.jdbc...。其中:
    • 可以是 url、driver、user、password 等。
    • 是您的 Cayenne 项目名称(通常在 cayenne-project.xml 中定义)。
    • 是您在 Cayenne Modeler 中为每个 DataNode 定义的名称。

示例代码:

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)
                        // 配置第一个 DataNode (假设名称为 node1)
                        .put("cayenne.jdbc.url.project.node1", "jdbc:mysql://localhost:3306/db1?useSSL=false")
                        .put("cayenne.jdbc.driver.project.node1", "com.mysql.cj.jdbc.Driver")
                        .put("cayenne.jdbc.user.project.node1", "user1")
                        .put("cayenne.jdbc.password.project.node1", "pass1")

                        // 配置第二个 DataNode (假设名称为 node2)
                        .put("cayenne.jdbc.url.project.node2", "jdbc:postgresql://localhost:5432/db2")
                        .put("cayenne.jdbc.driver.project.node2", "org.postgresql.Driver")
                        .put("cayenne.jdbc.user.project.node2", "user2")
                        .put("cayenne.jdbc.password.project.node2", "pass2")
                )
                .build();

        // 此时,runtime 实例已经配置了两个 DataNode,并可以使用它们进行数据库操作
        // ...
        runtime.shutdown();
    }
}

注意事项:

  • 确保 与您的 Cayenne 项目配置完全匹配。
  • 这种方法适用于在应用程序启动时即可确定所有连接信息的场景。

2. 实现自定义 DataSourceFactory

当应用程序需要更高级的灵活性,例如根据运行时条件动态创建数据源、集成第三方连接池库、或者需要对数据源进行更复杂的初始化和管理时,实现自定义的 DataSourceFactory 是一个更强大的选择。

实现步骤:

  1. 创建一个 Java 类,实现 org.apache.cayenne.datasource.DataSourceFactory 接口。
  2. 在 getDataSource 方法中,根据传入的 DataNodeDescriptor(数据节点描述符),自定义数据源的创建逻辑。您可以从 DataNodeDescriptor 中获取在 Cayenne Modeler 中定义的通用信息,并结合其他自定义逻辑来构建 DataSource 实例。
  3. 在 Cayenne Modeler 中,为每个需要自定义数据源的 DataNode 配置其 "DataSource Factory" 属性,指向您的自定义 DataSourceFactory 类。

示例代码:

import org.apache.cayenne.configuration.DataNodeDescriptor;
import org.apache.cayenne.configuration.server.DataSourceFactory;
import org.apache.cayenne.configuration.server.DataSourceInfo;
import org.apache.cayenne.di.Inject;
import org.apache.cayenne.di.Injector;
import org.apache.cayenne.datasource.DataSourceBuilder;

import javax.sql.DataSource;
import java.sql.Driver;

public class MyCustomDataSourceFactory implements DataSourceFactory {

    @Inject
    private Injector injector; // 用于获取其他DI对象,例如ObjectFactory

    @Override
    public DataSource getDataSource(DataNodeDescriptor nd) throws Exception {
        DataSourceInfo info = nd.getDataSourceDescriptor();

        // 可以在这里根据 DataNodeDescriptor 的名称或其他属性来决定使用哪个连接信息
        // 例如,如果 DataNode 名称是 "node1",则使用 db1 的连接参数
        // 如果是 "node2",则使用 db2 的连接参数
        String url;
        String driverClass;
        String username;
        String password;

        if ("node1".equals(nd.getName())) {
            url = "jdbc:mysql://localhost:3306/db1?useSSL=false";
            driverClass = "com.mysql.cj.jdbc.Driver";
            username = "user1";
            password = "pass1";
        } else if ("node2".equals(nd.getName())) {
            url = "jdbc:postgresql://localhost:5432/db2";
            driverClass = "org.postgresql.Driver";
            username = "user2";
            password = "pass2";
        } else {
            // 默认或从 DataSourceInfo 获取
            url = info.getJdbcUrl();
            driverClass = info.getDriver();
            username = info.getUserName();
            password = info.getPassword();
        }

        // 可以使用 Cayenne 提供的 DataSourceBuilder 来创建数据源
        // 或者集成其他连接池(如 HikariCP, Apache Commons DBCP2 等)
        Driver driver = (Driver) injector.getJavaClass(driverClass).newInstance();
        return DataSourceBuilder
                .url(url)
                .driver(driver)
                .userName(username)
                .password(password)
                .pool(5, 20) // 示例连接池配置
                .maxQueueWaitTime(2000)
                .validationQuery("SELECT 1")
                .build();
    }
}

配置自定义 DataSourceFactory:

在 Cayenne Modeler 中,打开您的 DataNode 配置,找到 "DataSource Factory" 字段,输入您的自定义 DataSourceFactory 类的全限定名(例如 com.example.MyCustomDataSourceFactory)。对每个需要自定义数据源的 DataNode 重复此操作。

注意事项:

  • DataSourceFactory 提供了对数据源创建过程的完全控制,允许您集成任何第三方连接池库。
  • 此方法将连接逻辑从 ServerRuntime 的构建中分离出来,提高了模块化和可维护性。
  • @Inject Injector injector; 允许您在 DataSourceFactory 中访问 Cayenne 的依赖注入容器,从而获取其他服务或配置。

总结

在 Cayenne 中,为单个 ServerRuntime 配置多个具有不同连接参数的 DataNode 是一个常见的需求。本文介绍了两种主要的实现策略:

  1. 声明式属性配置:通过 ServerModule.contributeProperties 在 ServerRuntime 构建时直接注入每个 DataNode 的连接属性。这种方法简单直接,适用于静态或易于外部化的配置。
  2. 自定义 DataSourceFactory:通过实现 DataSourceFactory 接口,提供完全自定义的数据源创建逻辑。这种方法提供了最大的灵活性,适用于需要动态数据源创建、集成第三方连接池或复杂初始化逻辑的场景。

根据您的具体需求和项目的复杂性,选择最适合您的方法,可以有效地管理多数据库环境下的 Cayenne 应用。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

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

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

1902

2024.04.01

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

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

2092

2024.08.01

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

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

1076

2024.11.28

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

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

1133

2023.10.19

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

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

213

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1859

2025.12.29

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

20

2026.01.19

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

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

359

2023.06.29

C++ 设计模式与软件架构
C++ 设计模式与软件架构

本专题深入讲解 C++ 中的常见设计模式与架构优化,包括单例模式、工厂模式、观察者模式、策略模式、命令模式等,结合实际案例展示如何在 C++ 项目中应用这些模式提升代码可维护性与扩展性。通过案例分析,帮助开发者掌握 如何运用设计模式构建高质量的软件架构,提升系统的灵活性与可扩展性。

0

2026.01.30

热门下载

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

精品课程

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

共48课时 | 2万人学习

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

共3课时 | 0.3万人学习

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

共1课时 | 815人学习

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

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