当前位置: 首页 > 知识库问答 >
问题:

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

鲜于雨石
2023-03-14

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

该表目前相当小(约5000行),但将无限期地继续增长。我的服务器内存有限,我不喜欢应用程序内存消耗不确定的想法。

如果我使用语句。setFetchSize(n)在运行查询之前,我不清楚这里发生了什么。例如,如果我使用以下内容:

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

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

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

共有1个答案

卫泉
2023-03-14

MySQL连接器/J驱动程序将获取所有行,除非获取大小设置为整数。MIN\u值(在这种情况下,它将一次获取一行)。请参阅结果集下的MySQL连接器/J JDBC API实现说明。

如果您希望内存使用成为一个问题(或者当它实际上成为一个问题时),您还可以使用LIMIT子句实现分页(而不是使用setFetchSize(整数.MIN_VALUE))。

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

  • 主要内容:使用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_

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

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

  • 在前面的章节,我们使用mysql交互模式输入语句和查看结果。我们也可以以批处理的模式来运行mysql。要达到这种目的,需要把我们想运行的语句放在一个文件里,然后告诉mysql从文件读取它的输入。 shell> mysql < batch-file 如果你是在Windows下运行mysql,文件里的一些特定字符会引起一些问题,你要这样做: C:\> mysql -e "source batch-f