- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在我的应用程序中,我必须与多个 MySQL
交互(只读) DB 一个一个。对于每个数据库,我需要一定数量的连接。与数据库的交互不会一次性发生:我查询数据库,花一些时间处理结果,再次查询数据库,再次处理结果等等。
这些交互中的每一个都需要多个连接 [ 我同时触发多个查询 ],因此我需要一个 ConnectionPool
它在我开始与数据库交互时产生并一直存在,直到我完成对该数据库的所有查询(包括我不查询时的中间时间间隔,只处理结果)。
我能够成功创建一个 ConnectionPool
具有所需的连接数并获得 implicit session
如下所示
def createConnectionPool(poolSize: Int): DBSession = {
implicit val session: AutoSession.type = AutoSession
ConnectionPool.singleton(
url = "myUrl",
user = "myUser",
password = "***",
settings = ConnectionPoolSettings(initialSize = poolSize)
)
session
}
implicit session
在我需要与数据库交互的整个方法中。这样,我就可以开火
poolSize
没有同时使用这个的查询
session
.很公平。
def methodThatCallsAnotherMethod(implicit session: DBSession): Unit = {
...
methodThatInteractsWithDb
...
}
def methodThatInteractsWithDb(implicit session: DBSession): Unit = {
...
getResultsParallely(poolSize = 32, fetchSize = 2000000)
...
}
def getResultsParallely(poolSize: Int, fetchSize: Int)(implicit session: DBSession): Seq[ResultClass] = {
import java.util.concurrent.Executors
import scala.concurrent.ExecutionContext
import scala.concurrent.duration._
implicit val ec: ExecutionContext = ExecutionContext.fromExecutorService(Executors.newFixedThreadPool(poolSize))
val resultsSequenceFuture: Seq[Future[ResultClass]] = {
(0 until poolSize).map { i =>
val limit: Long = fetchSize
val offset: Long = i * fetchSize
Future(methodThatMakesSingleQuery(limit, offset))
}
}
val resultsFutureSequence: Future[Seq[ResultClass]] = Future.sequence(resultsSequenceFuture)
Await.result(resultsFuture, 2.minutes)
}
implicit session
通过这样的所有方法(见下文)是不可行的。 ConnectionPool
s,每个 DB 一个 ScalikeJdbc
的
docs ,我想出了以下不需要我通过
implicit session
的方法。到处。
def createConnectionPool(poolName: String, poolSize: Int): Unit = {
ConnectionPool.add(
name = poolName,
url = "myUrl",
user = "myUser",
password = "***",
settings = ConnectionPoolSettings(initialSize = poolSize)
)
}
def methodThatInteractsWithDb(poolName: String): Unit = {
...
(DB(ConnectionPool.get(poolName).borrow())).readOnly { implicit session: DBSession =>
// interact with DB
...
}
...
}
borrow()
方法,从池中获取单个连接。这反过来又让我想知道为什么
AutoSession
更早的事情:为什么我能够使用单个
implicit session
同时触发多个查询?如果那东西奏效了,那为什么它不起作用呢?但我没有找到如何获得
DBSession
的例子。来自
ConnectionPool
支持多个连接。
ScalikeJdbc
的有限文档没有提供很多帮助和博客/文章
ScalikeJdbc
几乎不存在。
Scala 2.11.11
"org.scalikejdbc" %% "scalikejdbc" % "3.2.0"
最佳答案
感谢 @Dennis Hunziker ,我能够弄清楚the correct way释放从 ScalikeJdbc
借来的连接的 ConnectionPool
.可以按如下方式完成:
import scalikejdbc.{ConnectionPool, using}
import java.sql.Connection
using(ConnectionPool.get("poolName").borrow()) { (connection: Connection) =>
// use connection (only once) here
}
// connection automatically returned to pool
ConnectionPool
的问题s 并使用跨多个连接
class
es,我最终写了一个
ConnectionPoolManager
, 完整代码可在
here 中找到.通过卸载任务
singleton
我可以在我的项目中的任何地方使用的对象,我能够清除很多困惑并消除了需要通过
implicit session
跨方法链。
ConnectionPoolManager
的完整代码, 这里有一个关于如何去做的快速提示
ConnectionPoolManager
允许您从
ConnectionPool
借用连接秒
def getDB(dbName: String, poolNameOpt: Option[String] = None): DB = {
// create a pool for db (only) if it doesn't exist
addPool(dbName, poolNameOpt)
val poolName: String = poolNameOpt.getOrElse(dbName)
DB(ConnectionPool.get(poolName).borrow())
}
def makeQuery(dbName: String, poolNameOpt: Option[String]) = {
ConnectionPoolManager.getDB(dbName, poolNameOpt).localTx { implicit session: DBSession =>
// perform ScalikeJdbc SQL query here
}
}
关于scala - 使用多个 ConnectionPool 的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49692727/
我们有一个 Web 服务器,它使用单个连接字符串连接到数据库,这使其成为能够使用连接池的有力候选者。 我们需要一个还是多个 SqlConnection 对象? 即我们应该在共享内存中设置一个连接并每次
我们有一个 Web 服务器,它使用单个连接字符串连接到数据库,这使得它成为能够使用连接池的有力候选者。 我们需要一个 SqlConnection 对象还是多个? 即我们应该在共享内存中建立一个连接,并
在 VB.Net Windows 服务中,我目前正在使用以下工作单元: ThreadPool.QueueUserWorkItem(operation, nextQueueID) 在每个工作单元(或为
在我的应用程序中,我必须与多个 MySQL 交互(只读) DB 一个一个。对于每个数据库,我需要一定数量的连接。与数据库的交互不会一次性发生:我查询数据库,花一些时间处理结果,再次查询数据库,再次处理
我正在使用 tomcat 7 和 tomcat jdbc 连接池来分配 mysql 连接。 在夜间,我们没有任何事件,因此所有连接空闲时间超过 8 小时,并被 mysql 删除。 (mysql 的 w
我在尝试使用 mechanize 抓取网站时遇到此错误。 这是我的代码: agent = Mechanize.new agent.user_agent_alias = 'Mac Safari' age
Redis 连接池的字符集有问题(想处理字符串,而不是字节)。 如果我像这样连接到 Redis: r = redis.StrictRedis(host="localhost", port=6379,
我们正在 AWS 中运行一个海王星数据库。我们有 1 个作者和 3 个读者实例。几周前,我们发现负载平衡没有按预期工作。我们发现,我们的软件实例只连接到一个阅读器,并保持这种连接直到 EOL。所以其他
根据 OrientDB 官方文档,我应该使用以下代码使用对象 API 创建连接池。 // OPEN THE DATABASE OObjectDatabaseTx db= OObjectDatabase
我正在关注“Grails 2 - 快速入门指南”一书中名为 TekDays 的 Grails 应用程序开发。当我开始配置 DataSource 时,我遇到了建立数据库连接的问题。我不知道是什么原因,因
我遇到一个连接池问题,它很快就会耗尽。基本上我已经在应用程序中加载了一个监听器,每当初始化上下文时,计时器就会启动,其中的计时器任务将执行 SQL 查询,该查询使用连接池“我在 Tomcat 6 中复
我正在 Dart 中创建一个后端服务器应用程序,它使用 MySQL 数据库来存储数据。为了进行 SQL 调用,我使用了 SqlJocky 的 ConnectionPool。 应用启动时我做了什么: 创
我是 Grails 新手。在 Datasource.groovy 中进行一些基本配置后,我的 grails 应用程序无法启动。我收到以下错误 Error 2015-07-03 15:27:19,014
我有一个 Web 应用程序,它使用 JNDI 查找来连接到数据库。 连接工作正常并且返回查询没有问题。问题是连接没有正确关闭并停留在“ sleep ”模式(根据 mysql 管理员的说法)。这意味着它
我正在使用 ConnectionPool check out /检入数据库连接。 因此,如果没有异常,一切都会按预期进行。最后 checkin 连接。 但是,如果包含 with_connection
我正在尝试让我的 Rails 应用程序使用 Resque 来管理工作人员。但是,我想继续使用 ConnectionPool gem。 我在初始化程序中有这个: puts ENV["REDISTOGO_
我正在重构一个最初在 20 世纪 90 年代中期设计的遗留系统。那时候,JDBC 连接是一种稀缺资源,没有可靠的连接池实现,因此连接会被尽可能长时间地保留。这导致了如下结构: class Client
如果关闭javax.sql.connectionpooled连接,它不会在数据库中留下任何非 Activity session 。在我的例子中,我可以在数据库(oracle)中看到许多非 Activi
我无法在 rPi 上运行 ScadaLTS。 Aug 17, 2017 7:01:14 AM org.apache.catalina.startup.ClassLoaderFactory valida
在谷歌搜索了一整天后,我看到了很多关于这个问题的讨论,甚至是一个据说可以解决问题的指南[1],但直到现在我还没有找到解决方案。我想配置我的 web 服务,它依赖于 hibernate 3 来使用在我的
我是一名优秀的程序员,十分优秀!