在 Play 2 中使用数据库调度程序线程池时出错。6.X

Got errors when use a database dispatcher thread-pool in Play 2.6.X

我正在使用 Play 框架 2.6.12 进行 CRUD 练习。 不知何故,当我 运行 对数据模型进行测试时,记录已成功插入数据库,但出现如下错误:

[error] i.e.s.t.TransactionManager - NotifyOfCommit failed. L2 Cache potentially not notified.
java.util.concurrent.RejectedExecutionException: Task io.ebeaninternal.server.transaction.PostCommitProcessing$$Lambda2/1466216168@39a29ab4 rejected from java.util.concurrent.ThreadPoolExecutor@7f63572[Terminated, pool size = 0, active threads = 0, queued tasks = 0, completed tasks = 0]
    at java.util.concurrent.ThreadPoolExecutor$AbortPolicy.rejectedExecution(ThreadPoolExecutor.java:2063)
    at java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:830)
    at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1379)
    at io.ebeaninternal.server.lib.DaemonExecutorService.execute(DaemonExecutorService.java:41)
    at io.ebeaninternal.server.core.DefaultBackgroundExecutor.execute(DefaultBackgroundExecutor.java:36)
    at io.ebeaninternal.server.transaction.TransactionManager.notifyOfCommit(TransactionManager.java:338)
    at io.ebeaninternal.server.transaction.JdbcTransaction.notifyCommit(JdbcTransaction.java:927)
    at io.ebeaninternal.server.transaction.JdbcTransaction.flushCommitAndNotify(JdbcTransaction.java:984)
    at io.ebeaninternal.server.transaction.JdbcTransaction.commit(JdbcTransaction.java:1031)
    at io.ebeaninternal.server.transaction.TransactionMap$State.commit(TransactionMap.java:82)

谁能告诉我为什么?

这是我的环境:

还有我的 application.conf 文件:

## Database configuration
db {
  default.driver=com.mysql.jdbc.Driver
  default.url="jdbc:mysql://localhost/crud"
  default.username=root
  default.password="Pa55word"
}

## Ebean default server
ebean.default = ["models.*"]

## Public Assets
play.assets {
  path = "/public"
  urlPrefix = "/assets"
}

# Number of database connections
fixedConnectionPool = 9

# Set Hikari to fixed size
play.db {
  prototype {
    hikaricp.minimumIdle = null ##${fixedConnectionPool} or null
    hikaricp.maximumPoolSize = 9 ##${fixedConnectionPool}
  }
}

# Job queue sized to HikariCP Connection Pool
database.dispatcher {
  executor = "thread-pool-executor"
  throughput = 1
  thread-pool-executor {
    fixed-pool-size = 9 ##${fixedConnectionPool}
  }
}

我配置有误吗?

以下是我的练习代码

Class 人:

package models;

import io.ebean.Finder;
import io.ebean.Model;
import play.data.validation.Constraints;
import javax.persistence.Entity;
import javax.persistence.Id;

@Entity
public class Person extends Model{

    @Id
    public Long id;

    @Constraints.Required
    public String name;

    public static final Finder<Long, Person> find = new Finder<>(Person.class);

    public Person(String name){
        this.name = name;
    }
}

Class PersonRepository:

package repository;

import io.ebean.*;
import models.Person;
import play.db.ebean.EbeanConfig;
import javax.inject.Inject;
import java.util.concurrent.CompletionStage;
import static java.util.concurrent.CompletableFuture.supplyAsync;

public class PersonRepository {

    private final EbeanServer ebeanServer;
    private final DatabaseExecutionContext dbec;

    @Inject
    public PersonRepository(EbeanConfig ebeanConfig,
                            DatabaseExecutionContext dbec){
        this.ebeanServer = Ebean.getServer(ebeanConfig.defaultServer());
        this.dbec = dbec;
}

public CompletionStage<Long> insert(Person person){
    return supplyAsync(() -> {
        ebeanServer.insert(person);
        return System.currentTimeMillis(); //just for test
    }, dbec);
}

}

Class 数据库执行上下文:

package repository;

import akka.actor.ActorSystem;
import play.libs.concurrent.CustomExecutionContext;
import javax.inject.Inject;

public class DatabaseExecutionContext extends CustomExecutionContext{

    @Inject
    public DatabaseExecutionContext(ActorSystem actorSystem){
        super(actorSystem, "database.dispatcher");
    }
}

和测试代码:

import models.Person;
import org.junit.Test;
import play.test.WithApplication;
import repository.PersonRepository;

public class ModelTest extends WithApplication{

    @Test
    public void createPersons(){
        final PersonRepository repo = app.injector().instanceOf(PersonRepository.class);

        Person p1 = new Person("Tom");
        repo.insert(p1);

        Person p2 = new Person("John");
        repo.insert(p2);

        Person p3 = new Person("Peter");
        repo.insert(p3);
    }
}

请帮助我,在此先感谢。

原来我的 build.sbt 文件中有错误。 我曾经像这样声明库依赖项:

libraryDependencies ++= Seq(guice, jdbc, ..., ehcache)

但是在我删除 "ehcache" 之后,错误消失了,好像有库冲突。