在Play 2.6.X

时间:2018-03-09 05:14:15

标签: java mysql playframework ebean

我使用Play framework 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$$Lambda$572/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)

有人可以告诉我为什么吗?

这是我的环境:

  • Mac OSX 10.13.3
  • MySQL 5.7.18
  • JDK 1.8
  • JDBC Connector 5.1.42
  • sbt 1.1.1
  • playframework 2.6.12
  • Intellij IDEA

我的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}
  }
}

我的配置是否错误?

以下是我的练习代码。

班主任:

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);
}

}

类DatabaseExecutionContext:

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);
    }
}

请提前帮助我。

1 个答案:

答案 0 :(得分:0)

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

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

但在我删除“ehcache”后,错误消失了,似乎存在库冲突。