我使用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)
有人可以告诉我为什么吗?
这是我的环境:
我的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);
}
}
请提前帮助我。
答案 0 :(得分:0)
原来我的build.sbt文件中有错误。 我曾经像这样声明库依赖:
libraryDependencies ++= Seq(guice, jdbc, ..., ehcache)
但在我删除“ehcache”后,错误消失了,似乎存在库冲突。