java - 如果 ResultSet 可以用于 getBinaryStream() 但实际上却没有,是否开销太大?

标签 java mysql jdbc

在 mysql 中我有表

CREATE  TABLE `articles_attachments` (
  `id` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
  `name` VARCHAR(200) NOT NULL ,
  `size` BIGINT NOT NULL ,
  `article_id` BIGINT NOT NULL ,
  `contents` LONGBLOB NOT NULL ,
  PRIMARY KEY (`id`) ,
  UNIQUE INDEX `id_UNIQUE` (`id` ASC) ,
  UNIQUE INDEX `unique_file` (`article_id` ASC, `name` ASC),
  INDEX `fk_article` (`article_id` ASC)
) ENGINE = InnoDB DEFAULT CHARACTER SET = utf8 COLLATE = utf8_general_ci;

在应用程序代码中,我通常只需要列出附件,但不需要获取其内容。因此,当我从该表中检索行时,我不希望浪费资源来服务“内容”字段。 棘手的部分是我使用执行“SELECT * FROMarticles_attachments”的自定义库,因此它查询以返回所有字段。

我可以轻松做的是覆盖 RowMapper(来自 Spring Jdbc)并且不映射“内容”字段(不调用 ResultSet.getBinaryStream)。

问题:这有助于避免资源浪费吗?...我不希望在检索 100 行附件表时打开 100 个流。

最佳答案

我做了几个测试,结果发现答案是“是的,如果结果查询包含 ~BLOB 类型的字段,即使您不调用 ResultSet.getBinaryStream,您也会浪费资源(特别是带宽)”。

我确实用以下方法测试了它:

  • MySQL 5.6.20 和 MirandaDB 10.0.13
  • mysql-connector-java-5.1.19-bin.jar
  • HikariCP-java6-2.2.5.jar

关于java - 如果 ResultSet 可以用于 getBinaryStream() 但实际上却没有,是否开销太大?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28128272/

相关文章:

java - 如何创建Maven依赖bat文件?

java - 如何创建一个JComboBox,其每个元素都有两种不同的样式?

java - 我将如何评估某个公式?

java - 记录与数据库通信的 SQL

java - 对于PreparedStatement 类型,方法 getInt、getString 和 getDate 未定义

java - 为什么少了回车符?

php - 命令行脚本 PHP 不运行

mysql - 无法将时间插入 MySQL 数据库(C# 或 SQL 不起作用)

java - Android 上的 JDBC

javascript - 如何在javascript中获取mysql数据以进行动态表单添加