golang配制高性能sql.DB

golang配制高性能sql.DB,第1张

有很多教程是关于Go的sqlDB类型和如何使用它来执行SQL数据库查询的。但大多数内容都没有讲述 SetMaxOpenConns() , SetMaxIdleConns() 和 SetConnMaxLifetime()方法, 您可以使用它们来配置sqlDB的行为并改变其性能。

转自:>

Go(又称Golang)是Google的RobertGriesemer,RobPike及KenThompson开发的一种静态强类型、编译型语言。功能:内存安全,GC(垃圾回收),结构形态及CSP-style并发计算。

KEGG是了解高级功能和生物系统(如细胞、生物和生态系统),从分子水平信息,尤其是大型分子数据集生成的基因组测序和其他高通量实验技术的实用程序数据库资源,是国际最常用的生物信息数据库之一,以“理解生物系统的高级功能和实用程序资源库”著称。

2、性质不同

go是计算机编程语言。

KEGG基因组破译方面的数据库。

扩展资料:

Go的语法接近C语言,但对于变量的声明有所不同。Go支持垃圾回收功能。Go的并行模型是以东尼·霍尔的通信顺序进程(CSP)为基础,采取类似模型的其他语言包括Oam和Limbo。

但它也具有Pi运算的特征,比如通道传输。在18版本中开放插件(Plugin)的支持,这意味着现在能从Go中动态加载部分函数。

与C相比,Go并不包括如枚举、异常处理、继承、泛型、断言、虚函数等功能,但增加了切片(Slice)型、并发、管道、垃圾回收、接口(Interface)等特性的语言级支持。Go20版本将支持泛型,对于断言的存在,则持负面态度,同时也为自己不提供类型继承来辩护。

不同于Java,Go内嵌了关联数组(也称为哈希表(Hashes)或字典()),就像字符串类型一样。

KEGG是一个整合了基因组、化学和系统功能信息的数据库。把从已经完整测序的基因组中得到的基因目录与更高级别的细胞、物种和生态系统水平的系统功能关联起来是KEGG数据库的特色之一。

人工创建了一个知识库,这个知识库是基于使用一种可计算的形式捕捉和组织实验得到的知识而形成的系统功能知识库。它是一个生物系统的计算机模拟。

与其他数据库相比,KEGG的一个显著特点就是具有强大的图形功能,它利用图形而不是繁缛的文字来介绍众多的代谢途径以及各途径之间的关系,这样可以使研究者能够对其所要研究的代谢途径有一个直观全面的了解。

欢迎golang同胞!在本教程中,我们将研究如何在基于 Go 的程序中与 GraphQL 服务器进行交互。在本教程结束时,我们应该知道如何执行以下 *** 作:

在本教程中,我们将专注于学习 GraphQL 的数据检索方面,并且我们将使用内存中的数据源来支持它。这应该为我们在后续教程的基础上建立一个良好的基础。

好的,所以在我们深入研究之前,我们应该真正了解 GraphQL 的基础知识。作为开发人员,使用它对我们有什么好处?

好吧,考虑使用每天处理数十万甚至数百万请求的系统。传统上,我们会使用位于数据库前面的系统 API,它会返回大量 JSON 响应,其中包含许多我们可能不一定需要的冗余信息。

如果我们正在处理大规模的应用程序,发送冗余数据的成本可能会很高,并且由于有效负载大小会阻塞我们的网络带宽。

GraphQL基本上可以让我们以减少噪音和描述数据,我们希望让我们的检索,从我们的API中检索 只有 我们需要为我们当前的任务/视图/不管。

这只是该技术为我们提供的众多好处的一个例子。希望在接下来的教程系列中,我们会提前看到更多这些好处。

需要注意的重要一点是,GraphQL 不像我们传统的 SQL 那样是一种查询语言。它是位于我们 API 前面的抽象, 依赖于任何特定的数据库或存储引擎。

这真的很酷。我们可以建立一个与现有服务商交互的 GraphQL 服务器,然后围绕着这个新的 GraphQL 服务器构建,而不必担心修改现有的 REST API。

让我们看看 RESTful 方法与 GraphQL 方法有何不同。现在,假设我们正在构建一个返回该站点上所有教程的服务,如果我们想要特定教程的信息,我们通常会创建一个 API 端点,允许我们根据 ID 检索特定教程:

如果给定一个 valid ID,这将返回一个响应,看起来像这样:

现在,假设我们想创建一个小部件,列出该作者撰写的书籍 5 个帖子。我们可以点击/author/:id端点以检索该作者撰写的所有帖子,然后进行后续调用以检索前 5 个帖子中的每一个。或者,我们可以制作一个全新的端点来为我们返回这些数据。

这两种解决方案听起来都不是特别吸引人,因为它们会创建不需要的请求量或返回过多的数据,这突出了 RESTful 方法开始出现一些裂缝的地方。

这就是 GraphQL 发挥作用的地方。使用 GraphQL,我们可以定义我们希望在查询中返回的数据的确切结构。所以如果我们想要上面的信息,我们可以创建一个看起来像这样的查询:

这将随后返回我们的教程、该教程的作者和一组表示该作者编写的教程的教程 ID,而无需发送额外的 x 多个 REST 请求来获取信息!那有多好?

好的,现在我们对 GraphQL 以及对它的用途有了更多的了解,让我们在实践中看看它。

我们将使用graphql-go/graphql实现在 Go 中创建一个简单的 GraphQL 服务器 。

让我们首先使用go mod init以下方法初始化我们的项目:

接下来,让我们创建一个名为maingo 我们将从简单开始创建一个非常简单的 GraphQL 服务器,它具有一个非常简单的解析器:

现在,如果我们尝试运行它,让我们看看会发生什么:

所以,如果一切正常,那么我们就可以设置一个非常简单的 GraphQL 服务器并对这个服务器进行非常简单的查询。

让我们分解上面代码中发生的事情,以便我们可以进一步扩展它。在lines 14-21我们定义我们的Schema 当我们对我们的 GraphQL API 进行查询时,我们基本上定义了我们想要返回给我们的对象上的哪些字段,因此我们必须在我们的 Schema 重新定义这些字段。

在 上line 17,我们定义了一个解析器函数,每当field请求此特定内容时就会触发该解析器函数。现在,我们只是返回字符串 "world",但我们将实现从这里查询数据库的能力。

让我们看一下maingo文件的第二部分。在line 30我们开始定义query请求领域hello。

然后我们创建一个params结构,其中包含对我们定义的Schema以及我们的RequestString请求的引用 。

最后,在line 36我们执行请求并将请求的结果填充到r 然后我们进行一些错误处理,然后将响应编组为 JSON 并将其打印到我们的控制台上。

现在我们已经启动并运行了一个非常简单的 GraphQL 服务器,并且我们能够对其进行查询,让我们更进一步,构建一个更复杂的示例。

我们将创建一个 GraphQL 服务器,它返回一系列内存中的教程及其作者,以及对这些特定教程的任何评论。

让我们定义一些struct代表 a Tutorial、 anAuthor和 a 的's Comment:

然后我们可以创建一个非常简单的populate()函数,它将返回一个类型数组Tutorial:

这将为我们提供一个简单的教程列表,然后我们可以稍后解决。

我们将从使用 GraphQL 创建一个新对象开始graphqlNewObject()。我们将使用 GraphQL 的严格类型定义 3 种不同的类型,它们将与structs我们已经定义的 3 种相匹配。

我们的Commentstruct 可以说是最简单的,它只包含一个 string Body,所以我们可以commentType很容易地将其表示为:

接下来,我们将处理该Author结构并将其定义为一个新的 graphqlNewObject() 这会稍微复杂一些,因为它既有一个 String字段,也有一个Int值列表,这些值代表他们编写的教程的 ID。

最后,让我们定义我们的tutorialTypewhich 将封装 an author和comment's的数组以及 anID和 a title:

现在我们已经定义了我们的Type系统,让我们着手更新我们的 Schema 以反映这些新类型。我们将定义 2 个 distinct Field,第一个将是我们的tutorial字段,它允许我们Tutorials 根据传入查询的 ID检索个人。第二个将是一个list字段,它将允许我们检索Tutorials我们在内存中定义的完整数组。

所以我们已经创建了我们的类型并更新了我们的 GraphQL 模式,我们做得还不错!

让我们尝试使用我们的新 GraphQL 服务器并处理我们提交的查询。让我们来尝试我们的list架构改变query ,我们已经在我们得到main()的功能:

让我们分解一下。所以在我们的查询中,我们有一个特殊的root对象。然后我们在其中说我们想要该list对象上的字段。在返回的名单list,我们希望看到的id,title,comments和 author。

当我们运行它时,我们应该会看到以下输出:

正如我们所见,我们的查询以 JSON 格式返回了我们所有的教程,看起来非常像我们初始查询的结构。

现在让我们尝试对我们的tutorial模式进行查询:

再一次,当我们运行它时,我们应该看到它已经成功地检索了内存中的单独教程ID=1:

完美,看起来我们已经让list我们的tutorial模式和我们的模式都按预期工作了。

这就是我们将在这个初始教程中介绍的全部内容。我们已经成功地设置了一个简单的 GraphQL 服务器,该服务器由内存数据存储支持。

在下一个教程中,我们将研究 GraphQL 突变并更改我们的数据源以使用 SQL 数据库

go数据库有sql2go官网。

用于将 sql 语句转换为 golang 的 struct 使用 ddl 语句即可。例如对于创建表的语句: show create table xxx 将输出的语句,直接粘贴进去就行。toml2go网。用于将编码后的 toml 文本转换问 golang 的 struct。

非关系型数据库(NoSQL):

指的是分布式的、非关系型的、不保证遵循ACID原则的数据存储系统。NoSQL数据库技术与CAP理论、一致性哈希算法有密切关系。所谓CAP理论,简单来说就是一个分布式系统不可能满足可用性、一致性与分区容错性这三个要求。

一次性满足两种要求是该系统的上限。而一致性哈希算法则指的是NoSQL数据库在应用过程中,为满足工作需求而在通常情况下产生的一种数据算法,该算法能有效解决工作方面的诸多问题但也存在弊端,即工作完成质量会随着节点的变化而产生波动。

Go 由于不支持泛型而臭名昭著,但最近,泛型已接近成为现实。Go 团队实施了一个看起来比较稳定的设计草案,并且正以源到源翻译器原型的形式获得关注。本文讲述的是泛型的最新设计,以及如何自己尝试泛型。

例子

FIFO Stack

假设你要创建一个先进先出堆栈。没有泛型,你可能会这样实现:

type Stack []interface{}func (s Stack) Peek() interface{} {

 

return s[len(s)-1]

}

func (s Stack) Pop() {

 s = (s)[:

len(s)-1]

}

func (s Stack) Push(value interface{}) {

 s = 

append(s, value)

}

但是,这里存在一个问题:每当你 Peek 项时,都必须使用类型断言将其从 interface{} 转换为你需要的类型。如果你的堆栈是 MyObject 的堆栈,则意味着很多 sPeek()(MyObject)这样的代码。这不仅让人眼花缭乱,而且还可能引发错误。比如忘记 怎么办?或者如果您输入错误的类型怎么办?sPush(MyObject{})` 可以顺利编译,而且你可能不会发现到自己的错误,直到它影响到你的整个服务为止。

通常,使用 interface{} 是相对危险的。使用更多受限制的类型总是更安全,因为可以在编译时而不是运行时发现问题。

泛型通过允许类型具有类型参数来解决此问题:

type Stack(type T) []Tfunc (s Stack(T)) Peek() T {

 

return s[len(s)-1]

}

func (s Stack(T)) Pop() {

 s = (s)[:

len(s)-1]

}

func (s Stack(T)) Push(value T) {

 s = 

append(s, value)

}

这会向 Stack 添加一个类型参数,从而完全不需要 interface{}。现在,当你使用 Peek() 时,返回的值已经是原始类型,并且没有机会返回错误的值类型。这种方式更安全,更容易使用。(译注:就是看起来更丑陋,^-^)

此外,泛型代码通常更易于编译器优化,从而获得更好的性能(以二进制大小为代价)。如果我们对上面的非泛型代码和泛型代码进行基准测试,我们可以看到区别:

type MyObject struct {

    X 

int

}

var sink MyObjectfunc BenchmarkGo1(b testingB) {

 

for i := 0; i < bN; i++ {

  

var s Stack

  sPush(MyObject{})

  sPush(MyObject{})

  sPop()

  sink = sPeek()(MyObject)

 }

}

func BenchmarkGo2(b testingB) {

 

for i := 0; i < bN; i++ {

  

var s Stack(MyObject)

  sPush(MyObject{})

  sPush(MyObject{})

  sPop()

  sink = sPeek()

 }

}

结果:

BenchmarkGo1BenchmarkGo1-16     12837528         870 ns/op       48 B/op        2 allocs/opBenchmarkGo2BenchmarkGo2-16     28406479         419 ns/op       24 B/op        2 allocs/op

在这种情况下,我们分配更少的内存,同时泛型的速度是非泛型的两倍。

合约(Contracts)

上面的堆栈示例适用于任何类型。但是,在许多情况下,你需要编写仅适用于具有某些特征的类型的代码。例如,你可能希望堆栈要求类型实现 String() 函数

在本节中,您将使用 Go 执行 SQL INSERT语句以向数据库添加新行。

您已经了解了如何使用Query和QueryRow处理返回数据的 SQL 语句。要执行 不 返回数据的 SQL 语句,请使用Exec

1、在albumByID下面,粘贴以下addAlbum函数以在数据库中插入新专辑,然后保存 maingo。

在此代码中:

(1)用DBExec执行INSERT语句。

Exec接受一条 SQL 语句,后跟 SQL 语句的参数值。

(2)检查尝试INSERT中的错误。

(3)使用ResultLastInsertId检索插入的数据库行的 ID 。

(4)检查尝试检索 ID 的错误。

2、更新main以调用新addAlbum函数。

在main函数末尾添加以下代码。

在新代码中:

(1)调用addAlbum添加新专辑,将要添加的专辑的 ID 分配给albID变量。

从包含 maingo 目录的命令行中,运行代码。

恭喜!您刚刚使用 Go 对关系数据库执行了简单的 *** 作。

本节包含您使用本教程构建的应用程序的代码。

芯片分析中的go分析解读 :

基因本体(gene ontology),简称GO,是一种描述基因或基因产物基本特性的词汇,由基因本体协会开发。

GO数据库在建立注释基因和蛋白质知识的标准词汇体系,使各数据库中基因产物功能描述相一致,随着研究的深入,基因本体语义词汇也在不断更新。

Gene Ontology的分析,就是把你的基因的功能归类注释。

芯片分析中的pathway分析解读 :

Pathway Analysis就是把基因、蛋白或者分子放到“Map”到某个特定的经典代谢或者调控网络,或者自己根据你的分子集的作用关系与功能,形成自己的特异的pathway。这对于阐释分子作用机理,找到Biomarker等非常重要。

1 Pathway功能分析及显著性判断

对差异表达基因进行Pathway功能分析,并计算Pvalue进行显著性判断,Pvalue越小,表明该pathway变化越显著,并可对每条Pathway通路图进行展示,同时在相应的位置标注差异表达基因。

2 Pathway中基因相关性分析

根据每两个基因共出现在同一pathway中的次数统计,绘制基因共相关点线图,进而得到不同pathway上基因的关联情况。在分析工具上点击“cell differentiation”,在“Term Information”中描述了细胞分化术语的基本信息,包括树形及与父结点、子节点关系。

对于未知基因名的序列,可以用序列直接检索GO数据库。点击AmiGO首页上方的“BLAST”,进入检索界面。在检索框输入氨基酸或核酸序列或上传序列文件,检索工具能自动识别并相应地选择BLASTP或BLASTX来与数据库中的序列进行比对。以大肠杆菌DNA聚合酶Ⅱ基因polB为例,“High Scoring Gene Products”栏内显示基因产物的名称、物种信息、p值。

扩展:

GO的局限性:

GO不是基因序列或基因产物数据库,它强调基因产物在细胞中的功能。

GO是对基因功能的注释,不能反映此基因的表达情况,即是否在特定细胞中、特定组织中、特定发育阶段或与某种疾病相关。

GO不对生物学的每个方面进行描述,如功能域的结构、进化特性等。

以上就是关于golang配制高性能sql.DB全部的内容,包括:golang配制高性能sql.DB、GO和KEGG的区别_go和kegg分析、Go 使用 GraphQL - 基础教程等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9524931.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-29
下一篇 2023-04-29

发表评论

登录后才能评论

评论列表(0条)

保存