请允许在我们的网站上展示广告
您似乎使用了广告拦截器,请关闭广告拦截器。我们的网站依靠广告获取资金。
我已知悉
文章发布订阅~
通过邮箱订阅文章更新,您将在文章发布时收到及时的邮件提醒~
邮箱
昵称
订阅
关闭
首页
专栏
橙Bot
导航
图库
标签分类
文章归档
翻译橙
🌟2024年度总结
动态
友链
留言板
1
如何在熟练进行响应式编程
2
什么时候会用到响应式编程?
3
R2DBC:为关系型数据库带来真正的反应式编程体验
4
Java 高效日志管理:如何优化 Logback 和 SLF4J 的性能?
5
代码之境:橙序员的JAVA漂流(十三)
橙序员
累计撰写
212
篇文章
累计创建
69
个标签
累计收到
4
条评论
栏目
首页
专栏
橙Bot
导航
图库
标签分类
文章归档
翻译橙
🌟2024年度总结
动态
友链
留言板
搜索
标签搜索
响应式编程
R2DBC
小说
成长
公众号
事务
流处理
大数据
旅行
mongo db
SUNO
github
IDEA
安全
注解
总结
求职
分布式事务
CAP
分布式系统
loadbalancer
装修
买房
前端
方案设计
AIGC
JVM
资讯
Netty
NIO
BIO
zookeeper
RocketMQ
MySQL
stable diffusion
spring MVC
spring AOP
JDBC
mybatis
logback
docker
consul
spring event
新冠
连接池
redis
运维
nginx
hiper-v
DDD
搞笑
数据库
团建
游戏
Gradle
心情
好物
eureka
spring framework
spring boot
设计模式
apache common
ShardingSphere
KAFKA
leetcode
spring cloud
feign
ES
起点
目 录
CONTENT
以下是
开发技巧
相关的文章
2023-04-09
spring如何实现依赖注入?
本文主要介绍了在上一篇关于Spring如何实现控制反转的文章中留下的一个拓展问题:如何使用容器创建依赖对象的实例。首先通过手动创建对象的过程和通过Spring容器创建对象的流程进行对比,指出了在Spring配置文件中新增属性集合和属性注入方式等改动点。接着介绍了属性注入和依赖注入两个概念,并说明了它们对代码可读性和维护性的影响。最后,针对新增功能的实现方法进行了详细讨论,并展示了Spring中的属性注入实现原理,以及对应的源码分析。通过对比和解释,帮助读者更好地理解Spring如何实现依赖对象的创建和属性注入过程。
2023-04-09
589
0
0
开发技巧
2023-04-09
spring如何实现控制反转?
摘要:控制反转(Inversion of Control)是一种编程思想,传统的对象创建流程中用户需要使用new关键字来创建对象,而控制反转则是将对象的创建和管理交由框架或容器来完成,实现了对象创建的反转。Spring框架是一个典型的控制反转的实现,通过配置xml文件来定义对象的创建方式,从而提高代码的灵活性和可维护性。为了实现控制反转,需要对配置文件进行解析和对象创建过程进行管理,包括文档加载器、对象定义文档阅读器、对象定义解析器、对象工厂等组件。通过对spring源码的分析,可以了解控制反转的具体实现过程,从而提高代码的可复用性和可测试性。
2023-04-09
804
0
0
开发技巧
2023-04-02
Mybatis如何简化CRUD过程?
本文介绍了Java如何连接数据库的过程,包括加载驱动、创建连接和执行SQL等步骤。对于CRUD操作中的重复操作,需要针对每张表进行处理,将查询结果封装到实体类中,实现数据的持久化。文章还提到了如何避免重复代码和硬编码,面对多样的查询和更新需求应该做到结果集解析一次、多处可用。针对数据库操作的需求实现,提出了解决表对象关系映射、类的持久化、保存结果集和转义数据库信息配置等4个大问题,并给出了实现步骤和对象职责的详细分析。总体而言,本文通过具体案例和步骤展示了如何用最小改动或不改动应对多样需求,提高代码复用性和安全性。
2023-04-02
1047
2
1
开发技巧
2023-03-26
记一次logback引发线上的内存报警
最近接手的服务经常出现线上内存溢出问题,导致服务需要频繁重启。经过查看内存使用记录,发现内存占用在上线后1天就达到4G以上,其中大部分内存被char数组占用了61%。这些char数组中存储了大量的日志记录,而由于老服务的日志打印过于频繁,每条日志的大小在6、7K之间。此外,阻塞队列设置得过小,并且没有设置neverBlock导致业务线程阻塞,导致堆文件里充斥着大量日志。通过查看logback的源码可以发现,当存储日志时,logback会先将日志放入阻塞队列中,根据neverBlock的值决定是采用阻塞方式还是非阻塞方式存储。neverBlock为false时,采用非阻塞方式存储,否则采用阻塞方式存储。
2023-03-26
1964
0
0
开发技巧
2023-03-26
java如何连接数据库?
本文主要介绍了如何使用Java连接数据库以及JDK如何规范不同数据库驱动的实现。对于执行SQL操作,需要包括连接数据库、执行SQL、解析结果集等步骤。文章还提到了在java.sql.*中关于SQL相关的接口和工具类的作用。针对查询MySQL数据库的技术方案,包括连接MySQL服务端、执行命令、创建数据库连接、执行SQL及解析返回结果等步骤。文章还介绍了面向对象的实现方式以及数据库驱动、数据库连接、SQL执行器和结果集对象的职责。最后,文章探讨了JDK如何封装数据库驱动、数据库连接、SQL执行器和结果集,以及其他框架如何进一步封装这些对象。文章总结了类加载阶段注册驱动和基于Java socket编程连接数据库的方法。整体来看,本文详细介绍了Java连接数据库的相关知识。
2023-03-26
824
0
0
开发技巧
2023-03-03
chatGPT来面试-数据库篇
数据库的三级缓存指的是Hibernate框架中的缓存机制,包括Session缓存、SessionFactory缓存和Query缓存。Hibernate通过这三个层级的缓存提高了应用程序的性能和响应速度。相比之下,MyBatis也提供了缓存机制,包括一级缓存和二级缓存,通过本地缓存和应用程序内存缓存来提高查询性能。缓存机制是基于Java的HashMap实现的,能够有效提高查询性能和应用程序的响应速度。此外,数据库使用MVCC保证事务的一致性,通过给数据行分配版本号,实现多个事务同时对数据库进行读写操作,保证事务之间的隔离性和一致性。MVCC的实现方法包括生成新版本号、读取相应版本的数据行和标记已提交/已删除的数据行,确保事务提交后其他事务只能读取已提交的数据版本。
2023-03-03
637
0
0
开发技巧
2022-11-26
DBCP连接池原理与配置分析【三】
本文介绍了数据库连接池的创建过程和配置属性讲解。文章主要以GenericObjectPool.create()方法为切入点,详细讲解了数据库连接池的初始化过程。在连接池的创建过程中,使用了PoolableConnectionFactory.makeObject方法来创建具体的数据库连接。这里提到了池化连接PoolableConnection继承了DelegatingConnection,实现了Connection接口,Connection接口可以执行SQL语句并返回结果。文章还介绍了Connection接口的一些主要方法,包括createStatement方法用于创建Statement对象发送SQL语句到数据库。总体来说,本文详细介绍了数据库连接池的创建和配置过程。
2022-11-26
908
0
0
开发技巧
2022-11-20
DBCP连接池原理与配置分析【二】
对象连接池属性主要封装在BaseGenericObjectPool中,包括最大连接数量、连接耗尽时是否等待、最大等待时间、连接获取顺序等属性。在连接池创建过程中,maxTotal用于初始化连接池数量,blockWhenExhausted用于指定连接耗尽时是否等待获取连接,maxWaitDuration表示最大等待时间。在连接使用过程中,testOnBorrow和testOnCreate属性用于检测连接可用性。管理空闲连接的定时任务通过durationBetweenEvictionRuns属性设置,使用ScheduledThreadPoolExecutor实现定时监控和回收空闲连接。通过设置durationBetweenEvictionRuns来指定监控空闲连接的时间间隔。这些属性和方法的使用可以有效管理和优化对象连接池的性能。
2022-11-20
1036
0
0
开发技巧
2022-11-13
DBCP连接池原理与配置分析【一】
该文章介绍了在日常工作中使用spring或手动创建连接时,dbcp的操作流程。通过手动创建数据连接并进行查询的示例,展示了如何设置数据源、创建连接、创建语句、执行语句等操作。通过代码走读,详细介绍了dbcp是如何创建数据库连接池并帮助在查询时获取可用的数据库连接。在这个过程中,首先需要创建一个驱动连接工厂,然后调用DriverManagerConnectionFactory创建数据库连接实例。最终通过DriverManager完成数据库连接的创建。文章通过代码实例和时序图的方式,介绍了dbcp在数据源创建和数据库连接管理中的作用。
2022-11-13
838
0
0
开发技巧
2022-11-05
REDIS面试问题
总结:本文分析了Redis的阻塞队列、常用数据结构以及守护线程实现方式。在阻塞队列中,Redis通过ready_keys和blocking_keys两个链表和事件循环来处理阻塞事件;常用数据结构有string、hash、list和set,分别用于缓存、存储对象、分布式栈和分布式集合;守护线程通过redission实现了分布式锁的自动续约。此外,文章还探讨了Redis的连锁设置、存储大量数据和持久化方式,以及与Elasticsearch的对比。Redis适用于简单高性能的key-value存储,而Elasticsearch适用于全文检索场景。需要根据实际需求选择合适的存储方案。
2022-11-05
717
0
0
开发技巧
2022-10-30
小站点如何做到服务冷备?
本文介绍了如何通过宝塔面板和rclone工具实现网站冷备。首先通过宝塔将整站备份,并通过FTP将备份文件同步到异地机器。具体设置包括修改FTP配置文件、配置PassivePortRange和ForcePassiveIP,并添加shell指令将备份文件拷贝到FTP目录。接着介绍了使用rclone工具同步已备份的FTP文件到本地,rclone可以实现从远程服务端复制、同步、剪切到本地客户端。最后给出了在Windows系统上编写本地同步脚本的示例。整个过程实现了0成本或者低成本网站冷备的操作,对于想要实现网站备份的用户提供了一种简便有效的方法。
2022-10-30
744
0
0
开发技巧
2022-10-27
同一机器,不同端口的泛域名解析如何做到?
nginx反向代理是机器间通信的一种方式,通过代理服务进行间接通信。代理分为正向代理和反向代理,前者常用于个人电脑上,后者常用于服务器端进行负载均衡。NGINX作为常见的反向代理工具,通过修改nginx.conf配置文件来实现对服务端的代理。配置文件结构包括全局块、events块、http块、server块和location块,其中设置了监听的主机端口、服务名称、反向代理逻辑等。实现对泛域名的反向代理可以通过前缀解析方式,将不同前缀对应的请求反向代理到同一机器的不同端口上。如果涉及不同主机的反向代理,需要在不同server块中写入相应的反向代理逻辑。要实现这些功能,需要了解nginx的配置文件结构和块指令作用域。
2022-10-27
944
0
0
开发技巧
2022-10-22
大话DDD-领域实体与实现
这段内容主要介绍了在日常开发过程中,如何利用领域驱动设计(DDD)的思想,将业务逻辑聚合并与外部服务隔离的方法。通过引入实体、Repository和Domain Service等概念,将编程转变为面向抽象接口的编程,避免了面向具体实现的编程。在实现业务逻辑时,应该将用户抽象为领域实体,并在service层对用户的状态进行改变。此外,还介绍了DTO、VO和DO的概念及应用场景,以及Repository和Domain Service的作用。最后指出,在处理需求时,应该先总览业务问题,划分领域对象并明确信息和职责边界,然后在应用层根据业务描述编排实体和domain service,最后实现与下层数据访问、RPC调用等的交互。通过这样的设计思路,可以有效降低代码之间的耦合度,提高代码的可维护性和扩展性。
2022-10-22
815
0
3
开发技巧
2022-10-16
大话DDD:从POJO到DP的转变
该内容总结了在业务场景中用户登录注册功能的实现方法以及问题的解决方案。在传统POJO和领域对象之间的区别和优缺点进行了对比,并介绍了领域原型的实现原则。针对实现领域原型的三个主要原则,包括让隐性的概念显像化、让隐性的上下文显像化、封装多对象行为。最后讨论了Entity和Value Object的区别,以及Domain Primitive和Entity之间的区别,主要在于对象的逻辑是否有状态。整体内容重点强调了面向对象设计方法对系统建模的重要性,以及从业务需求中找到关键的业务对象(Entity和Value Object)的重要性。
2022-10-16
814
0
0
开发技巧
2022-10-09
MVCC相关问答
该文总结了关于间隙锁和readView的问题。首先介绍了间隙锁中索引为string时如何确定范围,字符串排序规则等。其次讨论了readView的开启时间和创建时机,解释了不同事务中readView的生成方式。最后通过一个示例说明了在事务中对teacherId进行更新时,事务A会读取到的值。通过MVCC的版本特性,解释了事务A对自身的readView不可见,因此在无锁select查询时仍会读取到更新前的数值。
2022-10-09
705
0
0
开发技巧
2022-09-21
SQL索引的优先级
MySQL在索引使用时,通常会将数据最小的字段放在前面,以最能确定结果的字段为主,以减小检索范围。在查询过程中,MySQL会自动调整字段顺序以优化索引顺序。举例说明了在查询指令表中某一指令在最近3个月未完成结果时,如何通过优化索引和缩小查询范围来提高查询效率。在多条件查询中,MySQL会选择扫描行数最少的索引,以减少查询时间。通过调整索引顺序、添加联合索引或缩小查询范围等方式,可以有效提高查询效率。
2022-09-21
1195
0
0
开发技巧
2022-09-18
【leetcode】刷题笔记-回溯法与贪心算法
总结:回溯法是一种搜索尝试过程,主要用于在搜索过程中寻找问题的解,当条件不满足时会返回尝试别的路径,常用于解决复杂问题。回溯法的基本步骤包括确定问题的解空间、确定扩展搜索规则以及深度优先搜索解空间等。递归和非递归是两种实现回溯法的方法,通过探索每一步可选择使用左括号或右括号的方式,及时过滤无效解并确保生成一组有效结果。通过分析回溯法的框架和实现,可以更好地理解其工作原理和应用场景。回溯法可以灵活地解决括号生成等问题,为解决其他问题提供了一种通用解题方法。
2022-09-18
823
0
0
开发技巧
2022-09-18
【leetcode】刷题笔记-分治法与动态规划
分治法是一种算法设计策略,将一个大问题分解为多个相同的子问题,递归地解决这些子问题,然后将结果合并得到原问题的解。分治法适用于问题具有规模缩小容易解决、可以分解为小问题且具有最优子结构性质、子问题解可合并为原问题解、子问题相互独立的情况。算法步骤包括分解、解决和合并。常见应用有二分搜索、归并排序、快速排序、大整数乘法等。以二分搜索为例,通过每次取中点比较大小,逐渐缩小查找范围,时间复杂度为O(logn)。另外,以寻找两个正序数组中的中位数为例,通过比较两个数组中的中位数来确定中位数所在位置,时间复杂度要求为O(log(m+n))。
2022-09-18
682
0
1
开发技巧
2022-09-18
【leetcode】刷题笔记-双指针法
本文主要介绍了三个算法问题的解决方法。首先是针对给定 n 个非负整数,找出可以容纳最多水的容器的问题,采用双指针法进行解决。其次是针对一个包含 n 个整数的数组,判断是否存在三个元素使得它们的和为0的问题,同样采用双指针法解决。最后是合并两个有序数组的问题,将一个排列好的数组合并到另一个排列好的数组中并保持顺序有序,也是采用双指针法进行解决。在解决过程中,采用了双指针移动、排序、判断和去重等操作,较为高效地解决了这三个问题。
2022-09-18
714
0
0
开发技巧
2022-09-09
kafka分区策略
Kafka在消息发送和消费过程中通过实现不同的分区策略来确保消息均匀地分发到不同的topic和partition上,以及消费者均匀地消费不同的partition。生产者的分区策略包括默认分区策略、轮询式分区策略和粘性分区策略,消费者的分区策略包括范围分配策略、轮询分配策略和粘性分配策略。当topic/partition数量或消费者数量变化时,会触发重平衡(rebalance)操作,通过加入组和组信息同步来重新分配消费者要消费的分区,确保各分区能够重新分配到消费者进行消费。整体而言,Kafka通过不同的分区策略和重平衡操作来保证消息生产和消费的高并发性和均衡性。
2022-09-09
777
0
0
开发技巧
2022-09-04
行为型设计模式实战【四】-模板、访问者
模板方法模式是一种定义一个算法的骨架,让子类可以重新定义算法的某些步骤的设计模式。优点包括封装不变部分、扩展可变部分、提取公共代码、行为由父类控制等,适用于多个子类有公共方法且逻辑相近、重要复杂的算法等场景。但是模板方法模式也存在缺点,如子类影响父类结果、代码阅读难度等。角色包括抽象类和具体类,父类调用子类方法的方法有限制,推荐曲线救国的方式实现父类依赖于子类的场景。以一个简单的展示程序为例,展示了模板方法模式的实现过程。
2022-09-04
692
0
0
开发技巧
2022-09-03
行为型设计模式实战【三】-观察者、策略、状态
观察者模式是定义对象间一种一对多的依赖关系,当一个对象状态改变时,所有依赖它的对象都得到通知并更新。优点是抽象耦合易于扩展,缺点是开发效率、运行效率可能受影响。常见场景包括文件系统、猫鼠游戏、ATM取钱、广播收音机等。角色包括观察对象、具体观察对象、观察者、具体观察者。Spring实现中可以通过抽象类和接口实现观察者模式,示例程序展示了观察者会生成数值对象,并以不同方式显示数值。如DigitObserver以数字形式显示,GraphObserver以图示形式显示。观察者模式在实际项目中应用广泛。
2022-09-03
741
0
0
开发技巧
2022-08-28
行为型设计模式实战【二】-迭代器、中介者、备忘录
迭代器模式是一种可以顺序访问集合元素的设计模式,在该模式中包含了迭代器、具体迭代器、集合和具体集合等角色。迭代器模式已经融入到Java的基本API中,使得程序设计更加轻松便捷。使用迭代器模式可以避免自己编写迭代器,而直接使用Java提供的Iterator接口来满足需求。在一个示例程序中,通过实现迭代器模式,将书放入书架并按顺序显示书的名字。通过Iterator接口、BookShelf、BookShelfIterator、Book等组件的实现,实现了迭代器模式的具体功能。迭代器模式在各个聚集类中得到了广泛的应用,包括List、Queue、Set等。通过迭代器模式的应用,实现了集合元素的顺序访问和展示。
2022-08-28
708
0
0
开发技巧
2022-08-27
行为型设计模式实战【一】-责任链、命令、解释器
本文介绍了行为型设计模式中的责任链模式,该模式定义了多个对象有机会处理请求,从而避免了请求发送者和接收者之间的耦合关系。文章详细介绍了责任链模式的优缺点和注意事项,并给出了在Spring框架中的实现示例。通过具体的代码示例,展示了如何使用责任链模式来处理不同类型的问题,通过规定不同的处理者针对不同类型的问题进行处理。在实现过程中,定义了处理者、具体处理者和请求者三种角色,并给出了相应的代码实现。通过责任链模式,实现了对问题的解决过程进行屏蔽,请求者只需要将请求发送给责任链的第一个处理者,最终会得到处理结果。责任链模式的核心是解耦请求发送者和接收者,同时也可以作为一种补救模式来使用。
2022-08-27
657
0
0
开发技巧
2022-08-21
结构型设计模式实战【二】-外观、享元、代理、装饰器
外观/门面模式提供了一个统一的高层次接口,使得子系统更易于使用,减少了系统的相互依赖,提高了灵活性和安全性。然而,其缺点是不符合开闭原则,对系统修改比较困难。使用场景包括复杂模块或子系统的外界访问、预防低水平人员带来的风险等。最佳实践是将复杂系统封装为一个门面,提高项目结构简单性和扩展性。在示例中,通过多个角色完成从邮件中获取用户名字的数据库类、编写html文件的类以及提供高层接口的窗口类,展示了门面模式在实际应用中的作用。通过门面模式的使用,可以约束项目成员的代码质量,提升整体项目质量。
2022-08-21
690
0
0
开发技巧
1
2
3
4
5