从数百万个光纤(而不是数千个线程)中查询数据库

jOOQ是在Java中执行SQL的好方法, Quasar光纤带来了大大提高的并发性

我们很高兴在平行宇宙的 Fabio Tudone的jOOQ博客上宣布另一个非常有趣的来宾帖子。

Parallel Universe开发了一个开源堆栈,使开发人员可以轻松地在JVM上对极端的并发应用程序进行编码。 使用Parallel Universe堆栈,您可以构建与现代硬件协调工作的软件,而不是动every动脑,同时保持您的编程语言和简单,熟悉的编程风格。

法比妥酮 Fabio Tudone作为Comsat项目的一部分,开发和维护Quasar集成模块。 在加入Parallel Universe团队之前,他曾参与并领导了基于云的企业内容治理平台的开发工作数年,并且他在整个职业生涯中一直在编写JVM软件。 他的兴趣包括Dev和DevOps实践,可伸缩性,并发和功能编程以及运行时平台。 他自然好奇,喜欢探索,他喜欢从人,地方和文化中收集知识和理解。 他还对意识实践感兴趣,喜欢写各种各样的东西。

Quasar作为Comsat项目的一部分,具有JDBC和jOOQ的集成,因此让我们来看看它的内部。

JDBC,jOOQ和Quasar

comsat-jdbc提供了JDBC API的光纤阻塞包装程序,因此您可以在光纤而不是常规Java线程中使用连接。

为什么要这么做? 因为光纤是轻量级线程,并且与正在运行的JVM中的线程相比 ,您可以拥有更多的光纤。 “更多”意味着我们要说的是数百万人,而不是数千人。

这意味着在等待JDBC执行时,您的系统中有更多的并行能力来并行执行其他操作,无论是并发/并行计算(例如在高度可靠的类Quasar Erlang类actor系统中 交换actor消息 )阻止I / O(例如, 服务 Web 请求 , 调用微服务 ,通过光纤NIO读取文件或访问其他启用了光纤的数据源(如MongoDB ))。

如果您的数据库能忍受它,而更多的常规线程不会使您的系统崩溃(甚至),您甚至可以增加光纤JDBC池(请参阅附加点:后面的等待线 )并发送更多并发的jOOQ命令。

由于jOOQ使用JDBC连接访问数据库,因此在光纤上运行jOOQ就像引入comsat-jooq依赖项并将启用光纤的JDBC连接传递到jOOQ上下文一样简单:

import java.sql.Connection;
import static org.jooq.impl.DSL.*;// ...Connecton conn = FiberDataSource.wrap(dataSource).getConnection();
DSLContext create = DSL.using(connection);// ...

当然,您也可以将ConnectionProvider配置为从FiberDataSource提取连接。

从这一刻起,您可以使用常规的jOOQ,所有操作都将在光纤阻塞模式下发生,而不是在线程阻塞下发生。 而已。

不,真的, 绝对没有其他东西了:您将继续使用出色的jOOQ,仅使用效率更高的光纤而不是线程。 Quasar是一个好公民,不会强迫您使用新的API(特别是当原始API很好时,这很好)。

由于JVM 目前不支持可用于实现轻量级线程的本机绿色线程或延续 ,因此Quasar通过字节码检测实现了延续(以及它们之上的光纤)。 这可以在编译时完成,但是使用Quasar的代理通常更方便(尤其是在检测第三方库时),因此这是一个基于Dropwizard的Gradle示例项目 ,其中还包括Quasar代理设置(不要忘了Capsule ,这是一种非常出色的Java部署工具,可满足各种需求,这无疑使使用Quasar和代理变得轻而易举。 该示例未使用所有jOOQ功能,而是属于SQL构建用例 (用于查询和CRUD),但是建议您更改它以适合您的需求。 without-comsat分支包含一个线程阻止版本,因此您可以比较并查看与Comsat版本的(最小)差异。

排队等候在哪里?

您可能现在想知道:好的,但是JDBC是一个线程阻塞 API,Quasar如何将其转换为光纤 阻塞 API? 因为JDBC没有异步模式,所以Quasar在后台使用了一个线程池,光纤在该线程池中调度JDBC操作,并且在JDBC操作完成后将其解冻并计划恢复(请查看Quasar的集成模式以了解更多信息)信息)。

是的,这是讨厌的等待行 :等待线程池执行的JDBC命令。 尽管您并未将数据库并行性提高到超过JDBC线程池的大小,但是即使您仍在使用简单且熟悉的阻塞API,也不会损害光纤。 您仍然可以拥有数百万的纤维。

是否可以改善总体状况? 没有标准的异步Java RDBMS API,我们将无能为力。 但是,如果数据库是您的瓶颈,那么这可能根本不重要。 关于此主题有很多不错的文章和讨论 ,该论据等于确定您要将等待线移至何处。

奖励:巧妙的jOOQ集成

目前,Quasar需要开发人员(或集成商)告诉它要进行检测的内容,尽管正在进行自动检测(此功能取决于Java 9之前不会发布的一些较小的JRE更改)。 如果您可以方便地更改源代码(或已编译的类),则足以使用@Suspendable注释方法或让它们throws SuspendExecution ,但是对于库通常不是这种情况。 但是可以在META-INF/suspendablesMETA-INF/suspendable-supers中分别列出具有要检测的固定名称的方法,分别用于可以具有可挂起实现的具体方法和抽象/接口方法。

如果有很多(或涉及代码生成),则可以编写SuspendableClassifier随集成一起提供,并在Quasar的SPI中注册它以提供其他检测逻辑(请参阅jOOQs )。 SuspendableClassifier的工作是在检测阶段检查有关运行时类路径中每个方法的签名信息,并确定该方法是否可挂起,是否可以挂起,是否可以实现或不确定。 (其他一些分类器稍后可能会说“可悬浮”或“可悬浮-超级”)。

总结一下

好吧……只需要在高效纤维上享受出色的jOOQ!

翻译自: https://www.javacodegeeks.com/2015/06/querying-your-database-from-millions-of-fibers-rather-than-thousands-of-threads.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/359479.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

matlab向量的排序(自写函数)

function a_ed arraysort(a) %冒泡排序法 for i 1:length(a)-1%进行多少次比较for j1i:length(a)%每次求出最大的数&#xff0c;放在最后if(a(j)<a(i))tem a(i);a(i) a(j);a(j) tem;endenda_ed a; endclc; clear; a [2 4 4 6 14 0 2 8 4 1 9 4] b arraysort(a)转载于…

标准错误处理机制——error

在 Golang 中&#xff0c;错误处理机制一般是函数返回时使用的&#xff0c;是对外的接口&#xff0c;而异常处理机制 panic-recover 一般用在函数内部。 error 类型介绍 error 类型实际上是抽象了 Error() 方法的 error 接口&#xff0c;Golang 使用该接口进行标准的错误处理。…

ejb 2.0 3.0_EJB 3.1全局JNDI访问

ejb 2.0 3.0如本系列前面部分所述&#xff0c;EJB 3.0版规范的主要缺点是缺少可移植的全局JNDI名称。 这意味着没有可移植的方式将EJB引用链接到应用程序外部的Bean。 EJB v。3.1规范用自己的话填补了这一定义&#xff1a; “一个标准化的全局JNDI名称空间和一系列相关的名称空…

Oracle11.2.0.4 RAC安装文档

1 环境配置 参考官方文档《Grid Infrastructure Installation Guide for Linux》 1.1 软件环境 操作系统&#xff1a; [roothowe1 ~]# cat /etc/redhat-release Red Hat Enterprise Linux Server release 6.2 (Santiago) [roothowe1 ~]# uname -a Linux howe1 2.6.32-220.el6.i…

威海二职工业机器人专业_现在各大专开设的工业机器人专业前景如何?

我就是某专科学校工业机器人技术专业人的学生&#xff0c;专业是现在专业几个负责人15年向教育局申请申办的&#xff0c;16年正式招生&#xff0c;我也有幸作为第一届学生来到了该学校。先说教学吧&#xff0c;因为是第一届所以很多设备、设施都不完善&#xff0c;我觉得最重要…

协同遗漏的效果–使用简单的NIO客户端/服务器测量回送延迟

在这篇文章中&#xff0c;我演示了许多想法和技术&#xff1a; 如何编写一个简单的非阻塞NIO客户端/服务器 协调遗漏的影响 如何测量百分位数的延迟&#xff08;相对于简单平均&#xff09; 如何在计算机上计时延迟回送 我最近正在为客户端服务器应用程序开发低延迟基准测…

python 画蜘蛛_如何学习 R 绘图?

写在前面&#xff1a;为啥不用excel绘制这些图&#xff0c;用PoweBI&#xff0c;帆软BI等可视化软件来绘图&#xff0c;不是更方便吗&#xff1f;的确&#xff0c;这些工具都很方便&#xff0c;但同时&#xff0c;它们显得很呆&#xff0c;不够灵活&#xff0c;更为致命的是&am…

conflicting types for ‘方法名’ 的错误

将main()的实现写在drawShapes(),drawCircle(),drawRectangle()...之前. 结果编译的时候出现了 conflicting types for "方法名"的错误。故到网上查找答案&#xff0c;发现在这里需要严格按照函数出现的先后顺序才能成功编译&#xff0c;也就是main()要定义在最后&a…

Oracle用户system解锁

1.首先进入sql plus窗口&#xff08;参见上一篇文章&#xff09; 2.进入后&#xff1a;输入select username,account_status from dba_users where usernameSYSTEM; 3.查询system用户的状态和用户名&#xff0c;这里能查询出密码&#xff0c;但是查出来的密码是密文&#xff0c…

captcha库_将CAPTCHA添加到您的GWT应用程序

captcha库什么是验证码&#xff1f; 在一个充满恶意机器人的世界中&#xff0c;您应该怎么做才能保护您宝贵的Web应用程序&#xff1f; 您真正应该做的基本事情之一就是向其中添加CAPTCHA功能。 如果您不熟悉&#xff08;听起来有些奇怪&#xff09;&#xff0c;则CAPTCHA是确保…

GCD6: 在GCD上异步执行非UI相关任务

讨论&#xff1a;在主队列、串行队列和并发队列上异步执行代码块才能见识到 GCD 的真正实力。 要在分派队列上执行异步任务,你必须使用下面这些函数中的其中一个: dispatch_async为了异步执行向分派队列提交一个 Block Object(2 项都通过参数指定) dispatch_async_f为了异步执行…

带有Java 8,lambda表达式和Mockito-Java8附加组件的更紧凑的Mockito

Mockito-Java8是一组Mockito附加组件&#xff0c;它们利用Java 8和lambda表达式使Mockito的模拟更加紧凑。 在2015年初&#xff0c;我进行了简短的演讲&#xff0c; Java 8为测试带来了力量&#xff01; 我在GeeCON TDD 2015和DevConf.cz 2015上发表了演讲。在我使用4个示例的演…

ContentProvider与ContentResolver使用

例如以下内容为从网络转载&#xff1a;使用ContentProvider共享数据&#xff1a;当应用继承ContentProvider类&#xff0c;并重写该类用于提供数据和存储数据的方法&#xff0c;就能够向其它应用共享其数据。虽然使用其它方法也能够对外共享数据&#xff0c;但数据訪问方式会因…

cshtml中引用css_ASP.NET CoreMVC 中的控制器

Controller in ASP.NET Core MVC在本节中&#xff0c;我们将讨论 Controller 是什么以及它在 ASP.NET Core MVC 中的作用。Fiddler需要大家提前装一个工具&#xff0c;https://www.telerik.com/fiddlerFiddler 是一个 http 协议调试代理工具&#xff0c;它能够记录并检查所有你…

小学阅读方法六种_小学生掌握了这些语文答题方法,轻松应对阅读理解,不再是难事...

家长们都知道&#xff0c;孩子们在学习数学的时候&#xff0c;重要的就是数学的一些公式&#xff0c;只要把数学公式记牢&#xff0c;做很多题的时候灵活运用&#xff0c;就可以解答。今天我们来看看&#xff0c;语文方面也有一些答题公式&#xff0c;当孩子们完全掌握了这些公…

hdu--4028--dp

这个dp我没做出来啊...其实不难..主要题意没理解好 fuck. 给你1-N这N个数 一共2^N-1个子集 每个子集的LCM值>M的情况数有多少种 我也是醉了 这么个题目 给我套他那个题面 硬是没看懂 他在问什么 还是 英语太渣了 然后就是个 状态转移方程的考虑了 map<LL,LL>dp[size]…

敏捷中gwt含义_在您的GWT应用程序中添加JSON功能

敏捷中gwt含义JSON简介 在Web应用程序上工作时&#xff0c;总是会出现客户端-服务器数据交换的问题。 在此问题上有多种方法&#xff0c;其中许多使用XML进行交换。 执行此任务的一种不太知名的格式是JSON。 JSON&#xff08;JavaScript对象表示法&#xff09;是一种轻量级的数…

c++ 经典代码_C语言经典100题(31)

1上期答案揭晓首先给大家看看上一篇文章C语言经典100题(30)中第三部分编程题的答案&#xff1a;#include int main( ){ long ge,shi,qian,wan,x; printf("请输入 5 位数字&#xff1a;"); scanf("%ld",&x); wanx/10000; /*分解出万…

$ 与 # 区别

# 会根据不同类型而生产字符串&#xff0c;如 String 类型 : aa ---> aa,长整型Long:123 ---> 123$ 表示原生类型&#xff0c;如 String 类型 : aa ---> aa,长整型Long:123 ---> 123转载于:https://www.cnblogs.com/svennee/p/4078824.html

JAX-RS 2.x与Spring MVC:返回对象列表的XML表示

JSON是所有REST * API的王者&#xff0c;但是您仍然可能需要公开多种表示形式&#xff0c;包括XML。 使用JAX-RS和Spring MVC都非常简单。 实际上&#xff0c;唯一要做的就是用JAXB注释对从API调用返回的POJO进行注释。 但是&#xff0c;我认为序列化对象列表时&#xff0c;JA…