问题标签 [pg-jdbc]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
303 浏览

postgresql - 使用 JDBC 和 Postgres 将未知数量的参数传递给 IN 子句

我的查询看起来像这样,并且表现良好:

现在语句中这些三元组的数量in会有所不同,因此我尝试使用 JDBC 执行以下操作:

这表现非常糟糕。那么有没有办法使用 jdbc 发送三元组,使得最终结果等同于 sql 查询?

我有两个 btree 索引一个上one, two一个one, three我需要使用其中的任何一个来使这个高性能

0 投票
1 回答
667 浏览

java - Java 9 JDBC setup

The problem

I'm currently working with Java 9 and its module system and want to connect to my PostgreSQL database via JDBC.

The problem is that I could not find any information on its setup with Java 9 and it's module system but only for Java 8 and older.

The question

How can I properly setup JDBC and its driver using the java module system?

0 投票
1 回答
276 浏览

postgresql - 是否可以让休眠从 postgresql 的值语句生成更新?

给定一个 postgresql 表

以及以下值:

您可能知道使用 postgresql,您可以使用这种语句来更新具有不同值的多行:

它导致表在单个查询中更新为:

我一直在四处寻找如何让hibernate为更新查询生成这种语句。我知道如何使它适用于插入查询(使用 reWriteBatchedInserts jdbc 选项和休眠批处理配置选项)。

但是是否可以进行更新查询或者我必须自己编写本机查询?无论我做什么,hibernate 总是向数据库发送单独的更新查询(我正在查看 postgresql 服务器语句日志以获得此确认)。

我总是发现发出单个大规模更新查询比针对单行的许多单独更新快很多倍。对于许多单独的更新查询,即使它们是由 jdbc 驱动程序批量发送的,它们仍然需要由服务器顺序处理,因此它不如针对多行的单个更新查询效率高。因此,如果有人有一个不涉及为我的实体编写本机查询的解决方案,我将非常高兴!


更新

为了进一步完善我的问题,我想补充说明。我正在寻找一种不会放弃 Hibernate 脏检查功能以进行实体更新的解决方案。对于必须更新实体列表上具有不同值的几个基本字段的一般情况,我试图避免手动编写批量更新查询。我目前正在研究休眠的 SPI,看看它是否可行。 org.hibernate.engine.jdbc.batch.spi.Batch似乎是合适的地方,但我还不太确定,因为我从未对休眠 SPI 做过任何事情)。欢迎任何见解!


0 投票
2 回答
4547 浏览

postgresql - DBeaver PostgreSQL 数据库 - 此驱动程序不支持 SCRAM 身份验证

我正在尝试将 PostgreSQL 数据库添加到 DBeaver,并在尝试连接到数据库时收到以下错误。我正在使用 DBeaver 版本 7.2.3.202010191702。收到此消息后,我安装了最新版本的 JDK (11.0.9) 和 pgJDBC (postgresql-42.2.18.jar)。我还没有在这台机器上安装 PostgreSQL,所以它是最新版本 (v13) 的全新安装。有什么建议么?

此驱动程序不支持 SCRAM 身份验证。您需要 JDK >= 8 和 pgjdbc >= 42.2.0(不是“.jre”版本)

0 投票
0 回答
504 浏览

postgresql - 逻辑复制槽的restart_lsn位置移动很慢

我们的 postgresql 数据库(版本 11)实例中有两个逻辑复制槽,我们使用 pgJDBC 从这两个槽中流式传输数据。我们确保当我们定期发送反馈并将两个插槽的 confirm_flush_lsn(每 10 分钟)更新到相同位置时。然而,从我们的数据中我们看到,两者的 restart_lsn 移动并不同步,并且大多数情况下,它们中的一个滞后太远而无法不必要地保存 WAL 文件。这里有一些数据点来说明问题

尽管我们定期对插槽的流使用 setFlushLsn() 和 forceStatusUpdate ,但名称为 private 的插槽仍远远落后于 confirm_flush_lsn ,名称为 shared 的插槽也落后于 confirm_flush_lsn 但不会太远。由于 restart_lsn 的移动速度不够快,导致 WAL 日志文件管理出现很多问题,并且不允许删除它们以释放磁盘空间

如何解决这个问题?是否有任何通用指南来克服这个问题?

我们已经看到另一个有类似问题的线程,但那里也没有回复。 WAL 被堆积起来 - 逻辑复制的 restart_lsn 不在 PostgreSQL 中移动

我在这里使用 pgJDBC 发布的示例程序:https://jdbc.postgresql.org/documentation/head/replication.html 从此处的 postgresql 获取流式更改。
0 投票
0 回答
128 浏览

java - 无法从 java 传递自定义类型作为 postgres 过程的参数

https://docs.spring.io/spring-data/jdbc/old-docs/current/reference/html/orcl.datatypes.html

DB:Postgres 尝试从 java 传递自定义类型作为上述 url 后面的过程的参数。

自定义类型:

程序定义:

错误信息 :

如果使用 Types.OTHER

org.springframework.jdbc.BadSqlGrammarException: CallableStatementCallback; 糟糕的 SQL 语法 [{call schm.post(?)}]; 嵌套异常是 org.postgresql.util.PSQLException:错误:schm.post(unknown) 是一个过程 提示:要调用一个过程,请使用 CALL。职位:15

如果使用 Types.STRUCT

org.springframework.jdbc.BadSqlGrammarException: CallableStatementCallback; 糟糕的 SQL 语法 [{call schm.post(?)}]; 嵌套异常是 org.postgresql.util.PSQLException:不支持的类型值:2,002

也尝试过但没有运气 - escapeSyntaxCallMod=callIfNoReturn

https://github.com/pgjdbc/pgjdbc

其他有用的链接 -

https://www.highgo.ca/2020/11/25/calling-a-stored-procedure-in-postgrsql-from-java-and-its-current-limitations/

0 投票
0 回答
190 浏览

postgresql - 使用 @Transactional(readOnly=true) 时延迟增加

我正在使用一个后端服务(Spring Boot 2.2.13.RELEASE + Hikari + JOOQ),它使用一个配置有写入器(主)节点和读取器(读取副本)节点的 AWS Aurora PostgreSQL 数据库集群。读取器节点刚刚闲置/温暖地等待升级为主节点以防故障转移。

最近,我们决定开始专门从阅读器节点为我们的一些 GET 端点提供查询服务。为了实现这一点,我们使用了 RoutingDataSource 的“风格”,以便每当使用 @Transactional(readOnly=true) 注释服务时,都会针对读取器数据源执行查询。

直到这里一切都很顺利。但是,在应用此解决方案后,我注意到与主数据源相比,延迟增加了 3 倍。 延迟从 DataDog 增加

在深入研究之后,我发现每个事务都在进行几次额外的往返数据库以设置会话特征:

设置会话特征 只读 实际查询/查询 设置会话特征 读写

从 Datadog 为每个事务设置会话特征

为了改善这一点,我尝试使用pg-jdbc pg-jdbc 42.2.10 中引入的readOnlyMode设置。此设置允许控制连接设置为只读 (readOnly=true) 时的行为。

https://jdbc.postgresql.org/documentation/head/connect.html

在我的第一次尝试中,我使用了 readOnly=true 和 readOnlyMode=always。即使我弯腰看到 SET SESSION CHARACTERISTICS 语句,延迟保持不变。最后我尝试使用 readOnly=false 和 readOnlyMode=ignore。最后一个选项导致延迟减少,但它仍然比以前更糟。

其他人有这种设置的经验吗?什么是最优配置?我不需要将事务标记为只读(除了告诉路由数据源使用只读副本),所以我想弄清楚是否可以做任何其他事情,以便延迟之间保持不变Writer 和 Reader 节点。

注意:目前读取器节点仅服务于所有流量的 1%(+- 20req/s)。