使用Scala期货进行数据库线程处理(Play2)

时间:2016-08-22 14:31:22

标签: multithreading scala playframework-2.0 orientdb

我正在开发一个Scala Play2应用程序,用于在Scala Play2中查询OrientDB图形。直到今天我还没有打扰索引,所有似乎都工作正常,但现在我启用了一对,我得到了这个错误:

  

play.api.http.HttpErrorHandlerExceptions $$ anon $ 1:执行   exception [[ODatabaseException:数据库实例未在当前设置   线。确保设置它:   ODatabaseRecordThreadLocal.INSTANCE.set(分贝);]]

the documentation我明白数据库对象不是线程安全的,但我不确定如何继续:我的查询是由Play2执行器池异步拾取的,我不确定是否使用threadlocals是一个好主意。司机会阻止吗?如果来自池的不同线程处理数据库连接,驱动程序是否会破坏其状态?在任何情况下,我都希望得到一些比我更了解东方驾驶架构的人的建议:)

1 个答案:

答案 0 :(得分:0)

正如文档和错误所建议的那样,OrientDB驱动程序使用线程本地来隔离自身的线程不安全部分。

这个问题的解决方案是摆脱我当时的简单化设计,并通过在同一个区块内调用的org.apache.tinkerpop.gremlin.orientdb.OrientGraph获得的org.apache.tinkerpop.gremlin.orientdb.OrientGraphFactory#getTx()内运行查询。

我没有调查是否严格要求交易,尽管我不这么认为。