首页 > 编程语言 >【源码阅读】2. Catalog和Database

【源码阅读】2. Catalog和Database

时间:2023-06-25 18:45:31浏览次数:37  
标签:jdbc Database Catalog 源码 KW mysql initialized properties

 

Catalog

创建

    | KW_CREATE KW_CATALOG opt_if_not_exists:ifNotExists ident:catalogName opt_properties:properties
    {:
         RESULT = new CreateCatalogStmt(ifNotExists, catalogName, null, properties);
    :}
    | KW_CREATE KW_CATALOG opt_if_not_exists:ifNotExists ident:catalogName KW_WITH KW_RESOURCE ident:resourceName opt_properties:properties
    {:
         RESULT = new CreateCatalogStmt(ifNotExists, catalogName, resourceName, properties);
    :}
 可以通过两种方式建立Catalog
-- 方式一 
CREATE RESOURCE mysql_resource PROPERTIES (
    "type"="jdbc",
    "user"="root",
    "password"="123456",
    "jdbc_url" = "jdbc:mysql://127.0.0.1:3316/doris_test?useSSL=false",
    "driver_url" = "https://doris-community-test-1308700295.cos.ap-hongkong.myqcloud.com/jdbc_driver/mysql-connector-java-8.0.25.jar",
    "driver_class" = "com.mysql.cj.jdbc.Driver"
);
CREATE CATALOG jdbc WITH RESOURCE mysql_resource;

-- 方式二
CREATE CATALOG jdbc PROPERTIES (
    "type"="jdbc",
    "user"="root",
    "password"="123456",
    "jdbc_url" = "jdbc:mysql://127.0.0.1:3316/doris_test?useSSL=false",
    "driver_url" = "https://doris-community-test-1308700295.cos.ap-hongkong.myqcloud.com/jdbc_driver/mysql-connector-java-8.0.25.jar",
    "driver_class" = "com.mysql.cj.jdbc.Driver"
);

 

展示

Show Catalog有两种写法,分别展示所有Catalog列表和单Catalog的属性

 

展示创建

ShowCreateCatalogStmt在CatalogMgr.showCreateCatalog中拼接show create catalog语句

 

switch

最终设置ConnectContext.defaultCatalog属性

 

refresh

刷新Catalog时:

● 重置objectCreated - 因为每一步操作都会先去makeSureInitialized,其中会判断objectCreated,这里设置了之后,后面会触发客户端创建

● 重置initialized - 因为每一步操作都会先去makeSureInitialized,其中会判断initialized,这里设置了之后,后面会触发ExternalDatabase的生成(重置)

● 清空Cache

    public void setUninitialized(boolean invalidCache) {
        this.objectCreated = false;
        this.initialized = false;
        this.invalidCacheInInit = invalidCache;
        if (invalidCache) {
            Env.getCurrentEnv().getExtMetaCacheMgr().invalidateCatalogCache(id);
        }
    }
 

Catalog接口调用

Catalog在实际进行接口调用时,会首先makeSureInitialized,判断objectCreated和initialized,保证以下事情是完成的:

● 构建Client

● 刷新DB列表

 

DB

创建

    KW_CREATE KW_DATABASE opt_if_not_exists:ifNotExists ident:db opt_properties:properties
    {:
        RESULT = new CreateDbStmt(ifNotExists, db, properties);
    :}
 

主要是InternalCatalog.createDb:创建Database对象并注册到内存

 

展示

    | KW_DATABASES opt_wild_where
    {:
        RESULT = new ShowDbStmt(parser.wild, parser.where);
    :}
    | KW_DATABASES KW_FROM ident:catalogName
    {:
        RESULT = new ShowDbStmt(null, null, catalogName);
    :}
 

 

展示创建

 

use

这个语句比较特殊,没有走一般的Query子流程,而是在dispatch时,直接走到了handleInitDb里面。而且调用它时,还会顺带发送如下子句

● SELECT DATABASE()

● show databases

● show tables

最终调用ConnectContext.setDatabase设置ConnectContext.currentDb属性

 

refresh Database

刷新Database时:

● 重置initialized - 因为每一步操作都会先去makeSureInitialized,其中会判断initialized,这里设置了之后,后面会触发ExternalTable的生成

● 清空DB Cache

    public void setUnInitialized(boolean invalidCache) {
        this.initialized = false;
        this.invalidCacheInInit = invalidCache;
        if (invalidCache) {
            Env.getCurrentEnv().getExtMetaCacheMgr().invalidateDbCache(extCatalog.getId(), name);
        }
    }

 

 

Database接口调用

Database在实际进行接口调用时,会首先makeSureInitialized,判断Catalog.makeSureInitialized和initialized,保证以下事情是完成的:

● Catalog初始化完成

  • 构建Client
  • 刷新DB列表

● 刷新Table列表

 

InternalCatalog之内部默认information_schema

InfoSchemaDb是内部Database的实现类。SchemaTable是其中加入的Table类型。

标签:jdbc,Database,Catalog,源码,KW,mysql,initialized,properties
From: https://www.cnblogs.com/xutaoustc/p/17503692.html

相关文章

  • 【源码阅读】1. 配置、VARIABLE与用户PROPERTY
     配置初始化在FE启动时:● Config类ConfField注解标记的静态属性反射出Field存储到内存confFields,作为一个可读取和修改的属性列表(真正的值存储在Config类的静态属性中,反射出Field并存储到confFields只是一个读取和修改指针而已)● 读取配置文件,根据配置文件内容,设置Confi......
  • Bert PyTorch 源码分析:一、嵌入层
    #标记嵌入就是最普通的嵌入层#接受单词ID输出单词向量#直接转发给了`nn.Embedding`classTokenEmbedding(nn.Embedding):def__init__(self,vocab_size,embed_size=512):super().__init__(vocab_size,embed_size,padding_idx=0) #片段嵌入实际上是......
  • ORA-15061 reported while doing a file operation with 11.1 or 11.2 ASM after PSU
    ORA-15061reportedwhiledoingafileoperationwith11.1or11.2ASMafterPSUappliedindatabasehome[ID1070880.1]--------------------------------------------------------------------------------修改时间26-OCT-2011类型PROBLEM状态PUBLISH......
  • 谁与争锋!手机直播源码知识分享之主播PK功能
    今天我要分享的知识与PK有关,PK是指某些人分成几方进行对决、对抗,直到分出胜负。PK的方式有很多,在现实生活中,人们可以通过智力、力量等进行PK,方式可以是搏斗、扳手腕、现场智力问答等;而在网络中,人们可以通过游戏、网络智力问答的方式进行PK。我今天要讲的这个功能也是网络中的PK,这个......
  • 【DataBase】SQL函数_ substr()函数
    substr()函数用于截取对应字段指定长度。SUBSTR(string,pos,len)string:指定字符串pos:规定字符串从何处开始,(这里的第一个位置是1而不是0)为正数时则从字段开始出开始,为负数则从结尾出开始。len:要截取字符串的长度。(是从1开始计数而不是0)  INSTR()......
  • 使用自己的数据库SQLite database
    http://www.reigndesign.com/blog/using-your-own-sqlite-database-in-android-applications/MostalloftheAndroidexamplesandtutorialsoutthereassumeyouwanttocreateandpopulateyourdatabaseatruntimeandnottouseandaccessanindependent,prelo......
  • 2.nacos-client源码及查看
    nacos-client.2.2.1-RC.SDK查看源码官网JAVASDK链接主要内容<dependency><groupId>com.alibaba.nacos</groupId><artifactId>nacos-client</artifactId><version>${version}</version></dependency>问题:1.获取配置api是获取快照......
  • k8s驱逐篇(7)-kube-controller-manager驱逐-taintManager源码分析
    概述taintManager的主要功能为:当某个node被打上NoExecute污点后,其上面的pod如果不能容忍该污点,则taintManager将会驱逐这些pod,而新建的pod也需要容忍该污点才能调度到该node上;通过kcm启动参数--enable-taint-manager来确定是否启动taintManager,true时启动(启动参数默认值为true);k......
  • spring源码笔记
    Bean创建流程获取对象的BeanDefinition通过反射创建空对象填充属性调用init方法  Bean创建关键方法(按顺序)getBeandoGetBeancreateBeandoCreateBeancreateBeanInstancepopulateBean  解决循环依赖:三级缓存循环依赖原因单例,每个类只有一个对象。A引用B,B又......
  • SPI的插件化设计-->JDK的SPI(ServiceLoader)实现拓展、实现Dubbo的SPI(ExtensionLoade
    (目录)1.什么是SPI?SPI的全称是ServiceProviderInterface,直译过来就是"服务提供接口",为了降低耦合,实现在模块装配的时候动态指定具体实现类的一种服务发现机制。动态地为接口寻找服务实现。它的核心来自于ServiceLoader这个类。javaSPI应用场景很广泛,在Java底层和一些......