问题标签 [doobie]

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 投票
1 回答
388 浏览

postgresql - jdbc - HikariCP:看到低插入吞吐量,而 DB/App cpu % 仍然很低

我已经设置了类似于默认设置的 doobie + hikaricp。通过调试日志,我可以看到有多少连接处于活动/空闲状态,这也反映了 pg_stat_activity 使用此查询返回的内容

我的应用程序主要通过在提交前通过由 3 个插入和 2 个选择组成的事务将它们存储在数据库中来处理来自流的消息。

以下是使用 hikariCP 创建交易者的方式:

然后将此事务传递到任何地方以处理数据库事务:

我看到的问题是查询似乎很快,但插入吞吐量很慢。

我注意到的几点:

  1. 检查 pg_stat_activity,我看到许多 COMMIT 查询(多于插入),每个查询都需要约 90 毫秒 - 200 毫秒。

    SELECT pid, now() - pg_stat_activity.query_start AS 持续时间,查询,query_start,state FROM pg_stat_activity where state <> 'idle' order by duration desc;

  2. 上面的 pg_stat_activity 查询一次只返回 4-8 行,大部分结果是 query = 'COMMIT'。

  3. 从一个空流开始,吞吐量可以高达每分钟 30k 条消息。但是,在 15-20 分钟后,吞吐量下降到每分钟 3k 条消息,并且不会重置恢复,直到流为空数小时后重新启动应用程序或扩展应用程序的更多实例并不能提高吞吐量。

数据库和应用程序的 CPU (10%) / Mem 使用率 (16%) 都很低,所以理论上吞吐量应该可以更高,哪些方面值得研究?

目前使用 doobie 0.5.4,hikariCP 0.5.4

更新:根据 Laurenz 的建议,在 rds 数据库上提出commit_delaycommit_siblings设置,将高吞吐量的时间从 30 分钟延长到 60 分钟,然后再像以前一样长时间降低吞吐量。我开始测试提升max_wal_size,但这似乎导致峰值吞吐量(有时非常低)不接近原始启动率。

0 投票
1 回答
163 浏览

sql - 如何将完整查询作为参数传递

我从 gitlab ci 得到一个查询,我想执行它。

如果我对查询进行硬编码,它就是 sql"""""" 语法。但我想将它作为变量传递(整个查询)。SqlInteroperator 不获取变量的值,因此返回一个空片段。

只是信息我有这些作为进口

可能吗?

0 投票
1 回答
2470 浏览

scala - Doobie 无法找到或构造类型 T 的读取实例

我正在使用 doobie 查询一些数据,一切正常,如下所示:

但是,如果我声明一个具有这样类型限制的函数:

}

我得到了这些错误:

有谁知道如何制作我想要的东西?我认为这是隐含的东西,但我不知道如何解决它。

0 投票
2 回答
912 浏览

mysql - 如何在 doobie 中配置交易者?

最近我开始学习 doobie,但我无法创建一个没有错误的 hikari 交易者。我正在使用 mysql,Intellij-Idea。

这是我的 build.sbt 文件

这是我的 Connection.scala 文件

问题是在上面的文件IO.pure(HikariTransactor.apply[IO](new HikariDataSource(config)))语句中给出了错误。这里最后一个闭合大括号中的 3 个给出了 3 个错误,如下所示。

我想知道,如何正确地做到这一点。

0 投票
1 回答
390 浏览

scala - 为 Seq 提供 Get 实例

例如,我有一些带有一些参数的实体和两个数据库表,代表这些实体:

还有一个 scala 模型:

我想通过 检索这些数据Doobie,但我不能直接对Entity实例执行此操作,原因params是字符串的序列,而不仅仅是字符串:

有什么技巧可以提供Get实例Seq吗?

如果没有,Doobie提供检索此类数据的方法是什么:

  1. 编写原语而不是Entitytype:
    sql.query[(Long, String, String)].to[Seq]并将这个 Seq 元组组合到Entity实例中。
    可能不方便,因为表可能有很多列,导致将这个长元组复制粘贴到每个新查询。
  2. 将此原语组合到另一个案例类中:
    case class EntityRow(id: Long, name: String)
    case class ParamRow(value: String)
    sql.query[(EntityRow, ParamRow)].to[Seq]并组合到Entity实例中,如1..
  3. 喜欢2.,但使用HNil:
    val entity = Long :: String :: HNil
    val param = String :: HNil
    sql.query[entity ++ param].to[Seq]并像 in 一样组合到Entity实例1.
    我不知道这种方式有什么优点或缺点,因为shapeless对我来说是新事物。
  4. 使用两个单独的查询检索数据:
    val entities = sql"select id, name from entity".query[EntityRow].to[Seq]
    val params = sql"select value from param".query[ParamRow].to[Seq]
    可能不像通过单个查询那样高效。
  5. 还有什么办法吗?

谢谢。

0 投票
0 回答
130 浏览

scala - 使用 doobie 查询 mysql 时出错

我在下面有交易者

我正在使用以下代码查询 mysql

公司是具有上述列名的案例类

但低于错误

我在哪里做错了

提前致谢

0 投票
3 回答
1718 浏览

scala - Doobie - 将任意效果提升到 ConnectionIO

我正在尝试在与使用 Doobie 将用户插入数据库的同一事务中发送电子邮件。
我知道我可以通过使用where但是IO在 我的代码中我不操作,我使用约束,例如 所以我可以用我自己的 monad 替换进行测试。 ConnectionIOAsync[ConnectionIO].liftIO(catsIO)catsIO: IO[String]
IOFF[_]: AsyncF

F[String]是否可以在ConnectionIO[String]不直接使用类型的情况下以某种方式提升 in IO

这是我为 IO 类型找到的答案:Doobie and DB access composition within 1 transaction

0 投票
0 回答
266 浏览

scala - 杜比。设置连接超时

如何使用设置连接超时Doobie

现在,我正在创建一个新hikari transactor的,然后对其进行配置:

我不确定是否可以。Docs什么也没说。

0 投票
4 回答
334 浏览

sql - Scala Doobie PSQLException:错误:使用“Like %”时输入末尾的语法错误

我将 PostgreSQL 12.1 与 Scala 和 Doobie 一起使用。尝试使用 LIKE % 语法进行查询时出现异常。它可以在没有 % 的情况下工作。

我的代码:

例外:

线程“主”org.postgresql.util.PSQLException 中的异常:错误:输入末尾的语法错误位置:org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2505) 的 org.postgresql.core 的 41 .v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:2241) 在 org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:310) 在 org.postgresql.jdbc.PgStatement.executeInternal(PgStatement.java:447) 在org.postgresql.jdbc.PgStatement.execute(PgStatement.java:368) 在 org.postgresql.jdbc.PgPreparedStatement.executeWithFlags(PgPreparedStatement.java:158) 在 org.postgresql.jdbc.PgPreparedStatement.executeQuery(PgPreparedStatement.java:108)在 doobie.free.KleisliInterpreter$PreparedStatementInterpreter.$anonfun$executeQuery$2(kleisliinterpreter.scala:第956章 猫的.effect.internals.IORunLoop$.startCancelable(IORunLoop.scala:41) at cats.effect.internals.IOBracket$BracketStart.run(IOBracket.scala:86) at cats.effect.internals.Trampoline.cats$effect$internals$ Trampoline$$immediateLoop(Trampoline.scala:70) at cats.effect.internals.Trampoline.startLoop(Trampoline.scala:36) at cats.effect.internals.TrampolineEC$JVMTrampoline.super$startLoop(TrampolineEC.scala:93) at scala.runtime.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.scala:18) 的cats.effect.internals.TrampolineEC$JVMTrampoline.$anonfun$startLoop$1(TrampolineEC.scala:93)。并发.BlockContext$。与BlockContext(BlockContext.scala:94)在cats.effect.internals.TrampolineEC$JVMTrampoline.startLoop(TrampolineEC.scala:93)在cats.effect.internals.Trampoline.execute(Trampoline.scala:43)在cats.effect.internals .TrampolineEC.execute(TrampolineEC.scala:44) at cats.effect.internals.IOBracket$BracketStart.apply(IOBracket.scala:72) at cats.effect.internals.IOBracket$BracketStart.apply(IOBracket.scala:52) at Cats.effect.internals.IORunLoop$.cats$effect$internals$IORunLoop$$loop(IORunLoop.scala:136) at cats.effect.internals.IORunLoop$RestartCallback.signal(IORunLoop.scala:355) atcats.effect。 internals.IORunLoop$RestartCallback.apply(IORunLoop.scala:376) at cats.effect.internals.IORunLoop$RestartCallback.apply(IORunLoop.scala:316) at cats.effect.internals.IOShift$Tick.run(IOShift.scala:36) 在 java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) 在 java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) 在 java.base /java.lang.Thread.run(Thread.java:834)

依赖项:

0 投票
1 回答
380 浏览

scala - 如何使用 Doobie (scala) 动态生成 SQL 语句

我有一个查询:

我从 excel 文件中读取了 partnerName 并为每个我执行了函数:

我使用了这个常见问题解答(如何将任意 SQL 字符串转换为 Query/Query0)

当我从 excel 中获取合作伙伴名称时,问题是得到空结果,但如果我在代码中指定相同的合作伙伴名称,例如,它可以工作:

我认为这是编码的问题,我试图修复它

但结果是一样的——空集。