java - 从 Java 发起的数据库查询是否总是阻塞 I/O?

标签 java multithreading scheduling blocking

<分区>

假设一些阻塞 I/O 是在 Java 中完成的,例如长时间运行的数据库查询。在 Java 中通常有一种方法可以让一些 Java 数据库驱动程序告诉 JVM 调度程序调用已经离开 JVM,现在正由某个外部系统处理吗?然后,JVM 可以分配为数据库查询提供服务的线程进行其他操作,直到数据库的回复到达。这样,阻塞的数据库查询将有效地变成非阻塞的。

只是想知道一般情况下这是否可以在 JVM 上完成。我做 Java 很多年了,但我承认我不知道在这种情况下 Java 调度程序在做什么。

最佳答案

let's say some blocking I/O is done in Java such as a long running db query. Is there in general a way in Java that some Java database driver can tell the JVM scheduler that the call has left the JVM and is now being processed by some external system?

呃,不。线程的全部要点在于,如果它们阻塞,则可以安排一个不同的线程来接管处理器或其他资源。您不希望 JVM 以某种方式使用相同的线程来保存所有 JDBC 状态、堆栈框架、变量等。您确实希望它使用相同的处理器和其他系统资源用于不同线程的任务。请记住,线程的开销相对较低。在现代系统上,当 JVM 中有 1000 个问题时,您可能会开始遇到问题,这主要是因为它们每个都分配了固定的堆栈空间区域。

作为程序员,我们对此进行优化的方法是使用多线程、线程池、数据库连接池等。然后当查询阻塞时,其他线程和查询可以并行工作以最大化系统吞吐量。

关于java - 从 Java 发起的数据库查询是否总是阻塞 I/O?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20952464/

相关文章:

java - 线程调度 - 按设定顺序运行线程

java - 从 Eclipse 的项目资源管理器 View 中删除项目 .jars

java - 正则表达式动态忽略给定路径的某些部分

java - JDBC DAO - 任何好的引用实现?

java - 在java中创建线程以在后台运行

java - 通过Key区分优先级队列堆的时间复杂度

linux - 旧版 Linux 内核不可抢占的原因是什么?

java - GetText() 说明 - xpath 不返回值

multithreading - Powershell v2.0 使用多线程

c# - 在任务上排队的延续是否总是在完成任务的线程上执行?