datanucleus jdo适配华为云
DataNucleus 和 JDO 简介
DataNucleus 和 JDO 是 Java 数据持久化技术中的重要组成部分,主要用于将 Java 对象与关系型数据库(RDBMS)、NoSQL 数据库等多种数据存储系统进行映射和管理。下面是它们的详细介绍:
1. 什么是 JDO (Java Data Objects)
定义
Java Data Objects (JDO) 是一种标准化的 Java 持久化接口,由 Java 社区过程 (JCP) 发布,定义了将 Java 对象持久化到数据库中的 API。它类似于 JPA (Java Persistence API),但 JDO 更通用,支持关系型数据库、文件系统、NoSQL 数据库等多种存储方式。
特点
1. 标准化:
• JDO 是一个标准规范。
• 提供了一致的持久化接口,避免锁定到特定的实现。
2. 支持多种数据源:
• 支持 RDBMS(如 MySQL、PostgreSQL)。
• 支持 NoSQL 数据库(如 MongoDB)。
• 支持文件系统、内存数据库等。
3. 轻量级:
• JDO 是一种轻量级的 ORM(对象关系映射)工具,便于学习和使用。
4. 面向 POJO(Plain Old Java Object):
• 使用普通的 Java 类(POJO)作为持久化对象。
核心概念
• Persistence Manager (PM):
JDO 的核心接口,用于管理实体类的生命周期,包括插入、查询、更新和删除操作。
• PersistenceCapable:
持久化对象的标识,JDO 要求持久化类实现 PersistenceCapable 接口(通常通过字节码增强完成)。
• Query API:
提供类似 SQL 的查询语言 JDOQL(Java Data Objects Query Language)。
2. 什么是 DataNucleus
定义
DataNucleus 是 JDO 和 JPA 的一个实现,提供了强大的功能和扩展,支持多种数据存储方式。它是开源的(Apache 2.0 许可),是目前主流的 JDO 实现。
特点
1. 广泛的数据存储支持:
• 支持关系型数据库(如 MySQL、PostgreSQL、Oracle)。
• 支持 NoSQL 数据库(如 MongoDB、Cassandra)。
• 支持文件系统和大数据存储(如 HDFS)。
2. 多种持久化标准:
• 实现了 JDO 规范。
• 实现了 JPA 规范。
• 支持 REST 和 JSON 数据的持久化。
3. 增强工具:
• 提供增强工具,将普通 Java 类转变为持久化类。
• 支持通过 Maven 或 Gradle 进行增强。
4. 高性能:
• 提供强大的缓存机制(一级缓存和二级缓存)。
• 高效的查询和批量操作支持。
5. 灵活配置:
• 提供丰富的配置选项,适应不同应用场景。
核心模块
• datanucleus-core:
核心模块,提供持久化框架的基本功能。
• datanucleus-api-jdo:
实现 JDO 的接口和规范。
• datanucleus-api-jpa:
实现 JPA 的接口和规范。
• datanucleus-rdbms:
提供对关系型数据库的支持。
• datanucleus-mongodb / datanucleus-cassandra:
提供对 MongoDB 和 Cassandra 等 NoSQL 数据库的支持。
3. JDO 与 DataNucleus 的关系
• JDO 是持久化 API 的标准规范,而 DataNucleus 是其具体实现之一。
• 开发者通过使用 DataNucleus,可以使用 JDO 提供的标准化 API。
• DataNucleus 同时支持 JDO 和 JPA,开发者可以根据项目需求选择适合的 API。
4. DataNucleus 的工作原理
1. 字节码增强:
• 使用增强工具对持久化类进行修改,使其实现 PersistenceCapable 接口。
• 增强后的类支持数据的持久化操作。
2. 持久化管理:
• 使用 PersistenceManager 或 EntityManager(JPA)管理对象生命周期。
• DataNucleus 负责将 Java 对象转换为数据库记录。
3. 查询:
• 提供 JDOQL 和 JPQL 查询语言。
• 查询结果可直接映射为 Java 对象。
4. 事务管理:
• 支持声明式和编程式事务管理。
5. JDO 与 JPA 的对比
步骤1:fork 仓库
本次任务是使用jdo规范和datanucleus在欧拉os上测试否则正常运行。
fork demo的仓库,demo中有基于servicecomb实现的完整的微服务脚实例,仓库信息如下:
https://gitcode.com/HuaweiCloudDeveloper/OpenSourceForHuaweiDemoJava/overview
步骤2:本地编译并运行
主要步骤:
- 执行mvn clean install -DskipTests
步骤3:适配思路
集成datanucleus和jdo相关的jar包,在demo上增加一个查询接口,测试是否可行。
官方文档如下:https://www.datanucleus.org/products/accessplatform/jdo/tutorial.html#step4
我的适配项目:https://gitcode.com/chenzhida/opensource-demo-datanucleus-241206/overview?ref=dev_jdo
分支:dev_jdo
步骤3:适配过程的问题
问题1:启动应用,报错:无法找到Meta-data
Caused by: org.datanucleus.exceptions.NucleusUserException: Found Meta-Data for class org.apache.servicecomb.fence.resource.Student but this class is either not enhanced or you have multiple copies of the persistence API jar in your CLASSPATH!! Make sure all persistable classes are enhanced before running DataNucleus and/or the CLASSPATH is correct.
解决:这是因为datanucleus需要预先在编译阶段,执行增强,命令:mvn datanucleus:enhance,注意只需要到用到的模块执行这行命令即可。
问题2:在执行mvn datanucleus:enhance,报错:
plugin:5.2.1:enhance (default-cli) on project resource-server: The DataNucleus tool org.datanucleus.enhancer.DataNucleusEnhancer exited with a non-null exit code. -> [Help 1]
org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal org.datanucleus:datanucleus-maven-plugin:5.2.1:enhance (default-cli) on project resource-server: The DataNucleus tool org.datanucleus.enhancer.DataNucleusEnhancer exited with a non-null exit code.
at org.apache.maven.lifecycle.internal.MojoExecutor.doExecute2 (MojoExecutor.java:333)
at org.apache.maven.lifecycle.internal.MojoExecutor.doExecute (MojoExecutor.java:316)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:212)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:174)
at org.apache.maven.lifecycle.internal.MojoExecutor.access$000 (MojoExecutor.java:75)
at org.apache.maven.lifecycle.internal.MojoExecutor$1.run (MojoExecutor.java:162)
at org.apache.maven.plugin.DefaultMojosExecutionStrategy.execute (DefaultMojosExecutionStrategy.java:39)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:159)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:105)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:73)
at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build (SingleThreadedBuilder.java:53)
at org.apache.maven.lifecycle.internal.LifecycleStarter.execute (LifecycleStarter.java:118)
at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:261)
at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:173)
at org.apache.maven.DefaultMaven.execute (DefaultMaven.java:101)
at org.apache.maven.cli.MavenCli.execute (MavenCli.java:906)
这里出现过很多次,这是因为各个jar包的版本不兼容,参考官网案例上使用的版本
步骤4:添加接口
添加一个接口,能够在不同实例上返回不同的值。
// 配置bean
@Bean
public PersistenceManagerFactory persistenceManagerFactory() {
return JDOHelper.getPersistenceManagerFactory("myJDOUnit");
}
public Student findStudentById(Long id) {
PersistenceManager pm = pmf.getPersistenceManager();
Transaction tx = pm.currentTransaction();
Student result = null;
try {
tx.begin();
// 创建 JDOQL 查询
Query query = pm.newQuery(Student.class, "id == :id");
query.setUnique(true); // 确保查询结果唯一
// 执行查询
result = (Student) query.execute(id);
tx.commit();
} catch (Exception e) {
if (tx.isActive()) {
tx.rollback();
}
e.printStackTrace();
} finally {
pm.close();
}
return result;
}
// 配置xml
<?xml version="1.0" encoding="UTF-8" ?>
<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence" version="2.1">
<persistence-unit name="myJDOUnit">
<class>org.apache.servicecomb.fence.resource.Student</class>
<properties>
<property name="javax.jdo.option.ConnectionURL" value="jdbc:postgresql://ip:port/postgres?currentSchema=class" />
<property name="javax.jdo.option.ConnectionDriverName" value="org.postgresql.Driver" />
<property name="javax.jdo.option.ConnectionUserName" value="root" />
<property name="javax.jdo.option.ConnectionPassword" value="pwd" />
<!-- DataNucleus 配置 -->
<property name="datanucleus.schema.autoCreateAll" value="true"/>
<property name="datanucleus.schema.autoCreateColumns" value="true"/>
<property name="datanucleus.validateTables" value="false"/>
<property name="datanucleus.validateConstraints" value="false"/>
</properties>
</persistence-unit>
</persistence>
步骤6:购买华为云Gaussdb和ECS,上云测试
购买华为云Gaussdb,并且购买公网IP,不然无法访问。配置如下:
产品名称 |
产品类型 |
数据库引擎版本 |
性能规格 |
实例类型 |
部署形态 |
备注 |
云数据库 GaussDB |
基础版 |
8.201 |
独享型1:4 |
集中式 |
1主2备 |
推荐 |
产品名称 | CPU架构 | 实例类型 | 公共镜像 | 镜像版本 | 备注 |
---|---|---|---|---|---|
弹性云服务器 | 鲲鹏计算 | 鲲鹏通用计算增强型 | Huawei Cloud EulerOS | Huawei Cloud EulerOS 2.0 标准版 64位 ARM版(10GiB) | 推荐 |
步骤7:部署并访问
结果如下:
- 点赞
- 收藏
- 关注作者
评论(0)