如何在Akka Actor中使用MYSQL jdbc实现
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了如何在Akka Actor中使用MYSQL jdbc实现,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1908字,纯文字阅读大概需要3分钟。
内容图文
嘿,我读了这个jdbc文档
https://www.playframework.com/documentation/2.1.0/ScalaDatabase
这个问题
Is it good to put jdbc operations in actors?
现在,我有一个用于MySQL事务的ActorClass,并且每当请求到来时,该actor都会实例化几次.因此,每个请求都将实例化新演员.连接池安全吗?
我可以用吗
val connection = DB.getConnection()
连接对象可以处理异步事务吗?
因此,我只能单身处理mysql连接,并在所有实例化的actor中使用它.另外,如果要使用anorm,该如何创建隐式连接对象?
谢谢
解决方法:
如果您不想阻止参与者,则DB.getConnection()应该是promise [Connection]或future [Connection]. (答案末尾的小穴)
如果您的DB.getConnection()是同步的(仅返回没有包装类型的连接),您的actor将挂起,直到它在处理实际消息时实际上从池中获得连接为止.无论您的数据库是否为单例,最终都将到达连接池.
话虽如此,您可以创建角色来处理消息传递,并创建其他角色来处理数据库中的持久性,将它们放置在不同的线程分派器中,从而为数据库密集型提供更多线程. PlayFramework也建议这样做.
注意事项:
如果您在actor内运行Future,则无法确保它将运行的线程/定时,我假设您在这些行中做了一些工作(请阅读注释)
def receive = {
case aMessage =>
val aFuture = future(db.getConnection)
aFuture.map { theConn => //from previous line when you acquire the conn and when you execute the next line
//it could pass a long time they run in different threads/time
//that's why you should better create an actor that handles this sync and let
//akka do the async part
theConn.prepareStatemnt(someSQL)
//omitted code...
}
}
所以我的建议是
//actor A receives,
//actor B proccess db (and have multiple instances of this one due to slowness from db)
class ActorA(routerOfB : ActorRef) extends Actor {
def recieve = {
case aMessage =>
routerOfB ! aMessage
}
}
class ActorB(db : DB) extends Actor {
def receive = {
case receive = {
val conn = db.getConnection //this blocks but we have multiple instances
//and enforces to run in same thread
val ps = conn.prepareStatement(someSQL)
}
}
}
您将需要路由:http://doc.akka.io/docs/akka/2.4.1/scala/routing.html
内容总结
以上是互联网集市为您收集整理的如何在Akka Actor中使用MYSQL jdbc实现全部内容,希望文章能够帮你解决如何在Akka Actor中使用MYSQL jdbc实现所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。