eShopOnContainers
eShopOnContainers是微软官方的微服务架构示例, GitHub地址 https://github.com/dotnet-architecture/eShopOnContainers
在 eShopOnContainers架构中有一个使用 RabbitMQ实现的 EventBus(事件总线), EventBus使用的是发布订阅模式, 使用事件驱动,使得有了一个新需求后直接添加对应Handler并注册订阅即可,符合单一职责原则。下在就详细说说我是如果把 eShopOnContainers中的 EventBus用到自己的项目中的
项目结构图
持久连接类
面向接口是主流的开发方式,使用 rabbitmq我们需要有一个管理与 rabbtimq服务器连接的类,也就是
IRabbitMqPersistentConnection 接口与 DefaultRabbitMqPersistentConnection 类
1 ///
2 /// Rabbitmq持久连接
3 ///
4 public interface IRabbitMqPersistentConnection : IDisposable
5 {
6 ///
7 /// 是否连接
8 ///
9 bool IsConnected { get; }
10
11 ///
12 /// 尝试连接
13 ///
14 ///
15 bool TryConnect();
16
17 IModel CreateModel();
18 }
在接口里定义了三个方法(属性也是方法),第一个判断是否已经连接,第二个尝试连接,第二个方法创建一个 channel
在 DefaultRabbitMqPersistentConnection类里实现了接口,它需要一个类型为 IConnectionFactory的参数
首先来看看 TryConnect方法
在这里使用了传入的 _connectionFactory创建了连接,并且注册了连接成功、失败等事件进行了 log输出
1 public bool TryConnect()
2 {
3 Logger.Info("RabbitMQ客户端正在尝试连接 ");
4
5 lock (_syncRoot)
6 {
7 var policy = Policy.Handle().Or()
9 . WaitAndRetry(5 , retryAttempt => TimeSpan.FromSeconds(Math.Pow(2 , retryAttempt)), (ex, time) =>
10 {
11 Logger.Warn(ex.ToString());
12 }
13 );
14
15 policy.Execute(() =>
16 {
17 _connection = _connectionFactory.CreateConnection();
19 });
20
21 if (IsConnected)
22 {
23 _connection.ConnectionShutdown += OnConnectionShutdown;
24 _connection.CallbackException += OnCallbackException;
25 _connection.ConnectionBlocked += OnConnectionBlocked;
26
27 Logger.Info($"连接到 {_connection.Endpoint.HostName} 并注册了异常失败事件 ");
28
29 return true;
30 }
31 Logger.Fatal("致命错误 :无法创建和打开 RabbitMQ连接 ");
32
33 return false;
34 }
35 }
订阅管理器
连接类其它的已经没有什么值得一说的了,下面我们把眼光转到订阅管理器
这是管理器的接口,作用是来用维护 EventData与 EventHandler的关系,图中箭头指向的代码是我自己添加的,是为了定义一个命名约定把 EventData与 EventHandler的关系统一添加到管理器中
订阅管理器接口的默认实现是 InMemoryEventBusSubscriptionsManager类放到内存中,也可以轻松添加 redis、 sql server等实现, InMemoryEventBusSubscriptionsManager内部维护了一个字典,对应关系都放在这个字典中,可以进行添加订阅、取消订阅
在说 EventBus类之前先说说两种 Handler,一种是普通的事件处理,泛型接口接收 IntegrationEvent(EventData)的派生类做为参数并且定义了 Handler方法来进行处理
第二种是动态 EventData的 Handler,它并不会要求必须是 IntegrationEvent的派生类,可以灵活的处理其它的类型
事件总线
下面就到了 EventBus的接口 ,定义很简单,进行订阅事件,和dynamic的事件以及取消订阅和最重要的发布事件
1 public interface IEventBus
2 {
3 ///
4 /// 订阅事件
5 ///
6 ///
7 ///
8 void Subscribe()
9 where T : IntegrationEvent
10 where TH : IIntegrationEventHandler;
11
12 ///
13 /// 订阅动态事件
14 ///
15 ///
16 ///
17 void SubscribeDynamic
(string eventName)
18 where TH : IDynamicIntegrationEventHandler;
19
20 ///
21 /// 取消订阅动态事件
22 ///
23 ///
24 ///
25 void UnsubscribeDynamic
(string eventName)
26 where TH : IDynamicIntegrationEventHandler;
27
28 ///
29 /// 订阅事件
30 ///
31 ///
32 ///
33 void Subscribe( Type @event, Type handler);
34
35 ///
36 /// 取消订阅事件
37 ///
38 ///
39 ///
40 void Unsubscribe()
41 where TH : IIntegrationEventHandler
42 where T : IntegrationEvent;
43
44 ///
45 /// 发布事件
46 ///
47 ///
48 void Publish( IntegrationEvent @event);
49 }
我使用的是 RabbitMQ的 EventBus实现, RabbitMQ是 AMQP协议的企业级消息队列,可靠性与性能都非常高。具体大家可以去了解一下 RbbaitMQ,
EventBusRabbitMq类需要三个参数
RabbitMqPersistentConnection 持久连接类
IEventBusSubscriptionsManager 订阅管理器
ILifetimeScope 以及 autofac (依赖注入 )
实际上还需要一个 Logger参数,在我的项目中使用了全局的 Logger类,所以就不需要这个参数了,在构造函数中可以看到如果没有传入订阅管理器,那么将会使用默认的 InMemry,而且在构造函数中就创建了消费者(和 Queue), 在示例中是没有常量QueueName的,使用的是断开连接后自动删除的队列,但是这样会丢失消息,所以我改成了持久的队列
下面就是创建消费者的方法了,首先声明一个 direct类型的交换机,我对方法进行了修改,添加了对消费者的公平分发,以及手动交付和消息持久化来确保消息会被成功的消费 ,在 Received方法中调用了 ProcessEvent方法,在这个方法里就是对消息的消费了
1 private IModel CreateConsumerChannel()
2 {
3 if (!_persistentConnection.IsConnected)
4 {
5 _persistentConnection.TryConnect();
6 }
7
8 var channel = _persistentConnection.CreateModel();
9
10 channel.ExchangeDeclare(exchange: BrokerName,
11 type: "direct");
12 //均发 ,同一时间只处理一个消息
13 channel.BasicQos(0 , 1 , false);
14 _queueName = channel.QueueDeclare(QueueName, true, false, false);
15
16 var consumer = new EventingBasicConsumer( channel);
17 consumer.Received += async (model, ea) =>
18 {
19 var eventName = ea.RoutingKey;
20 var message = Encoding.UTF8.GetString(ea.Body);
21
22 await ProcessEvent( eventName, message);
23 //交付
24 channel.BasicAck(deliveryTag: ea.DeliveryTag, multiple: false);
25 };
26
27 channel.BasicConsume(queue: _queueName,
28 autoAck: false,
29 consumer: consumer);
30
31 channel.CallbackException += (sender, ea) =>
32 {
33 _consumerChannel.Dispose();
34 _consumerChannel = CreateConsumerChannel();
35 };
36
37 return channel;
38 }
方法很简单,首先判断事件名称在订阅管理器中是否存在,然后创建一个 autofac的生命周期
使用 EventData的名称拿到所有的 Hnalder
var subscriptions = _subsManager.GetHandlersForEvent(eventName);
然后进行判断是否是 Dynamic,后面代码基本一致就是从 autofac中拿到 EventHandler然后调用 Handler方法
下面就是依赖注入的部分了
首先是注册订阅管理器
在这里创建 ConnectionFactory类,并且读取 config中的配置项,拿到 host、 user以及 pwd,我又添加了断线重连和工作进程恢复
builder.RegisterInstance(new DefaultRabbitMqPersistentConnection(new ConnectionFactory()
{
HostName = ConfigurationManager.AppSettings["rabbitmqHost"],
UserName = ConfigurationManager.AppSettings["rabbitmqUser"],
Password = ConfigurationManager.AppSettings["rabbitmqPwd"],
//断线重连并恢复工作进程
AutomaticRecoveryEnabled = true,
TopologyRecoveryEnabled = true
})).As()
.SingleInstance();
然后就是注册事件总统与订阅管理器
builder.RegisterType().As().SingleInstance();
builder.RegisterType().As().SingleInstance();
最后我拿到了 EventData和 EventHandler所在程序中,扫描所有的 Type并为所有以 Handler结尾的类型添加到容器了,然后拿到了派生于 IntegrationEvent的所有子类然后与对应的 Handler进行订阅,这样基本上大多数的开发场景都不需要单独进行订阅了,只要符合命名约定就会自动订阅
//配置 EventBus
var ass = Assembly.GetAssembly(typeof(Response));
builder.RegisterAssemblyTypes(ass).Where(t => t.Name.EndsWith("Handler")).InstancePerDependency();
var build = builder.Build();
var bus = build.Resolve();
var allEvent = ass.GetTypes().Where(o => o.IsSubclassOf(typeof(IntegrationEvent)));
foreach (var t in allEvent)
{
var handler = ass.GetTypes().FirstOrDefault(o => o.Name.StartsWith(t.Name) && o.Name.EndsWith("Handler"));
if (handler != null)
bus.Subscribe(t, handler);
}
最后就是使用了,我定义了 TestEvent与 TestEventHandler类,在 Handler中输出 TestEvent的属性 Test
1 public class TestEvent : IntegrationEvent
2 {
3 public string Test { get; set; }
4 }
5
6 public class TestEventHandler : IIntegrationEventHandler
7 {
8 private readonly Repository _lawfirmRepository;
9
10 public TestEventHandler( Repository< Lawfirm> lawfirmRepository)
11 {
12 _lawfirmRepository = lawfirmRepository;
13 }
14
15 public Task Handle( TestEvent @event)
16 {
17 Console.WriteLine(@event. Test);
18 return Task.FromResult(0 );
19 }
20 }
使用非常简单,下面我使用事件总线发布了一个消息,然后把程序运行起来
1 _eventBus = container.Resolve();
2
3 _eventBus.Publish(new TestEvent
4 {
5 Test = "Hello World"
6 });
我们看到了刚才发布的消息 HelloWorld ,哈哈,输出是不是很奇怪,不家什么成功导入 x条,这是因为我的爬虫项目,在博文的同时正在采集着数据,消息被发到了这个消费者下并且被成功消费。安利一下我搭的爬虫框架,使用了 .net core 2.0+Ef core 2.0,集成了无头浏览器与 anglesharp还有 EventBus那就不用说了,相关技术栈有 依赖注入、仓储模式、AutoMapper、还有一个Web的管理界面以及下一步要集成的Hangfire任务调度。有感兴趣的可以留言,我会根据反馈信息决定是否开源分享给大家
转载于:https://www.cnblogs.com/LiangSW/p/7512342.html
你可能感兴趣的:(大数据,爬虫,数据库)
什么是缓存雪崩?缓存击穿?缓存穿透?分别如何解决?什么是缓存预热?
daixin8848
缓存 redis java 开发语言
缓存雪崩:在一个时间段内,有大量的key过期,或者Redis服务宕机,导致大量的请求到达数据库,带来巨大压力-给key设置不同的TTL、利用Redis集群提高服务的高可用性、添加多级缓存、添加降级流策略缓存击穿:给某一个key设置了过期时间,当key过期的时间,恰好这个时间点有大量的并发请求访问这个key,可能会瞬间把数据库压垮-互斥锁:缓存失败时,只允许一个请求去加载数据并更新缓存,其他请求阻塞
Aop +反射 实现方法版本动态切换
需求分析在做技术选型的时候一直存在着两个声音,mongo作为数据库比较mysql好,mysql做为该数据比mongo好。当然不同数据库都有有着自己的优势,我们在做技术选型的时候无非就是做到对数据库的扬长避短。mysql最大的优势就是支持事务,事务的五大特性保证的业务可靠性,随之而来的就是事务会产生的问题:脏读、幻读、不可重复度,当然我们也会使用不同的隔离级别来解决。(最典型的业务问题:银行存取钱)
Deepseek技术深化:驱动大数据时代颠覆性变革的未来引擎
荣华富贵8
spring boot 搜索引擎 后端 缓存 redis
在大数据时代,信息爆炸和数据驱动的决策逐渐重塑各行各业。作为一项前沿技术,Deepseek正在引领新一轮技术革新,颠覆传统数据处理与分析方式。本文将从理论原理、应用场景和前沿代码实践三个层面,深入剖析Deepseek技术如何为大数据时代提供颠覆性变革的解决方案。一、技术背景与核心思想1.1大数据挑战与机遇在数据量呈指数级增长的背景下,传统数据处理方法面临数据存储、计算效率和信息提取精度的诸多挑战。
MySQL复习题
一.填空题1.关系数据库的标准语言是SQL。2.数据库发展的3个阶段中,数据独立性最高的是阶段数据库系统。3.概念模型中的3种基本联系分别是一对一、一对多和多对多。4.MySQL配置文件的文件名是my.ini或my.cnf。5.在MySQL配置文件中,datadir用于指定数据库文件的保存目录。6.添加IFNOTEXISTS可在创建的数据库已存在时防止程序报错。7.MySQL提供的SHOWCREA
大数据之路:阿里巴巴大数据实践——大数据领域建模综述
为什么需要数据建模核心痛点数据冗余:不同业务重复存储相同数据(如用户基础信息),导致存储成本激增。计算资源浪费:未经聚合的明细数据直接参与计算(如全表扫描),消耗大量CPU/内存资源。数据一致性缺失:同一指标在不同业务线的口径差异(如“活跃用户”定义不同),引发决策冲突。开发效率低下:每次分析需重新编写复杂逻辑,无法复用已有模型。数据建模核心价值性能提升:分层设计(ODS→DWD→DWS→ADS)
Android GreenDao介绍和Generator生成表对象代码
目录(?)[-]介绍创建工程转载请注明:http://blog.csdn.net/sinat_30276961/article/details/50052109最近无意中发现了GreenDao,然后查看了一些资料后,发现这个数据库框架很适合用,于是乎,查看了官网的api,并自己写了一个小应用总结一下它的使用方法。介绍按照国际惯例,在开篇,总要先介绍一下什么是GreenDao吧。首先需要说明的是Gr
大数据技术笔记—spring入门
卿卿老祖
篇一spring介绍spring.io官网快速开始Aop面向切面编程,可以任何位置,并且可以细致到方法上连接框架与框架Spring就是IOCAOP思想有效的组织中间层对象一般都是切入service层spring组成前后端分离已学方式,前后台未分离:Spring的远程通信:明日更新创建第一个spring项目来源:科多大数据
Mac OSX 下的mysql数据库文件存放位置
Bruuuces
mysql mac osx 位置 存放
之前我的mysql的系统数据库里的表被我玩坏了,万般无奈之下只得删除所有mysql的东西重新构建数据库。按照网上搜到的内容删除后重装发现数据库没有什么变化。于是自己在每个可能存放数据库文件的目录查找,最终确认目录位置如下:使用HomeBrew安装为/usr/local/var/mysql使用官方下载的dmg镜像安装为/usr/local/mysql删除这个目录再重新安装mysql就会重新生成系统数
mac升级mysql_Mac OSX下的MySQL数据库升级
weixin_39801714
mac升级mysql
MacOSX下的数据库升级最麻烦的不过权限的问题.本文的MySQL的安装方式为OSX下DMG磁盘镜像的安装方式,MacPorts/Homebrew的方式大同小异.从5.6.17升级到5.7.18安装目录信息ls-al/usr/local|grepmysqllrwxr-xr-x1rootwheel30B52100:39mysql@->mysql-5.6.17-osx10.7-x86_64drwxr-
【MySQL】MySQL数据库如何改名
武昌库里写JAVA
面试题汇总与解析 spring boot vue.js sql java 学习
MySQL建库授权语句https://www.jianshu.com/p/2237a9649ceeMySQL数据库改名的三种方法https://www.cnblogs.com/gomysql/p/3584881.htmlMySQL安全修改数据库名几种方法https://blog.csdn.net/haiross/article/details/51282417MySQL重命名数据库https://
HikariCP调试日志深度解析:生产环境故障排查完全指南
HikariCP调试日志深度解析:生产环境故障排查完全指南更新时间:2025年7月4日|作者:资深架构师|适用版本:HikariCP5.x+|难度等级:中高级前言在生产环境中,数据库连接池往往是系统性能的关键瓶颈。HikariCP作为当前最流行的Java连接池,其调试日志包含了丰富的运行时信息,能够帮助我们快速定位和解决各种连接池相关问题。本文将深入解析HikariCP的日志体系,提供一套完整的故
大学社团管理系统(11831)
codercode2022
java spring boot spring echarts spring cloud sentinel java-rocketmq
有需要的同学,源代码和配套文档领取,加文章最下方的名片哦一、项目演示项目演示视频二、资料介绍完整源代码(前后端源代码+SQL脚本)配套文档(LW+PPT+开题报告)远程调试控屏包运行三、技术介绍Java语言SSM框架SpringBoot框架Vue框架JSP页面Mysql数据库IDEA/Eclipse开发四、项目截图有需要的同学,源代码和配套文档领取,加文章最下方的名片哦!
前端数据库:IndexedDB从基础到高级使用指南
文章目录前端数据库:IndexedDB从基础到高级使用指南引言一、IndexedDB概述1.1什么是IndexedDB1.2与其他存储方案的比较二、基础使用2.1打开/创建数据库2.2基本CRUD操作添加数据读取数据更新数据删除数据三、高级特性3.1复杂查询与游标3.2事务高级用法3.3性能优化技巧四、实战案例:构建离线优先的待办事项应用4.1数据库设计4.2同步策略实现五、常见问题与解决方案5.
Gerapy爬虫管理框架深度解析:企业级分布式爬虫管控平台
Python×CATIA工业智造
爬虫 分布式 python pycharm
引言:爬虫工程化的必然选择随着企业数据采集需求指数级增长,传统单点爬虫管理模式面临三重困境:管理效率瓶颈:手动部署耗时占开发总时长的40%以上系统可靠性低:研究显示超过65%的爬虫故障源于部署或调度错误资源利用率差:平均爬虫服务器CPU利用率不足30%爬虫管理方案对比:┌───────────────┬─────────────┬───────────┬───────────┬──────────
修改gitlab默认的语言
Victor刘
gitlab
文章目录网上的方法1.采用数据库触发器的方法2.登录pg库2.1查看表2.2创建function2.3创建触发器2.4修改历史数据网上的方法网上修改/opt/gitlab/embedded/service/gitlab-rails/config/application.rb的方法,我试了,没生效,没进一步研究1.采用数据库触发器的方法2.登录pg库su-gitlab-psqlpsql-h/var/
如何在 Ubuntu 24.04 或 22.04 Linux 上安装和运行 Redis 服务器
山岚的运维笔记
Linux 运维及使用 linux 服务器 ubuntu redis 数据库
Redis(RemoteDictionaryServer,远程字典服务器)是一种内存数据结构存储,通常用作NoSQL数据库、缓存和消息代理。它是开源的,因此用户可以免费安装,无需支付任何费用。Redis旨在为需要快速数据访问和低延迟的应用程序提供速度和效率。Redis支持多种数据类型,包括字符串(Strings)、列表(Lists)、集合(Sets)、哈希(Hashes)、有序集合(SortedS
数据库基础概念梳理
22:30Plane-Moon
数据库
1.数据存储类型表(Table):存储结构化数据的标准方式,数据以行和列的形式组织,具有固定的格式。非结构化数据(UnstructuredData):如音频、视频、图片、文本文档等,其格式不固定,不易直接用表存储。2.SQL的核心优势SQL尤其擅长处理和操作存储在表中的结构化数据。2.1数据类型约束(DataTypeConstraints):定义列可存储的数据种类。整数类型:TINYINT(1字节
SQL笔记纯干货
AI入门修炼
oracle 数据库 sql
软件:DataGrip2023.2.3,phpstudy_pro,MySQL8.0.12目录1.DDL语句(数据定义语句)1.1数据库操作语言1.2数据表操作语言2.DML语句(数据操作语言)2.1增删改2.2题2.3备份表3.DQL语句(数据查询语言)3.1查询操作3.2题一3.3题二4.多表详解4.1一对多4.2多对多5.多表查询6.窗口函数7.拓展:upsert8.sql注入攻击演示9.拆表
大数据精准获客并实现高转化的核心思路和实现方法
2401_88470328
大数据精准获客 数据分析 数据挖掘 大数据 需求分析 big data
大数据精准获客并实现高转化的核心思路和实现方法大数据精准获客并实现高转化的核心思路和实现方法在当今信息爆炸的时代,企业如何通过海量的数据精准获取潜在客户,并提高转化率,已经成为营销策略中的关键环节。大数据精准获客的核心思路在于数据驱动、多渠道触达以及优化转化路径,从而实现高效的市场推广和客户转化。数据驱动原理和机制数据驱动的核心在于通过分析用户行为数据,挖掘潜在客户的需求和喜好,从而制定更加精准的
一地鸡毛—一个中年男人的日常2021241
随止心语所自欲律
2021年8月31日,星期二,阴有小雨。早起5:30,跑步10公里。空气清新,烟雨朦胧,远山如黛,烟雾缭绕,宛若仙境。空气中湿气很大,朦胧细雨拍打在脸上,甚是舒服,跑步的人明显减少。早上开会,领导说起逐年大幅度下滑的工作业绩,越说越激动,说得脸红脖子粗。开完会又讨论了一下会议精神,心情也有波动,学习热情不高。心里还有一个大事,是今日大数据分析第1次考试,因自己前期没学,而且计算机编程方面没有任何基
分布式全局唯一ID生成:雪花算法 vs Redis Increment,怎么选?
雪花算法vsRedisIncrement:分布式全局唯一ID生成方案深度对比在分布式系统开发中,“全局唯一ID”是绕不开的核心问题。无论是分库分表的数据库设计、订单编号的唯一性保证,还是日志追踪的链路标识,都需要一套可靠的ID生成方案。今天我们就来聊聊两种主流方案——雪花算法(Snowflake)和RedisIncrement,并从原理、特性到适用场景,帮你理清如何选择。同时,我们还将对比其他常见
【Druid】学习笔记
fixAllenSun
学习 笔记 oracle
【Druid】学习笔记【一】简介【1】简介【2】数据库连接池(1)能解决的问题(2)使用数据库连接池的好处【3】监控(1)监控信息采集的StatFilter(2)监控不影响性能(3)SQL参数化合并监控(4)执行次数、返回行数、更新行数和并发监控(5)慢查监控(6)Exception监控(7)区间分布(8)内置监控DEMO【4】Druid基本配置参数介绍【5】Druid相比于其他数据库连接池的优点
构建高效的物流车辆定位管理系统
体制教科书
本文还有配套的精品资源,点击获取简介:物流车辆定位管理系统利用信息技术提高物流效率和安全性。通过集成GPS技术进行实时车辆追踪和监控,它提供及时的货物运送和异常处理。系统的关键技术包括GPS车辆定位、C#编程语言、数据库管理、车辆管理、在途情况监控、预警与通知、数据分析与报告、用户界面设计、安全性与隐私保护以及系统集成。这些要素共同保障物流流程的高效、安全和智能化。1.物流车辆定位管理系统的应用与
Spring AI Alibaba 快速入门指南(适合初学者)
会飞的架狗师
AI spring 人工智能 java
如果你是刚接触AI开发或Spring框架的初学者,不用担心,本指南会用简单易懂的语言带你一步步了解并使用SpringAIAlibaba。一、什么是SpringAIAlibaba(小白也能懂)简单来说,SpringAIAlibaba就是一个“工具包”,它把阿里巴巴的AI技术(比如通义千问大模型、向量数据库等)和大家常用的Spring框架“打包”到了一起。**打个比方:**就像你想做蛋糕(开发AI应用
Java朴实无华按天计划从入门到实战(强化速战版-66天)
岫珩
Java 后端 java 开发语言 学习 Java 时间安排 学习计划
致敬读者感谢阅读笑口常开生日快乐⬛早点睡觉博主相关博主信息博客首页专栏推荐活动信息文章目录Java朴实无华按天计划从入门到实战(强化速战版-66天)1.基础(18)1.1JavaSE核心(5天)1.2数据库与SQL(5天)1.3前端基础(8天)2.进阶(17天)2.1JavaWeb核心(5天)2.2Mybatis与Spring全家桶(6天)2.3中间件入门(4天)2.4实践项目(2天)3.高阶(1
企业级RAG的数据方案选择 - 向量数据库、图数据库和知识图谱
南七小僧
AI技术产品经理 网站开发 人工智能 数据库 知识图谱 人工智能
如何为企业RAG选择合适的数据存储方式摘要:本文讨论了矢量数据库、图数据库和知识图谱在解决信息检索挑战方面的重要性,特别是针对企业规模的检索增强生成(RAG)。看看海外人工智能企业Writer是如何利用知识图谱增强企业级RAG。要点概要:矢量数据库高效存储数据,但缺乏上下文和关联信息。图数据库优先考虑数据点之间的关系,受益于关系结构。知识图谱在语义存储方面表现出色,由于其能够编码丰富的上下文信息,
小白学习mysql
阿什么名字不会重复呢
mysql 数据库 大数据 人工智能
推荐自学网站不用下载本地环境带自测头歌https://www.educoder.net✅适合基础小白的MySQL简单实用学习计划总学习时间建议:10~14天,每天1小时左右即可最终目标:掌握基础SQL操作,能完成简单项目需求第1阶段:认识数据库与环境搭建(1~2天)你需要学会:•数据库是什么?SQL是什么?•安装MySQLServer+Navicat(推荐用Navicat可视化工具)✅推荐学习内容
Navicat 全面支持金仓数据库 KingbaseES,为金仓生态圈注入新动能
Navicat中国
Navicat 17 焕新上市 Navicat 免费版 数据库
近日,我们宣布Navicat系列产品全面支持中电科金仓(北京)科技股份有限公司旗下金仓数据库管理系统KingbaseES。KingbaseES是面向全行业、全客户关键应用的企业级大型通用融合数据库产品,适用于事务处理类应用、数据分析类应用、海量时序数据采集检索类应用、要求苛刻的互联网等应用场景。这次合作,不仅是Navicat在数据库管理领域的又一重要里程碑,更凭借卓越的技术为金仓数据库的生态注入新
MYSQL:MySQL 事务隔离级别详解
奋斗的狍子007
MySQL核心知识点 mysql 数据库 java spring 架构 spring boot ide
一、MySQL事务是什么? MySQL事务是一组在数据库中执行的操作,这些操作要么全部成功执行,要么全部不执行,以确保数据库的完整性和一致性。事务的ACID 事务具有四个特征:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持续性(Durability)。这四个特性简称为ACID特性。原子性:事务是数据库的逻辑工作单位,事务中包含的各操作要么都做,
免费版 Navicat Premium Lite 17 下载和使用
曼巴不黑
数据库 navicat navicat免费
>>>>>>下载地址以后不需要再为使用Navicat大费周章了,官网已经提供免费版供个人和初创企业使用,认准NavicatPremiumLite。NavicatPremiumLite是Navicat的精简版,它包含了用户执行主要的基本数据库操作所需的核心功能。它允许你同时连接到各种数据库平台,包括MySQL、PostgreSQL、SQLServer、Oracle、MariaDB、Snowflake
深入浅出Java Annotation(元注解和自定义注解)
Josh_Persistence
Java Annotation 元注解 自定义注解
一、基本概述
Annontation是Java5开始引入的新特征。中文名称一般叫注解。它提供了一种安全的类似注释的机制,用来将任何的信息或元数据(metadata)与程序元素(类、方法、成员变量等)进行关联。
更通俗的意思是为程序的元素(类、方法、成员变量)加上更直观更明了的说明,这些说明信息是与程序的业务逻辑无关,并且是供指定的工具或
mysql优化特定类型的查询
annan211
java 工作 mysql
本节所介绍的查询优化的技巧都是和特定版本相关的,所以对于未来mysql的版本未必适用。
1 优化count查询
对于count这个函数的网上的大部分资料都是错误的或者是理解的都是一知半解的。在做优化之前我们先来看看
真正的count()函数的作用到底是什么。
count()是一个特殊的函数,有两种非常不同的作用,他可以统计某个列值的数量,也可以统计行数。
在统
MAC下安装多版本JDK和切换几种方式
棋子chessman
jdk
环境:
MAC AIR,OS X 10.10,64位
历史:
过去 Mac 上的 Java 都是由 Apple 自己提供,只支持到 Java 6,并且OS X 10.7 开始系统并不自带(而是可选安装)(原自带的是1.6)。
后来 Apple 加入 OpenJDK 继续支持 Java 6,而 Java 7 将由 Oracle 负责提供。
在终端中输入jav
javaScript (1)
Array_06
JavaScript java 浏览器
JavaScript
1、运算符
运算符就是完成操作的一系列符号,它有七类: 赋值运算符(=,+=,-=,*=,/=,%=,<<=,>>=,|=,&=)、算术运算符(+,-,*,/,++,--,%)、比较运算符(>,<,<=,>=,==,===,!=,!==)、逻辑运算符(||,&&,!)、条件运算(?:)、位
国内顶级代码分享网站
袁潇含
java jdk oracle .net PHP
现在国内很多开源网站感觉都是为了利益而做的
当然利益是肯定的,否则谁也不会免费的去做网站
&
Elasticsearch、MongoDB和Hadoop比较
随意而生
mongodb hadoop 搜索引擎
IT界在过去几年中出现了一个有趣的现象。很多新的技术出现并立即拥抱了“大数据”。稍微老一点的技术也会将大数据添进自己的特性,避免落大部队太远,我们看到了不同技术之间的边际的模糊化。假如你有诸如Elasticsearch或者Solr这样的搜索引擎,它们存储着JSON文档,MongoDB存着JSON文档,或者一堆JSON文档存放在一个Hadoop集群的HDFS中。你可以使用这三种配
mac os 系统科研软件总结
张亚雄
mac os
1.1 Microsoft Office for Mac 2011
大客户版,自行搜索。
1.2 Latex (MacTex):
系统环境:https://tug.org/mactex/
&nb
Maven实战(四)生命周期
AdyZhang
maven
1. 三套生命周期 Maven拥有三套相互独立的生命周期,它们分别为clean,default和site。 每个生命周期包含一些阶段,这些阶段是有顺序的,并且后面的阶段依赖于前面的阶段,用户和Maven最直接的交互方式就是调用这些生命周期阶段。 以clean生命周期为例,它包含的阶段有pre-clean, clean 和 post
Linux下Jenkins迁移
aijuans
Jenkins
1. 将Jenkins程序目录copy过去 源程序在/export/data/tomcatRoot/ofctest-jenkins.jd.com下面 tar -cvzf jenkins.tar.gz ofctest-jenkins.jd.com &
request.getInputStream()只能获取一次的问题
ayaoxinchao
request Inputstream
问题:在使用HTTP协议实现应用间接口通信时,服务端读取客户端请求过来的数据,会用到request.getInputStream(),第一次读取的时候可以读取到数据,但是接下来的读取操作都读取不到数据
原因: 1. 一个InputStream对象在被读取完成后,将无法被再次读取,始终返回-1; 2. InputStream并没有实现reset方法(可以重
数据库SQL优化大总结之 百万级数据库优化方案
BigBird2012
SQL优化
网上关于SQL优化的教程很多,但是比较杂乱。近日有空整理了一下,写出来跟大家分享一下,其中有错误和不足的地方,还请大家纠正补充。
这篇文章我花费了大量的时间查找资料、修改、排版,希望大家阅读之后,感觉好的话推荐给更多的人,让更多的人看到、纠正以及补充。
1.对查询进行优化,要尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。
2.应尽量避免在 where
jsonObject的使用
bijian1013
java json
在项目中难免会用java处理json格式的数据,因此封装了一个JSONUtil工具类。
JSONUtil.java
package com.bijian.json.study;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
[Zookeeper学习笔记之六]Zookeeper源代码分析之Zookeeper.WatchRegistration
bit1129
zookeeper
Zookeeper类是Zookeeper提供给用户访问Zookeeper service的主要API,它包含了如下几个内部类
首先分析它的内部类,从WatchRegistration开始,为指定的znode path注册一个Watcher,
/**
* Register a watcher for a particular p
【Scala十三】Scala核心七:部分应用函数
bit1129
scala
何为部分应用函数?
Partially applied function: A function that’s used in an expression and that misses some of its arguments.For instance, if function f has type Int => Int => Int, then f and f(1) are p
Tomcat Error listenerStart 终极大法
ronin47
tomcat
Tomcat报的错太含糊了,什么错都没报出来,只提示了Error listenerStart。为了调试,我们要获得更详细的日志。可以在WEB-INF/classes目录下新建一个文件叫logging.properties,内容如下
Java代码
handlers = org.apache.juli.FileHandler, java.util.logging.ConsoleHa
不用加减符号实现加减法
BrokenDreams
实现
今天有群友发了一个问题,要求不用加减符号(包括负号)来实现加减法。
分析一下,先看最简单的情况,假设1+1,按二进制算的话结果是10,可以看到从右往左的第一位变为0,第二位由于进位变为1。
 
读《研磨设计模式》-代码笔记-状态模式-State
bylijinnan
java 设计模式
声明: 本文只为方便我个人查阅和理解,详细的分析以及源代码请移步 原作者的博客http://chjavach.iteye.com/
/*
当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类
状态模式主要解决的是当控制一个对象状态的条件表达式过于复杂时的情况
把状态的判断逻辑转移到表示不同状态的一系列类中,可以把复杂的判断逻辑简化
如果在
CUDA程序block和thread超出硬件允许值时的异常
cherishLC
CUDA
调用CUDA的核函数时指定block 和 thread大小,该大小可以是dim3类型的(三维数组),只用一维时可以是usigned int型的。
以下程序验证了当block或thread大小超出硬件允许值时会产生异常!!!GPU根本不会执行运算!!!
所以验证结果的正确性很重要!!!
在VS中创建CUDA项目会有一个模板,里面有更详细的状态验证。
以下程序在K5000GPU上跑的。
诡异的超长时间GC问题定位
chenchao051
jvm cms GC hbase swap
HBase的GC策略采用PawNew+CMS, 这是大众化的配置,ParNew经常会出现停顿时间特别长的情况,有时候甚至长到令人发指的地步,例如请看如下日志:
2012-10-17T05:54:54.293+0800: 739594.224: [GC 739606.508: [ParNew: 996800K->110720K(996800K), 178.8826900 secs] 3700
maven环境快速搭建
daizj
安装 mavne 环境配置
一 下载maven
安装maven之前,要先安装jdk及配置JAVA_HOME环境变量。这个安装和配置java环境不用多说。
maven下载地址:http://maven.apache.org/download.html,目前最新的是这个apache-maven-3.2.5-bin.zip,然后解压在任意位置,最好地址中不要带中文字符,这个做java 的都知道,地址中出现中文会出现很多
PHP网站安全,避免PHP网站受到攻击的方法
dcj3sjt126com
PHP
对于PHP网站安全主要存在这样几种攻击方式:1、命令注入(Command Injection)2、eval注入(Eval Injection)3、客户端脚本攻击(Script Insertion)4、跨网站脚本攻击(Cross Site Scripting, XSS)5、SQL注入攻击(SQL injection)6、跨网站请求伪造攻击(Cross Site Request Forgerie
yii中给CGridView设置默认的排序根据时间倒序的方法
dcj3sjt126com
GridView
public function searchWithRelated() {
$criteria = new CDbCriteria;
$criteria->together = true; //without th
Java集合对象和数组对象的转换
dyy_gusi
java集合
在开发中,我们经常需要将集合对象(List,Set)转换为数组对象,或者将数组对象转换为集合对象。Java提供了相互转换的工具,但是我们使用的时候需要注意,不能乱用滥用。
1、数组对象转换为集合对象
最暴力的方式是new一个集合对象,然后遍历数组,依次将数组中的元素放入到新的集合中,但是这样做显然过
nginx同一主机部署多个应用
geeksun
nginx
近日有一需求,需要在一台主机上用nginx部署2个php应用,分别是wordpress和wiki,探索了半天,终于部署好了,下面把过程记录下来。
1. 在nginx下创建vhosts目录,用以放置vhost文件。
mkdir vhosts
2. 修改nginx.conf的配置, 在http节点增加下面内容设置,用来包含vhosts里的配置文件
#
ubuntu添加admin权限的用户账号
hongtoushizi
ubuntu useradd
ubuntu创建账号的方式通常用到两种:useradd 和adduser . 本人尝试了useradd方法,步骤如下:
1:useradd
使用useradd时,如果后面不加任何参数的话,如:sudo useradd sysadm 创建出来的用户将是默认的三无用户:无home directory ,无密码,无系统shell。
顾应该如下操作:
第五章 常用Lua开发库2-JSON库、编码转换、字符串处理
jinnianshilongnian
nginx lua
JSON库
在进行数据传输时JSON格式目前应用广泛,因此从Lua对象与JSON字符串之间相互转换是一个非常常见的功能;目前Lua也有几个JSON库,本人用过cjson、dkjson。其中cjson的语法严格(比如unicode \u0020\u7eaf),要求符合规范否则会解析失败(如\u002),而dkjson相对宽松,当然也可以通过修改cjson的源码来完成
Spring定时器配置的两种实现方式OpenSymphony Quartz和java Timer详解
yaerfeng1989
timer quartz 定时器
原创整理不易,转载请注明出处:Spring定时器配置的两种实现方式OpenSymphony Quartz和java Timer详解
代码下载地址:http://www.zuidaima.com/share/1772648445103104.htm
有两种流行Spring定时器配置:Java的Timer类和OpenSymphony的Quartz。
1.Java Timer定时
首先继承jav
Linux下df与du两个命令的差别?
pda158
linux
一、df显示文件系统的使用情况,与du比較,就是更全盘化。 最经常使用的就是 df -T,显示文件系统的使用情况并显示文件系统的类型。 举比例如以下: [root@localhost ~]# df -T Filesystem Type &n
[转]SQLite的工具类 ---- 通过反射把Cursor封装到VO对象
ctfzh
VO android sqlite 反射 Cursor
在写DAO层时,觉得从Cursor里一个一个的取出字段值再装到VO(值对象)里太麻烦了,就写了一个工具类,用到了反射,可以把查询记录的值装到对应的VO里,也可以生成该VO的List。
使用时需要注意:
考虑到Android的性能问题,VO没有使用Setter和Getter,而是直接用public的属性。
表中的字段名需要和VO的属性名一样,要是不一样就得在查询的SQL中
该学习笔记用到的Employee表
vipbooks
oracle sql 工作
这是我在学习Oracle是用到的Employee表,在该笔记中用到的就是这张表,大家可以用它来学习和练习。
drop table Employee;
-- 员工信息表
create table Employee(
-- 员工编号
EmpNo number(3) primary key,
-- 姓