面向 Java 开发人员的 db4o 指南: 事务、分布和安全性,使用 db4o 进行 Java 企业开发

Java 企业级开发中的事务控制详解:从 JDBC 到 Spring 声明式事务 本文深入解析Java企业级开发中的事务控制机制,从JDBC手动事务到Spring声明式事务(@Transactional)的演进路径。重点介绍了Spring声明式事务的工作机制,包括7种传播行为、回滚规则、隔离级别和只读事务设置。同时揭示了@Transactional的常见使用陷阱,如自调用失效、非public方法、异常捕获和异步方法等场景下的注意事项。文章为Java开发者提供了事务控制的最佳实践指南,帮助构建高可靠性的企业级应用。 阅读详情

在本系列中,我介绍了使用 db4o 进行面向对象数据管理的基本要素。但是还有一点没有讨论,那就是如何在 Web 应用程序中使用 OODBMS,以及与在 Swing 或 SWT 中使用 OODBMS 有何不同。可以说,我忽略的这些内容是 Java(或 .NET)开发人员不能忽略的。

一定程度上,我应该关注 OODBMS 最引人注目的功能:面向对象数据的存储、操作和检索。同样地,OODBMS 供应商也试图实现诸如事务管理和安全性之类的核心功能。这些功能与各种 RDBMS 的相应功能类似,并且具有类似的选项范围。

在面向 Java 开发人员的 db4o 指南 的最后一期中,我将要讨论任何数据存储系统(面向对象的、关系的,等等)都应该拥有的 3 个特性。了解 db4o 如何支持应用程序安全性、分布和事务。

多客户端连接

迄今为止,我为本系列编写的代码都假设数据库只有一个客户端。换句话说,只会为数据库创建一个逻辑连接,所有的交互都通过该连接来完成。对于要访问配置数据库或逻辑存储系统的 Swing 或 SWT 应用程序,这是一个非常合理的假设。但是对于 Web 应用程序,即使是所有的存储都是在 Web 表示层完成的程序,这个假设也不太符合实际。

在 db4o 系统中,打开第二个数据库逻辑连接非常简单,即使当数据库驻留在本地磁盘上时也是如此。我只需要首先添加一个调用创建 ObjectServer,并从 ObjectServer 获取 ObjectContainer 对象。让 ObjectServer 在端口 0 上监听,这样会告诉它以 “嵌入式” 模式运行,并且在进行下一个探察测试时不会打开(或威胁)实际的 TCP/IP 端口。


清单 1. 嵌入式连接

@Test  public   void  letsTryMultipleEmbeddedClientConnections()
    
{
        ObjectServer server 
= Db4o.openServer("persons.data", 0);
        
        
try
        
{
            ObjectContainer client1 
= server.openClient();
            Employee ted1 
= (Employee)
                client1.get(
                    
new Employee("Ted", "Neward", null, null, 0, null))
                .next();
            System.out.println(
"client1 found ted: " + ted1);
            
            ObjectContainer client2 
= server.openClient();
            Employee ted2 
= (Employee)
                client2.get(
                    
new Employee("Ted", "Neward", null, null, 0, null))
                .next();
            System.out.println(
"client2 found ted: " + ted2);
            
            ted1.setTitle(
"Lord and Most High Guru");
            client1.set(ted1);
            System.out.println(
"set(ted1)");

            System.out.println(
"client1 found ted1: " +
                client1.get(
                    
new Employee("Ted", "Neward", null, null, 0, null))
                .next());

            System.out.println(
"client2 found ted2: " + 
                client2.get(
                    
new Employee("Ted", "Neward", null, null, 0, null))
                .next());
                
            client1.commit();
            System.out.println(
"client1.commit()");

            System.out.println(
"client1 found ted1: " +
                client1.get(
                    
new Employee("Ted", "Neward", null, null, 0, null))
                .next());

            System.out.println(
"client2 found ted2: " + 
                client2.get(
                    
new Employee("Ted", "Neward", null, null, 0, null))
                .next());
                
            client2.ext().refresh(ted2, 
1);
            System.out.println(
"After client2.refresh()");
            System.out.println(
"client2 found ted2: " + 
                client2.get(
                    
new Employee("Ted", "Neward", null, null, 0, null))
                .next());
            
            client1.close();
            client2.close();
        }

        
finally
        
{
            server.close();
        }

    }

刷新对象视图

注意,当运行该测试时,我向测试代码中添加了一些输出行。需要对发生的行为进行跟踪,因为 db4o 需要一直保持对打开对象的引用。还应该确保了解内存中对象的更新是在什么时候和什么位置 “传递” 给第二个客户端的。

适用用例:当我进行 set(ted1) 调用时,db4o 系统修改其内部状态,以了解 ted1 是脏对象并需要更新。但是,在使用 ObjectContainer 上的 commit() 方法提交显式事务之前,它不会进行实际更新。此时,数据被写入磁盘,但是跟磁盘上的数据相比,内存中 client2 的对象视图仍然是陈旧的(回顾一下探察测试的输出。在阅读本系列时,您已经 在流览器旁边的控制台窗口运行了该代码)。

改进方法很简单:client2 使用 extension 对象上的 refresh() 方法刷新它在内存中的对象图视图,extension 对象由 ext() 返回。注意激活深度是一个重要因素:当刷新对象时,您希望 db4o 深入到对象图的哪个深度?在本例中,逐步降低深度(single step down)就可以检索修改的 Employee 了,但是对于不同的情形,应该重新考虑。

一旦其对象视图被刷新,client2 就会了解到所做的更改。快速查询将会显示出公司领导的新头衔。

跨多个进程

大多数时候,多个客户端不会只具有单个进程,而是可以跨多个进程。例如,在典型的客户机-服务器风格中,将有多个客户机而不是一个 servlet 容器与单个服务器会话。在 db4o 中实现此功能的方法与 清单 1 大体相同。惟一的区别在于需要用一个非 0 的端口号来打开服务器。该端口号表示服务器监听的 TCP/IP 端口。所有基于 TCP/IP 的通信都是这样,当进行连接时,客户端必须指定主机名和端口。

安全性

自然地,当涉及一个端口时,就得考虑安全性,因为您不能允许 “所有人” 连接服务器并进行查询。在传统的 RDBMS 实现中,供应商提供了一个强大的安全模型,当数据库连接打开时,要访问数据库实例的部分或所有内容,必须向数据库发送凭证(用户名和密码)。

db4o 实现也是这样,至少在效果上是一样的。但是 db4o 数据库实例创建者设置授权安全策略的方法与常见 RDBMS 场景有很大区别,如清单 2 所示:


清单 2. 和其他人进行通信

@Test  public   void  letsTryMultipleNetworkClientConnections()
    
{
        ObjectServer server 
= Db4o.openServer("persons.data", 2771);
        server.grantAccess(
"client1", "password");
        server.grantAccess(
"client2", "password");
            
// Yes, "password" is a bad password. Don't do this in production
            
// code. I get to do it only because I have a special Pedagogical
            
// Code License from Sun Microsystems. And you don't. So don't do
            
// this. Don't make me come over there. I'm serious. 
            
// Fuggedaboutit. Never. Not ever. Capice?
        
        
try
        
{
            ObjectContainer client1 
= 
                server.openClient(
"localhost", 2771, "client1", "password");
            
            ObjectContainer client2 
= 
                server.openClient(
"localhost", 2771, "client1", "password");
                
            Employee ted1 
= (Employee)
                client1.get(
                    
new Employee("Ted", "Neward", null, null, 0, null))
                .next();
            System.out.println(
"client1 found ted: " + ted1);
                
            Employee ted2 
= (Employee)
                client2.get(
                    
new Employee("Ted", "Neward", null, null, 0, null))
                .next();
            System.out.println(
"client2 found ted: " + ted2);
            
            ted1.setTitle(
"Lord and Most High Guru");
            client1.set(ted1);
            System.out.println(
"set(ted1)");

            System.out.println(
"client1 found ted1: " +
                client1.get(
                    
new Employee("Ted", "Neward", null, null, 0, null))
                .next());

            System.out.println(
"client2 found ted2: " + 
                client2.get(
                    
new Employee("Ted", "Neward", null, null, 0, null))
                .next());
                
            client1.commit();
            System.out.println(
"client1.commit()");

            System.out.println(
"client1 found ted1: " +
                client1.get(
                    
new Employee("Ted", "Neward", null, null, 0, null))
                .next());

            System.out.println(
"client2 found ted2: " + 
                client2.get(
                    
new Employee("Ted", "Neward", null, null, 0, null))
                .next());
                
            client2.ext().refresh(ted2, 
1);
            System.out.println(
"After client2.refresh()");
            System.out.println(
"client2 found ted2: " + 
                client2.get(
                    
new Employee("Ted", "Neward", null, null, 0, null))
                .next());
            
            client1.close();
            client2.close();
        }

        
finally
        
{
            server.close();
        }

    }

要在 db4o 中定义访问控制,只需使用 grantAccess() 方法,它授权对整个数据库实例的访问。这种方法简化了安全设置场景,但是这样一来就无法使用最小特权原则了,因此该方法既有优点也有缺点。

最小特权原则

和许多安全思想一样,最小特权原则 的原理很简单,但是有时难于在实践中实现。该原则规定给定用户或代码体应该被授予能完成所分配任务的最少权限,不能拥有多余的特权(显然也不能缺少必要的特权)。例如,在一个 RDBMS 场景中,访问 RDBMS 的代码应该只对它访问的表拥有基本的 SELECT/INSERT/UPDATE/DELETE 权限,而不能超出这些权限。这样,即使代码中包含 SQL 注入攻击程序,它也不能执行注入攻击,因为它没有足够的数据库访问权限。

目前 db4o 还不支持更加粒度化级别的解决方式,其他 OODBMS 系统可能更加灵活。您应该确保只使用了最小数量的安全性凭证。如果不能限制登录需要使用的资源,那么至少可以限制系统访问原则的数量。

加密格式

分布式系统的安全性问题 — 尤其是 Fourth Fallacy of Enterprise Computing(参考 参考资料 中的 Effective Enterprise Java)— 说明,不能认为只有监听网络通信量的人或代码才是可信的。这意味着您必须确保在网络中传输的数据不是明文和二进制形式(如果使用的二进制形式的格式众所周知,那么它和明文形式是相同的)。

关心安全性的开发人员也会关心存储在 db4o 文件中的数据,因为文件 “仅仅是文件”,因此打开文件和阅读其中的内容会将文件暴露给攻击者(关系数据库也存在着这类问题)。

解决方案是对文件进行加密,这在 db4o 中比较简单。对于大多数场景,db4o 的默认加密模式 eXtended Tiny Encryption Algorithm (XTEA) 对暴露给攻击者的数据进行模糊化。对于其他实例,db4o 提供了一个定制加密 “技巧”,支持使用第三方加密提供程序(不要定义自己的加密格式,除非您可以编写出论文挑战既有标准,并受到全世界密码学家和数学家的关注,而且可以在主流安全会议上进行辩护。如果达到了这些要求,您可以 考虑使用它,毕竟,没有被发现并不意味着不存在)。

保护数据

保护有线形式(wire-format)的数据传输比较困难,因为 db4o 6.3 及以前的版本都没有提供工具跨安全的传输线(比如通过 SecureSocket 传输的 SSL)进行通信。这意味着任何敏感数据都必须以加密的方式传输,这暗示着对象本身应该包含某种形式的加密(如果 db4o 可以直接实现这一功能就太好了;在撰写本文的时候,db4o 6.4 版已经计划支持将 SocketFactory 传递到 openServer 调用,因此您可以使用 SecureSocket 连接取代完全开放的 Socket 连接)。

注意可以使用定制编组程序 通过 “横切(cross-cutting)” 方式进行传递以保护数据。顾名思义,这使您能够控制数据的打包(和解包)方式,以在线路上进行传输。这种方法与通过 Externalizable 接口定制串行化非常相似:编写一个实现 ObjectMarshaller 接口的类,实现 readFields() 和 writeFields() 方法,然后告诉 db4o 系统对特定类的对象使用定制的编组程序,具体方法是在目标类的 ObjectClass 上调用 marshallWith()。完整的代码如下:

Db4o.configure().objectClass(Item.class).marshallWith(customMarshaller);

这样做不会保护整个线路 — 攻击者仍然可以查看保存的对象类型 — 但是它会在网络上进行节点到节点传输时阻止数据被别人查看。

当 db4o 选项 “嵌入式和客户机/服务器” 不能满足需要时,比如将数据存储到特定的文件格式或非传统的数据存储资源中,db4o 库允许创建 IoAdaptor 的一个子类,该类是 db4o 在存储对象时写入数据的关键抽象。这让存储具有一定程度的灵活性,而大多数 RDBMS 系统都不具有这种灵活性。

结束语

关于 OODBMs 和 db4o,还有大量内容值得讨论和研究,但是我已经完成了预定目标并决定暂时结束本系列。我相信我展示了一个关于 db4o 和面向对象数据管理的良好示例,并从 Java 开发人员的角度介绍了 RDBMS 不同于 OODBMS 的特性。我展示了如何使用 db4o 轻松地跟踪关联(track association);db4o 如何获得作为数据库优秀概念的继承性;db4o 如何使用定义对象的原生编程语言简化对象检索。

我也讨论了 OODBMS 的一些不足,以及 db4o 与 RDBMS 都存在的缺陷,比如在处理客户机-服务器网络中的 “往返传输” 时出现的性能问题。

只要跟随本系列的示例并试用了其中的代码,就会获得使用任何 OODBMS 系统(不只是 db4o)的必备技巧。您可以尝试将所学知识应用到 Cache' 或 Versant 上。大多数 OODBMS 都遵循相同的基本编码约定和惯用表达式,而且实际上 db4o 对原生查询的支持已逐渐成为一种标准,使该特性成为所有 OODBMS 的一部分。

希望您能在本系列中找到所需的内容,并已准备好在您自己的项目中使用 OODBMS。这将是一种轻松的体验,不用担心关系模式和所有相关的内容。因此,请放松心情:试验、实现、在实践中体验乐趣,不要忘了来信告诉我您的经验(或者给我发送电子邮件)。

参考资料

学习

Java分布式事务实践指南及Demo JTA(Java Transaction API)是Java EE(现在是Jakarta EE)的一个标准规范,用于提供一个事务管理的接口,允许开发者编写可移植的事务性代码,而不必关心底层事务管理的实现细节。JTA定义了一组用于分布式事务的编程接口,它允许应用程序执行跨多个资源管理器(如数据库、消息服务等)的事务操作。JTA的主要组件包括:TransactionManager(事务管理器):负责全局事务的生命周期管理,包括事务的开始、提交和回滚。 阅读详情

相关推荐

db4o-7.2-java

一个很优秀的面向对象的数据库,希望官方能够把这个优秀的数据库交能社区来进行继续开发,或者有没有人有兴趣在db4o原来的基础上再进行兴许开发。

Db4o 查询、插入、更新、删除操作

Db4o数据库工具类,懒人式一键调用!!!

今天能喝可乐吗 1105

db4o for java

nosql面向对象的数据库,只需引入jar包

面向对象的数据库db4o: 安装并使用db4o

为什么80%的码农都做不了架构师?>>> ...

weixin_34362875的博客 391

面向 Java 开发人员的 db4o 指南: 第 3 部分:db4o 中的数据库重构

NULL 博文链接:https://springjava.iteye.com/blog/373973

java数据库(db4o)

java开发用的一个小型数据库,有完整版的也有精简版的

面向 Java 开发人员的 db4o 指南

 第一部分 简介和概览    早就听说数据库间的大战以关系型数据库的胜利告终。然而,这之后,编程界真的就风平浪静、一片繁荣了吗?持肯定观点的人恐怕最近都没有试过使用关系数据库来支持 Java™ 对象吧。著名作家和讲师 Ted Neward 为我们带来了这个由多个部分组成的 系列 ,深入介绍了 db4o,它是当前关系型数据库的一种面向对象的可

leagle 2379

【计算机视觉40例】案例08:石头剪刀布手势识别

计算机视觉40例——从入门到深度学习(OpenCV-Python)》在介绍Python基础、OpenCV基础、计算机视觉理论基础、深度学习理论的基础上,介绍了计算机视觉领域内具有代表性的40个典型案例。这些案例中,既有传统的案例(数字识别、答题卡识别、物体计数、缺陷检测、手势识别、隐身术、以图搜图、车牌识别、图像加密、指纹识别等),也有深度学习案例(图像分类、风格迁移、姿势识别、实例分割等),还有人脸识别方面的案例(表情识别、驾驶员疲劳监测、识别性别与年龄等)。......

计算机视觉之光 2157

java db4o,DB4O--java对象数据库

特点直接存储java对象,抛弃对象映射的繁琐可以使用简单的查询语句致命缺点与java语言绑定demogitee地址https://gitee.com/ichiva/db4o-demo.git主要依赖org.fudaa.com.db4odb4o-java55.5.1编写测试用例官方实体类@Datapublic class Car {private Integer id;private String ...

weixin_33859693的博客 484

MDK开发篇:基于立创逻辑派FPGA-G1与Cortex-M1软核的按键控制LED实战

本文详细介绍了基于立创逻辑派FPGA-G1开发板与高云Cortex-M1软核的完整开发流程。通过Gowin云源软件配置软核系统与GPIO外设,并在Keil MDK环境中编写按键控制LED的C程序,最终实现程序固化与上电自启动。教程涵盖硬件配置、软件开发、在线调试与固化部署全步骤,帮助STM32开发者快速上手FPGA软核开发。

weixin_42103128的博客 147

美亚杯2023参赛全攻略:从检材下载到Veracrypt挂载的保姆级教程

本文提供美亚杯2023电子数据取证竞赛的完整参赛指南,重点解析从检材下载、Veracrypt挂载到实战取证的保姆级流程。针对新手常见误区,详细说明两套密码(ZIP解压密码与Veracrypt挂载密码)的区别与正确使用方法,并分享赛前环境搭建、赛中高效分析及赛后报告撰写的核心技巧,帮助参赛者系统备赛,规避基础错误。

y9z0a1b的博客 1079

面向 Java 开发人员的 db4o 指南: 数组和集合,处理对象数据库中的多样性

在本系列的前一篇文章中,我开始谈到了 db4o 如何处理 结构化对象,或者包含非原始类型字段的对象。正如我所展示的那样,增加对象关系的复杂性对 db4o 持久模型有一些重大的影响。我谈到了在删除期间解决像激活深度(activation depth)、级联更新与删除和参照完整性等问题的重要性。我还介绍了一种叫做 探察测试 的开发人员测试策略,附带给出了使用 db4o API 的第一个练习。在本文

537

从零构建高精度温控系统:ADN8835的单电感拓扑与0.01℃稳定性实战解析

本文深入解析了如何利用ADN8835构建高精度温控系统,重点介绍了其创新的单电感拓扑架构如何实现0.01℃的长期稳定性。内容涵盖精密PCB布局、电源滤波设计,并详细阐述了针对不同热容负载的数字PID控制参数整定策略,为开发精密仪器和医疗设备提供了实战指南。

r2s3t4的博客 238

面向 Java 开发人员的 db4o 指南: 事务、分布和安全性,使用 db4o 进行 Java 企业开发...

在本系列中,我介绍了使用 db4o 进行面向对象数据管理的基本要素。但是还有一点没有讨论,那就是如何在 Web 应用程序中使用 OODBMS,以及与在 Swing 或 SWT 中使用 OODBMS 有何不同。可以说,我忽略的这些内容是 Java(或 .NET)开发人员不能忽略的。 一定程度上,我应该关注 OODBMS 最引人注目的功能:面向对象数据的存储、操作和检索。同样地,OODBMS 供应商...

zhangziyangup 205

不用API Key也能玩转Obsidian AI:本地大模型离线配置全攻略

本文详细介绍了如何在无需API Key的情况下,通过本地部署大型语言模型(LLM)为Obsidian注入AI能力。文章以Ollama为例,提供了从环境准备、模型选择到与Obsidian插件(如Text Generator)集成的完整配置攻略,旨在帮助用户打造一个安全、离线可用的智能笔记工作流,实现数据隐私与AI助力的完美结合。

weixin_29062963的博客 817

Unity 编辑器篇|(一)MenuItem菜单栏

"一级菜单/二级菜单上/三级菜单""一级菜单/二级菜单中 %#_B""一级菜单/二级菜单下 %&_C""一级菜单/二级菜单中 %#_B""一级菜单/二级菜单下 %&_C""GameObject/二级菜单""CONTEXT/组件名/菜单名""一级菜单/二级菜单上 #_A""Assets/二级菜单""一级菜单/二级菜单下""一级菜单/二级菜单上""一级菜单/二级菜单中""一级菜单/二级菜单下""一级菜单/二级菜单下""一级菜单/二级菜单上""一级菜单/二级菜单中""一级菜单/二级菜单下""自定义/Test"

游戏开发小Y的博客 13万+

面向 Java 开发人员的 db4o 指南: 事务、分布和安全性

      通过直接在面向对象的数据库(如 db4o)中存储对象,Java™ 开发人员可以获得很多好处。如果 OODBMS 缺乏对事务的支持或不能在分布式环境中使用数据(并保证其安全性),您可能不会过多地使用它。在面向 Java 开发人员的 db4o 指南 的最后一期中,Ted Neward 展示了如何使用 db4o 处理 3 个与 Java 企业开发密切相关的问题:事务、分布式数据管理和 Web

leagle 1230

【Java基础篇】Java重要特性,JDK,JRE,JVM区别和联系,环境变量

JDK使用时的执行流程: • 开发者视角(需要开发java程序):需要安装JDK a. 首先使用JDK调用Tools&Tool APIs(开发者工具)编写好Java程序--xxx.java b. 再次调用Tools&Tool APIs中的javac.exe(编译程序)来编译.java文件(将java文件编译成字节码.class文件) c. 调用java.exe来启动JRE d. 在JRE上运行JAVA字节码(加载特定的.class文件,调用这个class文件中的main方法

Yaoyao2024的博客 2163

面向 Java 开发人员的 db4o 指南:第 7 部分:事务、分布和安全性

通过直接在面向对象的数据库(如 db4o)中存储对象,Java™ 开发人员可以获得很多好处。如果 OODBMS 缺乏对事务的支持或不能在分布式环境中使用数据(并保证其安全性),您可能不会过多地使用它。在面向 Java 开发人员的 db4o 指南 的最后一期中,Ted Neward 展示了如何使用 db4o 处理 3 个与 Java 企业开发密切相关的问题:事务、分布式数据管理和 Web 应...

SpringJava的博客 234

25、BDS-3卫星信号性能与PPP-B2b增强消息完整性分析

本文对BDS-3卫星信号性能及PPP-B2b增强消息的完整性进行了系统分析。评估了MEO、IGSO和GEO卫星的轨道与时钟精度,得出BDS-3总体SISRE为0.25 m,系统完整性可覆盖99.999%的误差。分析表明SIS中断主要由时钟调整和轨道机动引起,个别卫星存在因境外监测受限导致的非计划中断。通过自研解码软件对PPP-B2b增强消息进行采集与解析,实验结果显示BDS-3和GPS的平均历元完整性率均高于98.55%,其中卫星掩码和时钟校正消息的完整性率超过99.8%。研究还发现IGSO卫星相比MEO卫

quiet的专栏 145

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

db4o 参考资料

转自IBM:http://www.ibm.com/developerworks/cn/java/jdb4o/ 本系列是对开放源码数据库 db4o 的详尽介绍,db4o 可以充分利用当前的面向对象的语言、系统和理念。要下载 db4o,可以参考 db4o 主页;为了实践本系列的示例,需要下载 db4o。 系列文章 第 1 部分:简介和概览 (2007 年 4 月 9 日)

jmppok的专栏 863

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

如何成为一个成功的 Java 开发人员?

如果你是一名成功的Java程序员,那么在任何公司中的Java开发人员中,你都有机会获取一席之地。 作者 |ASHISH KHURAISHY 译者 |苏本如,责编 | 郭芮 出品 | 优快云(ID:优快云news) 以下为译文: 在当今时代,有很多编程语言可能会塑造我们的未来。然而,当我们开始学习编程时,我们总是从C语言开始,然后转到C++或许多其它编程语言中的一种。但今...

优快云资讯 4277

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

支持事务的nosql数据库_事务性NoSQL数据库

支持事务的nosql数据库 Java平台在几乎整个生命周期中都经历了极大的痛苦,以使数据库持久性对开发人员尽可能地无缝。 无论您是在最早的JDBC规范,EJB,Hibernate之类的O / R映射器上还是在最近的JPA规范上,您都可能遇到过关系数据库。 也许同样有可能,您也已经了解了如何从面向对象的角度对数据建模与数据如何存储在关系数据库中之间的区别(有时被开发人员称为阻抗不匹配 )。 但...

cunfu6353的博客 1726

分布式事务六大方案深度解析:适用场景与Java代码实战

强一致性场景优先选择2PC或Seata AT,但需接受性能损耗。高并发最终一致性场景TCC或MQ事务消息是最佳选择。长业务流程使用Saga模式,配合补偿机制。注意事项所有方案需配合幂等设计和重试机制。监控事务执行状态(如分布式链路追踪)。

双非二本自学到互联网公司的成长经历,有故事,有干货。 1853
上一篇: 面向 Java 开发人员的 db4o 指南: 结构化对象和集合,db4o 中的继承和多态
下一篇: 使用 Spring 2.5 基于注解驱动的 Spring MVC
phantomhu
博客等级 码龄23年 70粉丝 24原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值