我在 ZIO 应用程序中使用 Doobie,有时会出现死锁(应用程序完全冻结)。如果我仅在一个内核上运行我的应用程序,或者达到与数据库的最大并行连接数,就会发生这种情况。
我的代码看起来像:
def mkTransactor(cfg: DatabaseConfig): RManaged[Blocking, Transactor[Task]] =
ZIO.runtime[Blocking].toManaged_.flatMap { implicit rt =>
val connectEC = rt.platform.executor.asEC
val transactEC = rt.environment.get.blockingExecutor.asEC
HikariTransactor
.fromHikariConfig[Task](
hikari(cfg),
connectEC,
Blocker.liftExecutionContext(transactEC)
)
.toManaged
}
private def hikari(cfg: DatabaseConfig): HikariConfig = {
val config = new com.zaxxer.hikari.HikariConfig
config.setJdbcUrl(cfg.url)
config.setSchema(cfg.schema)
config.setUsername(cfg.user)
config.setPassword(cfg.pass)
config
}
Run Code Online (Sandbox Code Playgroud)
或者,我在 Hikari ( config.setLeakDetectionThreshold(10000L))上设置了泄漏检测参数,但出现泄漏错误不是由于处理数据库查询所花费的时间。
有没有一种方法可以从Scala中的现有类型派生类型?
例如,case class Person(name: String, age: Int)我想获得一个Product/ Tuple的(Option[String], Option[Int]),即从现有的一种类型的映射。
Typescript(映射类型)中有一个功能可以相对轻松地实现这一点,这就是我开始思考这条道路的方式。但是我不确定如何在Scala中完成这样的事情。
我觉得解决方案涉及以某种方式使用无形状,但我不确定如何到达那里。
使用以下繁琐的代码,我可以成功连接到Azure SQL Server。
const Connection = require('tedious').Connection;
const connection = new Connection({
userName: '[USER]',
password: '[PASSWORD]',
server: '[HOSTNAME]',
options: {encrypt: true}
});
connection.on('connect', (err) => {
if (err) {
console.log('error connecting', err);
} else {
console.log('connection successful');
}
});
Run Code Online (Sandbox Code Playgroud)
但是,使用等效的Sequelize代码,我会收到连接超时错误。
const Sequelize = require('sequelize');
const sequelize = new Sequelize('[DBNAME]', '[USER]', '[PASSWORD]', {
dialect: 'mssql',
host: '[HOSTNAME]',
dialectOptions: {
encrypt: true
}
});
sequelize.authenticate().then((err) => {
console.log('Connection successful', err);
})
.catch((err) => {
console.log('Unable to connect to database', err);
});
Run Code Online (Sandbox Code Playgroud)
有什么想法吗? …
如何在我自己的机器上测试网页,好像我没有某种字体?
例如,我的网页使用Roboto字体.我的电脑本地安装了Roboto字体.如何在未安装该字体的计算机上查看此网页的外观?
假设通过某些CDN或其他方法将字体包含在网页中.
给定一个十进制值,我怎么能在一个字符串添加一个前导零只有当值小于1?
例如.
.20 -> "0.20" - Add a leading 0
1.20 -> "1.20" - Value remains the same
Run Code Online (Sandbox Code Playgroud)
小数位前的值可以是任意长度,小数位后的值只能是2位数.货币.这是用String.Format()实现的吗?或者我应该依赖基本的if语句?
String.Format()文档对我来说相当混乱.
我已经检查了其他几个问题/答案,似乎无法找到我正在寻找的东西.
编辑:正如几个答案所提到的,这种前导零加法应该是在值上调用的ToString()方法的默认行为.无论出于何种原因,在我的情况下都没有发生,所以String.Format()在我的情况下是必要的.
Unit从方法中显式返回类型的正确方法是什么,使用()或Unit?在我看来,在我尝试过的所有情况下,两者都有效.
对于上下文,如果我正在编写一个带副作用的方法并且返回Unit调用另一个方法,这也经常发生,这也会执行副作用但返回一些值而不是Unit.例如
def effectAndReturn(): String = {
val msg = "Hello, SO"
println(msg)
msg
}
def doEffect(): Unit = {
val _ = effectAndReturn()
() // `Unit` also works here
}
Run Code Online (Sandbox Code Playgroud)
从我的理解()是Unit存在的唯一类型的价值.返回令牌Unit中doEffect()所引用的Unit同伴对象; 我很困惑这将返回一个值,因为甚至没有apply定义一个方法.据我所知,返回给定抽象类的伴随对象的类型无效作为返回值.
将这些插入Scala REPL也很有趣
scala> val parenUnit = ()
parenUnit: Unit = ()
scala> parenUnit
// Returns blank line
scala> val wordUnit = Unit
wordUnit: Unit.type = object …Run Code Online (Sandbox Code Playgroud) scala ×2
.net ×1
azure ×1
c# ×1
concurrency ×1
css ×1
deadlock ×1
doobie ×1
fonts ×1
generics ×1
hikaricp ×1
html ×1
javascript ×1
sequelize.js ×1
shapeless ×1
sql-server ×1
zio ×1