小编Iva*_*nko的帖子

在Play中以非阻塞方式使用JDBC的选项有哪些?

我想知道在Play中执行非阻塞JDBC查询的最佳方式(推荐,批准等)!Play的连接池(如果需要的话,在Scala和PostgreSQL中)连接应用程序?我知道JDBC本身肯定是阻塞的,但是肯定有一些方法可以在单独的线程中进行调用(例如,使用期货或参与者),以避免阻塞调用线程。

假设我决定将这些调用包装在Future中,应该使用哪个执行上下文,即Play的默认上下文?还是最好创建单独的执行上下文来处理数据库查询?

我知道有一些类似postgresql-async的库,但是我真的很想了解机制:)

scala jdbc playframework

5
推荐指数
1
解决办法
2134
查看次数

Java中的双重检查锁定中的volatile

据我所知,这是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中也是正确的.我对吗?

谢谢.

java multithreading

4
推荐指数
1
解决办法
308
查看次数

处理时间窗口不适用于 Apache Flink 中的有限数据源

我正在尝试将一个非常简单的窗口函数应用于 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)

我能够将一些——不是全部——元素分组,然后打印出来。

我的第一个假设是源的完成速度远快于 …

apache-flink flink-streaming

2
推荐指数
1
解决办法
913
查看次数

与Akka的演员一起长期阻止任务

我希望我的一个Akka演员执行长时间运行的阻塞任务(在一个很长的字符串中查找子字符串,作为示例).演员的哲学(不阻挡其他演员等)后我该如何做?

我正在考虑在一个单独的线程中运行这个actor PinnedDispatcher,但我不确定.

scala akka

1
推荐指数
1
解决办法
1353
查看次数