我想知道在Play中执行非阻塞JDBC查询的最佳方式(推荐,批准等)!Play的连接池(如果需要的话,在Scala和PostgreSQL中)连接应用程序?我知道JDBC本身肯定是阻塞的,但是肯定有一些方法可以在单独的线程中进行调用(例如,使用期货或参与者),以避免阻塞调用线程。
假设我决定将这些调用包装在Future中,应该使用哪个执行上下文,即Play的默认上下文?还是最好创建单独的执行上下文来处理数据库查询?
我知道有一些类似postgresql-async的库,但是我真的很想了解机制:)
据我所知,这是Java中双重检查锁定模式的正确实现(自Java 5起):
class Foo {
private volatile Bar _barInstance;
public Bar getBar() {
if (_barInstance == null) {
synchronized(this) { // or synchronized(someLock)
if (_barInstance == null) {
Bar newInstance = new Bar();
// possible additional initialization
_barInstance = newInstance;
}
}
}
return _barInstance;
}
}
Run Code Online (Sandbox Code Playgroud)
我想知道是否缺少volatile是一个严重的错误或只是一个轻微的不完美与可能的性能缺陷假设_barInstance只通过访问getBar.
我的想法如下:synchronized介绍发生在之前的关系.初始化的线程_barInstance将其值写入主存储器,离开同步块.因此,_barInstance即使不是,也不会进行双重初始化volatile:其他线程null在其本地副本中有_barInstance(true在第一次检查中获取),但在进入同步后必须在第二次检查中从主存储器中读取新值阻止(获取false并不重新初始化).所以唯一的问题是每个线程的锁定获取过多.
据我所知,它在CLR中是正确的,我相信它在JVM中也是正确的.我对吗?
谢谢.
我正在尝试将一个非常简单的窗口函数应用于 Apache Flink 中的有限数据流(本地,无集群)。这是示例:
val env = StreamExecutionEnvironment.getExecutionEnvironment
env
.fromCollection(List("a", "b", "c", "d", "e"))
.windowAll(TumblingProcessingTimeWindows.of(Time.seconds(1)))
.trigger(ProcessingTimeTrigger.create)
.process(new ProcessAllWindowFunction[String, String, TimeWindow] {
override def process(context: Context, elements: Iterable[String], out: Collector[String]): Unit = {
out.collect(elements.toList.sorted.toString())
}
})
.print()
env.execute()
Run Code Online (Sandbox Code Playgroud)
在这里,我尝试将在一秒钟内到达窗口的所有元素分组,然后只打印这些组。
我假设所有元素都将在不到一秒的时间内生成并进入一个窗口,因此print(). 但是,当我运行它时,根本没有打印任何内容。
如果我删除所有窗口的东西,比如
val env = StreamExecutionEnvironment.getExecutionEnvironment
env
.fromCollection(List("a", "b", "c", "d", "e"))
.print()
Run Code Online (Sandbox Code Playgroud)
我看到运行后打印的元素。我也用文件源试过这个,没有区别。
我机器上的默认并行度是 6。如果我试验并行度和延迟的级别,像这样
val env = StreamExecutionEnvironment.createLocalEnvironment(2)
env
.fromCollection(List("a", "b", "c", "d", "e"))
.map { x => Thread.sleep(1500); x }
Run Code Online (Sandbox Code Playgroud)
我能够将一些——不是全部——元素分组,然后打印出来。
我的第一个假设是源的完成速度远快于 …
我希望我的一个Akka演员执行长时间运行的阻塞任务(在一个很长的字符串中查找子字符串,作为示例).演员的哲学(不阻挡其他演员等)后我该如何做?
我正在考虑在一个单独的线程中运行这个actor PinnedDispatcher,但我不确定.