- 博客(69)
- 收藏
- 关注
原创 Mr. Cappuccino的第69杯咖啡——Oracle之存储过程
使用普通变量定义方式,需要知道表中列的类型,而使用引用类型,不需要考虑列的类型,使用%TYPE是非常好的编程风格,因为它使得PL/SQL更加灵活,更加适应于对数据库定义的更新。PLSQL是Oracle对sql语言的过程化扩展,指在SQL命令语言中增加了过程处理语句(如分支、循环等),使SQL语言具有过程处理能力。用于临时存储一个查询返回的多行数据(结果集),通过遍历游标,可以逐行访问处理该结果集的数据。执行结束后并未显示输出的结果,默认情况下,输出选项是关闭状态的,我们需要开启一下。
2024-01-16 22:53:18
1348
1
原创 Mr. Cappuccino的第68杯咖啡——基于Docker安装Oracle11g
关于持久化,source=oracle_vol指的是容器中的数据卷路径,target指的是容器外需要被挂载的目录路径。使用I键进入编辑模式,添加以下配置信息,再使用Esc键退出编辑模式,输入:wq保存配置信息。查看volume的具体位置。检查配置信息是否保存成功。查看原镜像中设置的SID。
2024-01-16 22:21:46
613
原创 Mr. Cappuccino的第67杯咖啡——MacOS通过PD安装Win11
直接打开ParallelsDesktop会提示文件已损坏。使用鼠标右键打开ParallelsDesktop。按住【control】键打开文件。关闭上面的窗口,打开激活程序。关闭上面的窗口,继续操作。重启Windows后重试。
2023-12-16 15:48:50
593
原创 Mr. Cappuccino的第66杯咖啡——解决MacOS中终端下的中文乱码问题
我这里使用的是zsh,将配置添加到.zshrc配置文件中。查看Mac使用的是哪个shell。测试效果,问题已经解决啦。
2023-12-16 15:20:48
405
原创 Mr. Cappuccino的第65杯咖啡——MacOS安装Docker
【代码】Mr. Cappuccino的第65杯咖啡——MacOS安装Docker。
2023-12-16 15:04:05
432
原创 Mr. Cappuccino的第64杯咖啡——Spring循环依赖问题
多个bean之间相互依赖,形成了一个闭环。比如:A依赖于B、B依赖于C、C依赖于A通常来说,如果问Spring容器内部如何解决循环依赖问题,一定是指默认的单例Bean中,属性相互引用的场景。也就是说,Spring的循环依赖,是Spring容器注入时出现的问题。
2023-08-23 22:42:17
1055
原创 Mr. Cappuccino的第63杯咖啡——Spring之AnnotationConfigApplicationContext源码分析
执行BeanFactoryPostProcessor接口相关实现类的方法,通过ConfigurationClassPostProcessor处理配置类中需要注册的bean对象,并将bean对象注册到beanDefinitionMap集合中。registerBeanPostProcessors(beanFactory):注册BeanPostProcessor接口相关实现类,创建BeanPostProcessor接口相关实现类的实例对象并存入singletonObjects集合中。
2023-08-14 19:31:23
866
原创 Mr. Cappuccino的第62杯咖啡——Spring之Bean的生命周期
实现BeanFactoryPostProcessor接口,可以在Spring的bean创建之前,修改bean的定义属性。Aware自身是一个空的接口,Spring提供了很多它的实现接口,开发者实现这些已有的接口就能获取特定的一些信息。InitializingBean接口为bean对象提供了初始化方法,它只包括afterPropertiesSet方法,凡是继承该接口的类,在初始化bean的时候都会执行该方法。@Bean通过IOC工厂(BeanFactory)实现,底层使用反射技术。
2023-08-14 03:53:11
1323
原创 Mr. Cappuccino的第61杯咖啡——Spring之BeanPostProcessor
BeanPostProcessor:Bean对象的后置处理器,负责对已创建好的bean对象进行加工处理;BeanPostProcessor中的两个核心方法:postProcessBeforeInitialization:在每个bean对象的初始化方法执行之前执行该方法,如InitializingBean的afterPropertiesSet方法;
2023-08-12 20:24:56
884
原创 Mr. Cappuccino的第60杯咖啡——Spring之BeanFactory和ApplicationContext
BeanFactory,以Factory结尾,表示它是一个工厂类(接口), 它是负责生产和管理bean的一个工厂。在Spring中,BeanFactory是IOC容器的核心接口,它的职责包括:实例化、定位、配置应用程序中的对象及建立这些对象间的依赖;
2023-08-11 04:33:21
1187
原创 Mr. Cappuccino的第59杯咖啡——简单手写SpringIOC框架
底层使用map集合管理对象,key=beanId,value=实例对象。基于反射+工厂模式+DOM技术。基于反射+工厂模式实现。
2023-08-09 17:16:03
1055
1
原创 Mr. Cappuccino的第58杯咖啡——MacOS配置Maven和Java环境
安装过程省略(操作和普通软件安装一样),安装完成之后用以下命令查看已安装的JDK版本及其安装目录。把解压后的文件复制到maven文件夹下面,并创建repo文件夹用来存放拉取的maven依赖。我安装了两个不同的版本(JDK8和JDK11),中间的JDK是Mac自带的。使用command+shift+G进入/usr/local/目录。使用刚刚配置的别名(alias)切换JDK版本。因为我这里使用的是zsh,所以使用以下命令。如果使用的是bash,则使用以下命令。将下载好的Maven压缩包解压。
2023-08-03 03:27:29
1167
原创 Mr. Cappuccino的第56杯咖啡——Mybatis拦截器
Mybatis允许使用者在映射语句执行过程中的某一些指定的节点进行拦截调用,通过织入拦截器,在不同节点修改一些执行过程中的关键属性,从而影响SQL的生成、执行和返回结果。Executor:拦截执行器的方法;ParameterHandler:拦截参数的处理;ResultSetHandler:拦截结果集的处理;StatementHandler:拦截Sql语法构建的处理;
2023-08-02 20:28:08
1305
原创 Mr. Cappuccino的第55杯咖啡——Mybatis一级缓存&二级缓存
缓存越小,查询速度越快,缓存数据越少缓存越大,查询速度越慢,缓存数据越多在多级缓存中,一般常见的是先查询一级缓存,再查询二级缓存,但在Mybatis中是先查询二级缓存,再查询一级缓存。在Mybatis中,BaseExecutor属于一级缓存执行器,CachingExecutor属于二级缓存执行器,二者采用了装饰器设计模式。
2023-08-02 05:47:10
1150
原创 Mr. Cappuccino的第54杯咖啡——Mybatis运行原理
Mybatis运行原理Mybatis运行的三个阶段Mybatis运行原理图Mybatis运行的三个阶段初始化阶段:读取并解析XML配置文件和注解中的配置信息,创建配置对象,并完成各个模块的初始化工作,底层采用建造者模式;代理封装阶段:封装iBatis的编程模型,使用mapper接口开发的初始化工作,底层采用JDK动态代理模式;数据访问阶段:通过SqlSession完成SQL的解析、参数的映射、SQL的执行、结果的解析过程;Mybatis运行原理图
2023-08-01 01:48:53
478
原创 Mr. Cappuccino的第53杯咖啡——Mybatis源码分析
从入口一路点击进去可以发现底层是通过调用方法来读取resources目录下的mybatis-config.xml文件,并得到InputStream对象SqlSessionFactoryBuilder先是通过XMLConfigBuilder解析配置文件并将解析得到的配置装载到Configuration对象中,再将Configuration建造成DefaultSqlSessionFactory对象。这里采用了建造者设计模式。
2023-08-01 00:22:59
611
原创 Mr. Cappuccino的第52杯咖啡——Mybatis环境搭建与使用
Mybatis是一个用Java语言编写的持久层框架,它使用ORM实现了对结果集的封装。ORM(Object Relational Mapping):对象关系映射。简单来说,就是把数据库表和实体类及实体类的属性对应起来,让开发者操作实体类就能实现操作数据库表,它封装了JDBC操作的很多细节,使开发者只需要关注SQL语句本身,而无需关注注册驱动、创建连接等复杂过程。Mybatis中文网。
2023-07-26 23:03:58
721
原创 Mr. Cappuccino的第51杯咖啡——Maven多模块项目可插拔式打包部署方案(二)
随着【train-hubs】和【train-hubs-ztrip】这两个项目的合并,我们需要实现将这一个项目打包成不同的Jar包以致于能达到不同的运行效果,通俗来说就是将项目打包成两个不同的Jar包,其中一个Jar包的业务功能是完整的,而另一个Jar包的业务功能是残缺的。使用maven-jar-plugin和maven-assembly-plugin定制化打包成两个不同的tar包,tar包里面包含一个不含依赖Jar包的标准可执行Jar文件和一个包含依赖Jar包的lib目录。
2023-04-14 18:08:00
395
原创 Mr. Cappuccino的第50杯咖啡——冒泡APP(升级版)之Jenkins自动化部署
不过在访问时发现项目启动异常了,根据错误日志,可以定位到是由于数据库连接等配置统一放置在bubble-common,而bubble-common和bubble-auth是一起构建的,导致bubble-auth读取的公共依赖依然是bubble-common构建前的代码。到这里说明自动化部署已经成功了,接下来我们还需要优化一下Jenkins构建的触发方式,期望能够在往Gitlab上的指定分支(如master分支)push或者merge代码时触发构建,该功能我们可以通过webhook进行实现。
2023-03-11 23:23:58
622
原创 Mr. Cappuccino的第49杯咖啡——冒泡APP(升级版)之基于Docker部署Gitlab
注意:如果不配置上述信息且docker运行时端口映射为-p 8851:80,此时的Gitlab虽然能够正常访问,但是HTTP地址的host为容器ID(如下图所示)测试Gitlab是否已经启动完成,启动过程大概需要几分钟的时间,可以耐心等待一下。访问首页(访问地址为服务器IP+映射的端口号,如http://192.168.102.129:8851/)由于代码之前使用的是Gitee仓库,所以需要把Git地址切换成现在的Gitlab地址。登录账号(默认用户名为root,密码为上一步修改的密码)
2023-03-11 17:37:39
405
原创 Mr. Cappuccino的第48杯咖啡——冒泡APP(升级版)之基于Docker部署企业级Maven私服
group:这是一个仓库聚合的概念,用户仓库地址选择Group的地址,即可访问Group中配置的,用于方便开发人员自己设定的仓库。proxy:代理类型,从远程中央仓库中寻找数据的仓库(可以点击对应仓库的Configuration页签下Remote Storage属性的值即被代理的远程仓库的路径),如可配置阿里云maven仓库;maven-public:仓库分组,把上面三个仓库组合在一起对外提供服务,在本地Maven基础配置settings.xml或项目pom.xml中使用;
2023-03-11 16:56:01
374
原创 Mr. Cappuccino的第47杯咖啡——使用Typora将Markdown转换成Word文档
使用Typora打开Markdown文件,并通过Typora的导出功能实现转换。Typora配置Pandoc有两种方式:配置系统环境变量和配置Pandoc路径。使用Typora导出Word文档,需要先安装好Pandoc。如何将Markdown文件转换成Word文档?验证Pandoc是否配置成功。下载Pandoc压缩包。解压Pandoc压缩包。
2023-03-08 19:52:07
349
原创 Mr. Cappuccino的第46杯咖啡——Maven多模块项目可插拔式打包部署方案
下面我们假设【maven-inside】为前期的【train-hubs-ztrip】,【maven-outside】为前期的【train-hubs】,【maven-common】为【maven-inside】和【maven-outside】共同依赖的模块(抽象层),【maven-jar】依赖于【maven-inside】和【maven-outside】用于可插拔的功能效果实现。完整打包:既能部署出同时拥有【maven-inside】和【maven-outside】两个模块功能的服务;项目启动后的测试效果。
2023-03-07 20:31:03
1000
原创 Mr. Cappuccino的第45杯咖啡——Kubernetes之部署SpringBoot项目
使用NodeIP:NodePort从外部访问 http://192.168.102.160:30008/ 或者 http://192.168.102.161:30008/操作两台工作节点,将Dockerfile文件和Jar包上传至服务器。Dockerfile文件。操作Master节点。
2023-02-25 21:03:13
366
原创 Mr. Cappuccino的第44杯咖啡——Kubernetes之Service
Kubernetes Pod是有生命周期的,它们可以被创建,也可以被销毁,然而一旦被销毁生命就永远结束,每个Pod都会获取它自己的IP地址,可Pod一旦销毁并重新创建后,IP地址就会发生改变。Endpoint是Kubernetes中的一个资源对象,存储在etcd中,用于记录一个Service对应的所有Pod的访问地址,一个Service由一组Pod组成,这些Pod通过Endpoints暴露出来,Endpoints是实现实际服务的端点集合。IPVS模式的Service,可以使K8S集群支持更多量级的Pod。
2023-02-25 19:26:14
993
原创 Mr. Cappuccino的第43杯咖啡——Kubernetes之Pod控制器(二)
HPA可以获取每个Pod的利用率,然后和HPA中定义的指标进行对比,同时计算出需要伸缩的具体值,最后实现Pod数量的调整。其实HPA和之前的Deployment一样,也属于一种kubernetes资源对象,它通过追踪分析目标Pod的负载变化情况,来确定是否需要针对性的调整目标Pod的副本数。从监听Job的窗口上可以看到2个Pod并发执行,总共执行了27s,执行完成后又并发执行了2个Pod,直至成功运行完4个Pod。当Job创建的Pod执行成功结束时,Job将记录成功结束的Pod数量;
2023-02-19 04:21:42
416
原创 Mr. Cappuccino的第42杯咖啡——Kubernetes之Pod控制器(一)
Pod是Kubernetes集群中能够被创建和管理的最小部署单元。所以需要有工具去操作和管理它们的生命周期,这里就需要用到控制器了。Pod 控制器由Master的kube-controller-manager组件提供,常见的控制器有 Replication Controller、ReplicaSet、Deployment、DaemonSet、StatefulSet、Job 和 CronJob 等,它们分别以不同的方式管理 Pod 资源对象。
2023-02-18 23:49:55
589
原创 Mr. Cappuccino的第41杯咖啡——Kubernetes之Pod调度策略
nodeSelector用于将Pod调度到指定标签上的Node节点,它通过k8s的标签选择器实现,也就是说,Scheduler使用MathNodeSelector调度策略进行Label匹配,找出目标Node,然后将Pod调度到目标节点,该匹配规则也是强制约束,即如果没有匹配到满足条件的Node节点,也会继续往上调度,只不过Pod将会运行失败。污点的作用是拒绝Pod调度,而容忍定义于Pod上,表示Pod允许Node节点上有污点,并且还会往含有对应污点的节点上调度。
2023-02-18 02:19:09
498
原创 Mr. Cappuccino的第40杯咖啡——Kubernetes之Pod生命周期
我们可以分析出Pod中首先启动并运行的是mysql容器,mysql容器运行成功后,redis容器开始启动并运行,完成运行后主容器才开始启动。判断我们的应用实例是否存活,如果为宕机状态,则自动重启,同时如果发现该pod无法接受请求,则service不会转发到该pod上执行。启动主容器(main-container)必须等待初始化容器(mysql和redis)启动并运行成功之后,才可以启动;我们可以看到,由于没有/tmp/honey.txt这个文件,执行的查看命令是失败的,所以容器一直在进行重新启动操作。
2023-02-15 19:06:46
569
原创 Mr. Cappuccino的第39杯咖啡——Kubernetes之深入理解Pod
:一直死循环,为了避免cpu飙高的问题 休眠3s时间。这是因为busybox容器启动后,它会自动关闭,我们可以通过启动命令写脚本,让busybox一直在运行。其中nginx2由于端口号被占用无法启动,一直在重试启动。可以通过资源配置Pod对应的cpu核数、内存配置等。“/bin/sh”,“-c”:使用sh执行命令。查看pod信息,busybox停止了。容器启动成功之后 可以执行一些脚本。可以发现,busybox仍在运行。文件名称:pod.yaml。
2023-02-15 19:05:04
422
原创 Mr. Cappuccino的第38杯咖啡——Kubernetes中Pod、Namespace、Label、Deployment、Service之间的关系
你只需要在Deployment中描述您想要的目标状态是什么,Deployment Controller就会帮您将Pod和ReplicaSet的实际状态改变到您的目标状态。Pod是k8s中的最小单元,k8s不会直接控制Pod,而是通过Pod控制器来进行控制。Pod控制器用于对Pod的管理,确保Pod资源符合预期的状态,当Pod的资源出现故障时,会尝试进行重启或重建Pod。Pod IP会随着Pod的重建产生变化,可以使用Service提供的IP对Pod进行访问。查看指定namespace下的pod的额外信息。
2023-02-15 18:55:41
775
原创 Mr. Cappuccino的第37杯咖啡——Kubernetes资源管理
查看Pod的yaml文件(-o yaml:以yaml的格式显示出来)查看yaml配置清单相关属性信息。
2023-01-12 00:25:56
678
原创 Mr. Cappuccino的第35杯咖啡——基于CentOS安装Kubernetes
Kubernetes是Google在2014年开源的一款容器集群系统,简称k8s。Kubernetes用于容器化应用程序部署、扩展和管理,目标是让容器化应用简单高效。K8S是一组服务器的集群,对节点(node)上的容器进行管理。官方网站:https://kubernetes.io/官方文档:https://kubernetes.io/zh/docs/home/自我修复:一旦某-个容器崩溃,能够在1秒中左右迅速启动新的容器弹性伸缩:可以根据需要,自动对集群中正在运行的容器数量进行调整。
2022-12-18 04:08:37
135
原创 Mr. Cappuccino的第34杯咖啡——解决虚拟机IP地址自动变化的问题
变化的原因:在配置文件/etc/sysconfig/network-scripts/ifcfg-ens33中,虚拟机设置的IP地址是dhcp(动态地址),所以才会一直变化,现在只要把dhcp改成static再重新设置一个固定的ip地址就可以了。注意:DNS1和GATEWAY是根据你自己配置的IP地址决定的,我设置的IP地址是192.168.102.159,所以DNS1和GATEWAY就是192.168.102.2。虽然IP地址已经改回来了,但是到这里你会发现,你的虚拟机ping不通外网了。
2022-12-18 00:12:12
2326
5
原创 Mr. Cappuccino的第31杯咖啡——基于Docker部署MySQL8.0.18和Redis5.0.7
基于Docker部署MySQL8.0.18和Redis5.0.71. 部署MySQL8.0.181. 创建挂载文件目录2. 将my.cnf文件上传至/home/data/mysql/config目录3. 下载并运行mysql4. 连接mysql(账号:root,密码:honey@163)2. 部署Redis5.0.71. 创建挂载文件目录2. 将redis.conf文件上传至/home/data/redis/config目录3. 下载并运行redis4. 连接redis(密码:honey@163)1. 部
2022-12-08 16:58:53
252
原创 Mr. Cappuccino的第30杯咖啡——金三银四面试题之面试实战篇
金三银四面试题之面试实战篇1. Object类中有哪些方法?2. 为什么要把wait()放在Object类中,而不像sleep()方法一样放在Thread类中?3. notify()和notifyAll()的区别?4. 单向链表、双向链表、环形链表有什么区别?分别用在哪些场景中比较合适?5. 如何避免死锁?6. 谈谈线程的生命周期?7. 线程池有哪些核心的参数?谈谈线程池的工作原理?拒绝策略有哪些?默认是哪一种拒绝策略?8. 谈谈Spring的生命周期?9. 什么是Spring循环依赖问题?10. 如何解决
2022-03-08 15:25:48
709
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人