- 博客(40)
- 资源 (49)
- 收藏
- 关注
原创 Netty简要介绍
下面是Netty框架的几个主要特点和组成部分:异步和事件驱动:Netty使用异步的I/O操作和事件驱动模型,这意味着它能够处理大量的并发连接,并且不会阻塞线程。它通过使用少量的线程来处理多个连接,提供了高效的资源利用率。高性能:Netty的核心是使用了高度优化的数据结构和算法,以及零拷贝技术,这使得它能够在网络应用程序中实现非常低的延迟和高吞吐量。它还提供了可定制的线程模型,可以根据应用程序的需求进行配置。
2023-06-22 20:46:04
780
原创 Java中的OIO和NIO详解(含代码)
阻塞 vs 非阻塞:OIO是阻塞I/O模型,每个I/O操作都是阻塞的,即线程在执行I/O操作时会一直等待直到操作完成。NIO是非阻塞I/O模型,它使用Selector来实现非阻塞操作,允许单个线程处理多个通道的I/O事件。多线程 vs 单线程:OIO模型中,每个连接都需要创建一个独立的线程进行处理,当连接数量较多时,线程开销较大。NIO模型中,可以使用单个线程处理多个连接,减少了线程开销。
2023-06-22 20:36:25
2632
原创 Java NIO中Buffer方法详解(含代码示例)
Java NIO(New IO)中的Buffer类是一个抽象类,用于在Java程序中进行数据的读取和写入操作。它提供了一组方法来操作底层数据容器,例如数组或ByteBuffer。下面是对Buffer类中常用方法的详细解释和代码示例。
2023-06-21 09:32:19
1130
原创 JAVA NIO创建服务端(含代码详解)
当使用Java NIO(New I/O)创建一个服务端时,你需要使用。这里定义了一个缓冲区大小和一个超时时间,可以根据需要进行调整。配置为非阻塞模式,并绑定到指定的端口(这里使用的是8080)阻塞等待就绪的事件。如果没有任何事件就绪,将继续下一次循环。方法读取数据,并进行相应的处理。在示例中,将读取的数据存储到。这样可以确保在使用完后自动关闭它们。这是服务端的主要事件循环。事件,表示有新的客户端连接请求。集合,并遍历处理每个就绪的事件。事件,表示有数据可读取。中,并打印接收到的消息。
2023-06-21 08:53:55
823
原创 JAVA NIO概念详解
Java NIO(New I/O)是Java平台提供的一组用于高效处理I/O操作的API。相较于传统的Java I/O(java.io)API,Java NIO提供了更加灵活、高效的非阻塞I/O操作方式。主要一些概念如下。
2023-06-20 20:51:28
1129
原创 SpringBoot Bean的生命周期
您也可以自定义一个方法作为Bean的初始化方法,并在配置类或XML配置文件中进行配置。@Component// 初始化操作// ...上述示例中,MyBean类中定义了一个名为init的自定义初始化方法。上述示例中,通过@Bean注解的initMethod属性指定了初始化方法的名称。无论选择哪种方式,当Spring Boot实例化Bean后,会根据所选择的方式调用相应的初始化方法。您也可以自定义一个方法作为Bean的销毁方法,并在配置类或XML配置文件中进行配置。@Component。
2023-06-17 22:24:35
1334
原创 SpringBoot常用注解及使用方式(含代码)
用于启动Spring Boot应用程序的主类上,它组合了多个注解(@SpringBootConfiguration、@EnableAutoConfiguration和@ComponentScan)
2023-06-16 06:30:00
991
原创 Spring依赖注入、控制反转、面向切面编程三大特性详解(含示例代码)
Spring 框架是一个开源的企业级应用程序开发框架,它提供了许多功能和特性,但主要包括以下三大核心特性:依赖注入(Dependency Injection,DI): 依赖注入是 Spring 的核心特性之一。它通过控制反转(Inversion of Control,IOC)实现对象之间的解耦。在传统的编程模型中,对象自己负责创建和管理它所依赖的对象,而在 Spring 中,容器负责创建对象,并将依赖关系注入到对象中。这样可以提高代码的可维护性、可测试性和松耦合性。
2023-06-16 02:00:00
1934
原创 SpringBoot事务详解(含示例代码)
在Spring Boot中,事务是用于管理数据库操作的重要机制。Spring Boot提供了多种方式来处理事务,主要包括编程式事务管理和声明式事务管理。
2023-06-15 11:03:38
2888
1
原创 SpringBoot事物失效场景
方法未被声明为事务:在Spring Boot中,事务是基于注解或XML配置的方式进行声明的。在上述示例中,updateUserStatus方法没有被声明为事务,即使该方法中的数据库更新操作失败,也不会回滚,可能导致数据库中的数据和应用状态不一致。在上述示例中,updateUserStatus方法是私有的,虽然在activateUser方法中调用了它,但事务注解将不会应用于私有方法,导致事务失效。在实际开发中,应注意事务的声明、异常的抛出和方法的可见性,以确保事务的正确应用和回滚。// 受检查异常未被抛出。
2023-06-14 20:14:26
1747
2
原创 DDD—实体和值对象
实体的标识符可以是持久化存储中的数据库主键,也可以是自定义的唯一标识符。值对象(Value Object)是没有唯一标识符的对象,它的相等性是基于其属性的值。在领域驱动设计(Domain-Driven Design,DDD)中,实体(Entity)和值对象(Value Object)是两个重要的概念,用于建模领域中的不同类型的对象。例如,电子商务系统中的商品。在这个系统中,商品被视为值对象,因为它们的相等性是基于其属性的值。实体侧重于对象的唯一标识和标识的不变性,而值对象侧重于对象属性的值和属性的不变性。
2023-06-13 08:42:37
1128
原创 万字长文+示例代码详解DDD中常用的架构(含代码示例)
六边形架构的优势在于它的灵活性和可测试性。通过将领域模型与外部系统隔离开来,我们可以独立地测试领域逻辑,并对外部系统进行模拟或替代。此外,六边形架构还支持领域模型的独立演化,使系统更具灵活性和可扩展性。CQRS 的优势在于它能够根据不同的操作类型进行优化,提高系统的性能和可伸缩性。通过将读写操作分离,可以针对不同的操作类型采用不同的数据存储和处理方式。此外,CQRS 还能够帮助实现更好的领域模型设计,使系统更加灵活和可扩展。
2023-06-12 17:12:31
2711
原创 DDD战略设计--如何定义领域服务(含示例代码)
在领域驱动设计(Domain-Driven Design,DDD)中,领域服务(Domain Service)是一种表示领域概念和业务逻辑的重要构造。领域服务不属于特定的实体或值对象,而是通过执行一系列操作来实现某个业务目标。它们通常涉及多个领域对象之间的协调和交互,并提供高层次的业务操作。,其中包含了产品的创建、更新、删除和按分类获取产品等业务逻辑。在前几个章节中主要介绍了聚合等操作,本章说一下如何定义领域服务。,声明了一些与产品相关的业务方法。并使用其中的方法来处理产品相关的操作。
2023-06-12 16:29:51
2840
原创 JPA中为什么不建议代码中使用EntityManage
通过使用 Repository 或 DAO(数据访问对象)模式,将与数据库相关的操作封装在单独的类中,可以更好地分离关注点,使代码更加清晰。使用容器管理的事务,例如使用 Spring 的事务管理器,可以更好地处理事务边界,确保事务的一致性和原子性。如果需要更复杂的查询或自定义方法,可能需要使用其他的Repository模式,或自定义Repository接口,并使用@Query注解编写自定义的JPQL或原生SQL查询。这样,在需要更换底层 ORM 框架或数据库时,只需要调整实现,而不需要修改调用方的代码。
2023-06-12 10:20:25
821
原创 JPA关系模型——一对一及一对多关系
在Department实体类中,使用@OneToMany(mappedBy = "department")注解表示与Employee实体类的关系,mappedBy属性指定了关系维护的端,即Employee类中的department属性。在Employee实体类中,使用@ManyToOne注解表示与Department实体类的关系,@JoinColumn注解指定了外键列的名称,这里使用了department_id。通过前面几篇文章的学习,我们了解到了JPA的几种关系模型,并举例说明了一对一的关系模型。
2023-06-11 20:57:36
1381
原创 DDD--聚合和JPA的结合(含示例代码)
聚合的边界:在DDD中,聚合是一组相关的领域对象的集合,其中一个对象作为聚合根(Aggregate Root)来管理其他对象。在使用JPA时,可以使用JPA的实体生命周期回调方法(例如@PrePersist、@PreUpdate、@PreRemove等注解)来处理聚合的生命周期事件。聚合的持久化:使用JPA进行持久化时,可以使用实体管理器(EntityManager)来管理聚合的生命周期。通过使用JPA的实体管理器,可以将聚合的状态从内存中持久化到数据库,并提供CRUD(创建、读取、更新、删除)操作。
2023-06-10 10:59:57
999
原创 DDD战略设计--如何设计聚合(含示例代码)
通过聚合的设计,可以将相关的领域对象组织在一起,并将聚合作为一个整体来进行操作和维护。在聚合内部,User实体作为聚合的根实体,负责处理用户的行为和业务逻辑。在"User"聚合中,User实体是聚合的根实体,它负责维护用户的个人信息。Friendship、Interest和Follower等对象是User实体的子对象,用于管理用户之间的社交关系。聚合的设计可以提高系统的内聚性和可维护性,同时保护聚合内部的一致性和完整性。类表示用户聚合的根实体,包含用户的基本信息以及与好友、兴趣和粉丝相关的操作。
2023-06-10 10:48:44
1609
原创 DDD战略设计--如何确定限界上下文
使用领域知识建模的技术,例如事件风暴(Event Storming)、领域建模会话(Domain Modeling Session)等,团队成员和领域专家共同参与,将领域知识可视化为事件、实体、值对象、聚合等概念,从而识别出潜在的限界上下文。:分析业务流程和业务需求,识别出不同的业务边界和业务活动,然后将其映射到相应的限界上下文。每个限界上下文应该有明确的职责和边界,负责特定的业务领域。:考虑技术架构和团队结构的因素,将限界上下文与团队的责任和能力相匹配,以确保团队能够有效地理解和实现相应的上下文。
2023-06-10 10:21:30
1078
原创 DDD--战略设计步骤
定义共享内核(Shared Kernel):当多个限界上下文之间存在共享的领域概念和业务规则时,可以创建共享内核来实现代码的重用和协调。关键在于充分理解领域知识,与领域专家密切合作,并采用合适的设计技术和方法来构建高质量的领域模型和系统架构。定义领域服务(Domain Service):根据领域中的复杂业务操作,确定需要设计和实现的领域服务。在领域驱动设计(Domain-Driven Design,DDD)中,战略设计是指在系统的整体层面上考虑领域模型的组织和架构。
2023-06-10 10:16:24
1413
原创 DDD--战略设计和战术设计
战略和战术相互关联,战略指导着系统整体的设计和架构,而战术则负责具体实现和组织单个限界上下文内的领域模型。当不同的限界上下文之间存在共享的领域概念和业务规则时,可以通过共享内核来实现代码的重用和协调。聚合(Aggregate):聚合是一组相关的实体和值对象的集合,它们具有共享的生命周期和边界。值对象(Value Object):值对象是没有唯一标识的领域对象,通常用于表示领域中的属性或组合值。领域服务(Domain Service):领域服务是一种无状态的操作或行为,用于跨实体或聚合执行复杂的领域操作。
2023-06-10 10:15:09
1107
原创 DDD--基本概念
(Domain Service):领域服务是一些操作和行为,它们与具体的实体和值对象紧密相关,但不属于任何单个对象。聚合有一个聚合根(Aggregate Root),它是聚合的入口点,负责协调和管理聚合内的对象。(Domain Model):领域模型是对业务领域的抽象和建模,它包含了业务对象、业务规则以及业务流程。领域是开发团队和业务专家共同关注的核心部分,通过建立清晰、可靠的领域模型来深入理解和解决业务问题。(Aggregate Root):聚合根是聚合中的一个实体,它是聚合的入口点和访问点。
2023-06-10 09:49:08
1323
原创 Could not commit JPA transaction; nested exception is javax.persistence.RollbackException
检查JPA实体对应的数据库表中的Version字段值是否为空。
2022-05-19 13:57:19
3105
原创 JPA入门
目录JPA概述JPASpring Data JPAJPA注解基础注解EntityTableIdEnumeratedTransientColumnTemporal联合主键注解IdClassEmbeddable和EmbeddedId注解实体之间关联关系注解OneToOneManyToOne和OneToManyRepositoryJPA查询方式DQM(定义查询方法)使用实例DMQ方法名中支持的关键字支持分页和排序.
2022-03-16 14:54:00
18148
原创 C/C++中常遇到的减去‘0’(字符0)的意义
字符‘0’在ASCII中对应的值是48,所以如果字符‘1’减去‘0’的话得出的值就是数字类型的1,其他的可以用来转换大小写或者数字和和字符。
2020-04-24 13:44:32
3936
原创 __attribute__简介
__attribute 其实是个编译器指令,告诉编译器声明的特性,或者让编译器进行更多的错误检查和高级优化。attribute可以设置函数属性(Function Attribute)、变量属性(Variable Attribute)和类型属性(Type Attribute)。__attribute__语法格式为:__attribute__ ((attribute-list))...
2020-04-18 09:20:02
1255
原创 Redis显示中文
1.只需要在启动redis-cli时在其后面加上--raw参数即可启动后,再显示就正常了。如果进入之后显示乱码的汉字,只需要修改一下远程工具的编码方式为UTF-8redis-cli -h 127.0.0.1 -p 6379 --raw2. 在linux中使用命令显示单独的字符,若有乱码参照上面的处理方式。echo -e "\xe5\x85\xac"...
2019-11-09 15:08:22
3142
转载 delphi TMemoryStream对象用法
TMemoryStream对象是一个管理动态内存中的数据的Stream对象,它是从TCustomMemoryStream中继承下来的,除了从TCustomMemoryStream中继承的属性和方法外,它还增加和覆盖了一些用于从磁盘文件和其它注台读数据的方法。它还提供了写入、消除内存内容的动态内存管理方法。下面介绍它的这些属性和方法。TMemoryStream的属性和方法1.Ca...
2019-07-11 09:04:14
1832
转载 线程中CreateEvent和SetEvent及WaitForSingleObject的用法
首先介绍CreateEvent是创建windows事件的意思,作用主要用在判断线程退出,线程锁定方面.1. CreateEvent函功能描述:创建或打开一个命名的或无名的事件对象.EVENT有两种状态:发信号,不发信号。SetEvent/ResetEvent分别将EVENT置为这两种状态分别是发信号与不发信号。WaitForSingleObject()等待,直到参数所指定的OB...
2019-05-28 16:06:33
543
原创 Delphi笔记
1.释放对象资源Free、Nil和Freeandnil函数在Delphi中一个对象名只是一个指向该对象的指针,可以有多个指针指向同一个对象地址。Nil是将指针置空Free则将指针指向的对象销毁掉Freeandnil释放对象并将指针置为空。...
2019-05-28 15:01:59
195
转载 Delphi TIniFile 用法
一、定义1、在Interface的Uses节增加IniFiles;2、在Var变量定义部分增加一行:myinifile:Tinifile;然后,就可以对变量myinifile进行创建、打开、读取、写入等操作了。二、打开INI文件 Filename:=ExtractFilePath(Paramstr(0))+'program.ini'; myinifile:=Ti...
2019-05-28 14:04:39
1469
转载 临界区对象TCriticalSection(Delphi) 与 TRtlCriticalSection 的区别
TRtlCriticalSection 是一个结构体,在windows单元中定义;TCriticalSection是在SyncObjs单元中实现的类,它对上面的那些临界区操作API函数进行了了封装,简化并方便了在Delphi的使用;如TCriticalSection.Enter,就是调用了EnterCriticalSection这个API函数。多线程程序中,如果各个线程要访问同一个资源,如...
2019-05-28 13:40:31
2419
原创 Acclerate C++ 让类对象像一个数值一样(12章)(简单的String)
#include"Vec.h"#include<iterator>class Str{ //输入输出 friend std::istream& operator >> (std::istream&, Str&);public: typedef Vec<char>::size_type size_type; Str() ...
2018-12-27 09:37:16
348
原创 Acclerate C++ 定义抽象数据类型(仿写STL中的Vector)
Vec.h #include<algorithm>#include<memory>template <class T>class Vec{public: typedef T* iterator; typedef const T* const_iterator; typedef size_t size_type; typedef T val...
2018-12-26 15:16:07
479
原创 PL/SQL基础知识总结(根据网络内容整理)
1. PL/SQL简介 PL/SQL是ORACLE系统的核心语言,现在ORACLE的许多部件都是由PL/SQL写成。在PL/SQL中可以使用的SQL语句有:INSERT,UPDATE,DELETE,SELECT INTO,COMMIT,ROLLBACK,SAVEPOINT。提示:在 PL/SQL中只能用 SQL语句中的 DML 部分,不能用 DDL 部分,如果要在PL/SQL中使用...
2018-12-13 13:34:57
777
原创 计算机算法基础总结(借鉴、整理)
作者:Jerry4me链接:https://www.jianshu.com/p/f6e35db6bc51排序算法算法 最优复杂度 最差复杂度 平均复杂度 稳定性 选择排序 O(n²) O(n²) O(n²) 不稳定 冒泡排序 O(n) O(n²) O(n²) 稳定 插入排序 O(n) O(n...
2018-12-13 13:28:06
3456
转载 crosscheck archivelog all和crosscheck backup of区别(转)
crosscheck archivelog all; 验证的是DB的归档日志即log_archive_dest参数指定位置的文件,当手工删除了归档日志以后,Rman备份会检测到日志缺失,从而无法进一步继续执行。所以此时需要手工执行crosscheck过程,之后Rman备份可以恢复正常。RMAN> crosscheck archivelog all;释放的通道: ORA_DISK_1...
2018-09-12 19:52:29
1263
原创 C++查找算法总结(可执行代码)
1. 顺序查找 核心:从数据的第一个元素开始,依次比较,直到找到目标数据或查找失败。1.从表中的第一个元素开始,依次与关键字比较。2.若某个元素匹配关键字,则 查找成功。3.若查找到最后一个元素还未匹配关键字,则 查找失败。时间复杂度:顺序查找平均关键字匹配次数为表长的一半,其时间复杂度为O(n)。顺序查找的评估:顺序查找的优点是对表无要求,插入数据可在O(1)内完成。...
2018-09-10 17:27:48
4885
2
原创 C++排序算法总结(可执行代码)
常见的分类算法还可以根据排序方式分为两大类:比较排序和非比较排序。本文中前七种算法都是比较排序,非比较排序有三种,分别为: 1)计数排序(Count Sort)(复杂度O(n+k)(其中k是待排序的n个数字中最大值) 2)基数排序(Bucket Sort)(复杂度O(nk)(其中k是最大数字的位数) 3)桶排序(Radix Sort)(复杂度O(n+k)(其中k...
2018-09-10 17:21:39
7760
PL/SQL编程基础知识
2018-11-30
数据结构 排序综合
2013-06-13
数据结构 教学计划编制
2013-06-13
数据结构 迷宫
2013-06-13
数据结构 图的应用
2013-06-13
查找、排序的应用
2013-06-13
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人