当前位置: 首页 > 面试题库 >

JDBC使用MySQL选择批处理/获取大小

霍鸣
2023-03-14
问题内容

我有一个使用JDBC的Java应用程序,该应用程序每天在服务器上运行一次,并与也在同一服务器上运行的MySQL数据库(v5.5)进行交互。该应用程序正在查询并遍历表中的
所有 行。

该表目前很小(约5000行),但将无限期地增长。我的服务器内存有限,我不认为应用程序的内存消耗不确定。

如果我statement.setFetchSize(n)在运行查询之前使用过,我不清楚这里发生了什么。例如,如果我使用类似:

PreparedStatement query = db.prepareStatement("SELECT x, y FROM z");
query.setFetchSize(n);
ResultSet result = query.executeQuery();
while ( result.next() ){
    ...
}

这是如何适当控制潜在的大型选择查询吗?这里发生了什么事?如果n是1000,那么MySQL一次只能将1000行拖入内存(知道它停在哪里),然后每次需要获取下1000行(或很多)吗?

编辑:
现在很明显,设置获取大小对我没有用。请记住,我的应用程序和MySQL服务器都在同一台计算机上运行。如果MySQL将整个查询结果都拉入内存,那么这也会影响应用程序,因为它们都共享相同的物理内存。


问题答案:

MySQL Connector / J驱动程序将获取 所有
行,除非将获取大小设置为Integer.MIN_VALUE(在这种情况下,它将以AFAIK一次获取一行)。见MySQL的连接器/ J JDBC
API实现说明下 ResultSet

如果您期望内存使用成为问题(或者实际上是成为问题),则也可以使用LIMIT子句(而不是using
setFetchSize(Integer.MIN_VALUE))来实现分页。



 类似资料:
  • 我有一个使用JDBC的Java应用程序,它每天在我的服务器上运行一次,并与同样在同一服务器上运行的MySQL数据库(v5.5)交互。该应用程序正在查询和遍历表中的所有行。 该表目前相当小(约5000行),但将无限期地继续增长。我的服务器内存有限,我不喜欢应用程序内存消耗不确定的想法。 如果我使用在运行查询之前,我不清楚这里发生了什么。例如,如果我使用以下内容: 这是如何适当地控制潜在的大型sele

  • 主要内容:使用Statement对象进行批处理,使用PrepareStatement对象进行批处理批量处理允许将相关的SQL语句分组到批处理中,并通过对数据库的一次调用来提交它们,一次执行完成与数据库之间的交互。 一次向数据库发送多个SQL语句时,可以减少通信开销,从而提高性能。 不需要JDBC驱动程序来支持此功能。应该使用方法来确定目标数据库是否支持批量更新处理。如果JDBC驱动程序支持此功能,该方法将返回。 ,和的方法用于将单个语句添加到批处理。 用于执行组成批量的所有语句。 返回一个整数

  • 我得到以下查询:hibernate:select CHARGE.nextval from dual hibernate:insert into CHARGE(ACCOUNTNUMBER CHARGE_ID)值(?,?)Hibernate:插入到CHARGE(ACCOUNTNUMBER CHARGE_ID)值(?,?)Hibernate:插入到CHARGE(ACCOUNTNUMBER CHARGE_

  • 问题: 使用远程分块或分区来水平缩放? 由于数据在平面文件中,远程分块和分区都是不好的选择?

  • 问题内容: Hibernate提供(至少)两个选项来解决N + 1查询问题。一个是将FetchMode设置为Subselect,这会生成一个带有IN子句的选择以及此IN子句中的子选择。另一个是指定BatchSize,它会生成一个带有包含父母ID的IN子句的选择。 两者都可以工作,但是我发现由于对父项的查询很复杂,Subselect选项经常遇到性能问题。另一方面,对于大的BatchSize(例如10

  • 我正在编写一个程序,使用Spring Batch处理MySQL数据库表中的7637064行。我成功地处理了较小的表,但当JdbcCursorItemReader尝试打开光标时,该表中的大量行导致了OutOfMemoryError异常。 我可能可以通过向它扔一个更大的Xmx来解决这个问题,但在我看来,Spring Batch应该有办法处理这个问题,我可能只是缺少一个关键的配置部分。 Spring批配