PostgreSQL 与 JDBC 或 Hibernate 用于使用 CSV 数据的 Web 应用程序

Posted

技术标签:

【中文标题】PostgreSQL 与 JDBC 或 Hibernate 用于使用 CSV 数据的 Web 应用程序【英文标题】:PostgreSQL with JDBC or Hibernate for web application using CSV data 【发布时间】:2016-04-12 20:34:35 【问题描述】:

我目前正在开发一个将连接到 PostgreSQL 数据库的 Web 应用程序。我使用 Java 作为我选择的语言,并使用 Maven 作为我的构建管理器(Web 应用程序模板)。

我的数据包含在许多用竖线分隔的文件中,每一行都是表中的一个实体(每个表一个文件)。有20-30个表,它们之间的总行数达到10+百万。

我知道 psql 中有一个 csv 导入器,我在其他情况下也成功使用过它。不过,我正在决定哪种软件最适合我的应用程序。

从表面上看,我知道 JDBC 和 Hibernate 之间的区别、优势、劣势等,并阅读了比较它们的各种其他答案。我认为 Hibernate 值得学习,并使应用程序优化。但是,这里存在 CSV 导入问题。我知道 Hibernate 并没有开箱即用,而 JDBC 将是一个更好的选择。

问题是,在这种情况下,JDBC 是显而易见的选择吗?我已经阅读过它何时优于 Hibernate,反之亦然,但似乎我有一些重叠,无法确定。

因为我可以使用 CopyManager 和来自 STDIN 的 COPY 来加载我的 CSV 数据,所以只使用 JDBC 是否最有意义?我渴望深入研究 Hibernate,因为它似乎比 JDBC 具有坚实的优势,并且作为新开发人员了解它是一项很好的技术,但我对此并不陌生,希望得到一些建议!

**** 编辑澄清 *****

所以我会将所有 CSV 数据加载到数据库中,然后随着时间的推移,我可能会根据我的决定向数据库添加更多表(也可能来自 CSV)。我的 Web 应用程序本质上将允许客户端在网页上的输入表单中键入 SQL 查询,这将在我创建的数据库上执行,并返回所需的内容。我正在使用 tomcat 作为我的服务器。

谢谢!

【问题讨论】:

Hibernate 不适合批量操作,比如大量插入。如果您的应用程序只需要导入 CSV 文件,我什至不确定 JDBC 是否是最佳选择。为什么不是简单的脚本? Hibernate 最适合典型的 CRUD 操作,可能包括需要在互连实体图中导航的复杂用例。 进一步了解@JBNizet 所说的,您的“Web 应用程序”实际上要做什么?是否必须定期导入这些文本文件?为什么?达到什么目的?请edit澄清您的问题。 抱歉,为澄清而编辑! Maven 和这个有什么关系?什么都没有。它和你的 IDE 一样有意义。 【参考方案1】:

本质上是this 的复制品,但不会将其标记为...目前。

基本上,只要不禁用现有数据约束,通过直接 SQL/JDBC 加载大数据将非常昂贵且运行时间长。

大多数 ETL(extract-translate-load,用于数据仓库)工具避免直接使用 SQL 并在工作表下工作以快速执行操作,绕过 SQL 避免查询解析(昂贵,尽管绑定参数可以缓解它)和数据库约束(禁用它们或使用允许它们在最后一次完成的功能)和间歇性提交(因为您可能会使数据处于不良状态)。一些数据库供应商(例如 MSSQL 和 Oracle)拥有执行基本负载的工具,可以帮助处理此类批量情况。

恕我直言,您需要尽一切可能避免大批量使用 JDBC。如果您无法访问企业级工具,请使用技术将文件操作为 pg_restore 可以使用的格式。即使您需要在数据进入后重新格式化数据,在大多数情况下,将数据加载到临时表中然后进行任何其他所需的数据操作/规范化会更容易。

【讨论】:

感谢您的回答。经过一番思考和搜索,我创建了一个希望更好的工作流程,尽管它没有按照您的建议使用 pg_restore。我计划编写一个 SQL 脚本来检查表是否存在,如果不存在,则创建它,然后使用 COPY 将 csv 数据加载到新创建的表中。我将使用 Runtime.exec() 从我的 Java 程序中运行它。 (我认为这比通过 JDBC 更快,但无论哪种方式,我都是在具有 1TB 闪存的 32g 机器上)。 ...继续下一条评论... ...继续...加载数据后,我将使用 JDBC 对数据库执行查询(也许是 Hibernate?因为我将查询并仅使用 CRUD 操作?)。查询将来自客户端 Web 浏览器中的文本字段,因此我的下一步将是获取该字符串并执行它的后勤工作。感谢您的帮助,如果有什么重大问题请告诉我! 在加载数据后使用 JDBC 进行查询或在数据加载后对可管理的行数进行 CRUD 操作非常棒,我关心的是使用 JDBC 加载。

以上是关于PostgreSQL 与 JDBC 或 Hibernate 用于使用 CSV 数据的 Web 应用程序的主要内容,如果未能解决你的问题,请参考以下文章

OFFSET N FETCH FIRST M ROWS 与 JDBC 和 PostgreSQL 不工作

如何让 PostgreSQL DBLink 连接与 JDBC 一起使用?

如何使用 JDBC 调用 PostgreSQL 存储过程

找不到适合数据库类型的 JDBC 驱动程序:当 jar 文件存在时,PostgreSQL 与 Teamcity

Postgresql jdbc 驱动程序与 EDB 驱动程序

Kafka JDBC Sink 连接器与 PostgreSQL 12 兼容吗?