如何在 Play Framework 中使用双数据库与 Ebean



我对Play FrameworkEbean都是全新的。我需要将 Play 应用程序配置为使用两个不同的数据库实例,一个用于读取,另一个用于写入。我一直在研究,似乎这是一个反复出现的问题,我已经尝试了我能够找到的所有可能的解决方案,即使是对某人有效但对我不起作用的一次,我肯定做错了什么,因为错误必须做或看起来像classloader

build.sbt

lazy val root = (project in file(".")).enablePlugins(PlayJava, PlayEbean)
val playEbean = "6.0.0"
libraryDependencies ++= Seq(
...
"com.typesafe.play" % "play-ebean_2.13" % playEbean,
...

application.conf

db.default.driver=org.postgresql.Driver
db.default.url="jdbc:postgresql://localhost:5432/db_writer"
db.default.username=username
db.default.password=pass
db.reader.driver=org.postgresql.Driver
db.reader.url="jdbc:postgresql://localhost:5432/db_reader"
db.reader.username=username
db.reader.password=pass
ebean.default = ["models.db_writer.*"]
ebean.reader = ["models.db_reader.*"]
play.ebean.defaultDatasource = "db_writer"

EbeanServerReader

import io.ebean.Ebean;
import io.ebean.EbeanServer;
public class EbeanServerReader {
public static EbeanServer getReader() {
return Ebean.getServer("reader");
}
}

myDaoClass

public class myDaoClass {
private final FetchConfig fetchConfig = new FetchConfig();
private final EbeanServer reader = EbeanServerReader.getReader();
private final Logger logger = LoggerFactory.getLogger(this.getClass());

public PagedList<SomeClass> findAllWithNoLimit(int pageIndex, int pageSize, String type) {
return reader.find(SomeClass.class)
.fetch("path", fetchConfig.lazy(100))
.fetch("path", fetchConfig.lazy(100))
.fetch("path", fetchConfig.lazy(100))
.where()
.eq("propertyName", type)
.order()
.desc("updatedAt")
.setFirstRow(pageIndex * pageSize)
.setMaxRows(pageSize)
.findPagedList();
}

错误跟踪:

1) Error injecting constructor, java.lang.NoClassDefFoundError: Could not initialize class io.ebean.Ebean
at models.myDaoClass.<init>(myDaoClass.java:12)
while locating models.myDaoClass
for the 1st parameter of models.myDaoClass.<init>(myDaoClass.java:33)
while locating models.myDaoClass
1 error
at com.google.inject.internal.InternalProvisionException.toProvisionException(InternalProvisionException.java:226)
at com.google.inject.internal.InjectorImpl$1.get(InjectorImpl.java:1097)
at com.google.inject.internal.InjectorImpl.getInstance(InjectorImpl.java:1131)
at play.api.inject.guice.GuiceInjector.instanceOf(GuiceInjectorBuilder.scala:436)
at play.api.inject.guice.GuiceInjector.instanceOf(GuiceInjectorBuilder.scala:431)
at play.api.inject.ContextClassLoaderInjector.$anonfun$instanceOf$2(Injector.scala:119)
at play.api.inject.ContextClassLoaderInjector.withContext(Injector.scala:128)
at play.api.inject.ContextClassLoaderInjector.instanceOf(Injector.scala:119)
at play.api.libs.concurrent.ActorRefProvider.$anonfun$get$1(Akka.scala:268)
at akka.actor.TypedCreatorFunctionConsumer.produce(IndirectActorProducer.scala:91)
at akka.actor.Props.newActor(Props.scala:226)
at akka.actor.ActorCell.newActor(ActorCell.scala:613)
at akka.actor.ActorCell.create(ActorCell.scala:640)
... 9 common frames omitted
Caused by: java.lang.NoClassDefFoundError: Could not initialize class io.ebean.Ebean
at module.EbeanServerReader.getReader(EbeanServerReader.java:8)

我在这里做错了什么?我尝试过其他东西,比如@Inject但是一样的。

亲切问候

通过替换解决的问题:

ebean.default = ["models.db_writer.*"]
ebean.reader = ["models.db_reader.*"]

有了这个:

ebean.default = ["models.*"]
ebean.writer = ["models.*"]

因为我的应用程序使用相同的class model只是不同的db实例,一个用于读取,另一个用于写入。

最新更新