Java 如何利用Ebean在Play框架中使用双数据库

Java 如何利用Ebean在Play框架中使用双数据库,java,postgresql,playframework,ebean,Java,Postgresql,Playframework,Ebean,我是全新的Play Framework和Ebean。我需要配置一个Play应用程序来使用两个不同的数据库实例,一个用于读取,另一个用于写入。我一直在寻找,这似乎是一个反复出现的问题,我已经尝试了所有可能的解决方案,我已经能够找到,即使是曾经对某人有效,但对我不起作用,我肯定我做错了什么,因为错误必须做或看起来像与类加载器有关 build.sbt lazy val root = (project in file(".")).enablePlugins(PlayJava, Pla

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

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

公共类myDaoClass{
private final FetchConfig FetchConfig=new FetchConfig();
private final EbeanServer reader=EbeanServer.getReader();
私有最终记录器Logger=LoggerFactory.getLogger(this.getClass());
公共页面列表findAllWithNoLimit(int-pageIndex、int-pageSize、字符串类型){
返回reader.find(SomeClass.class)
.fetch(“路径”,fetchConfig.lazy(100))
.fetch(“路径”,fetchConfig.lazy(100))
.fetch(“路径”,fetchConfig.lazy(100))
.where()
.eq(“propertyName”,类型)
.order()
.desc(“更新数据”)
.setFirstRow(页面索引*页面大小)
.setMaxRows(页面大小)
.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)

1)注入构造函数时出错,java.lang.NoClassDefFoundError:无法初始化类io.ebean.ebean
在models.myDaoClass.(myDaoClass.java:12)
查找models.myDaoClass时
用于models.myDaoClass的第一个参数。(myDaoClass.java:33)
查找models.myDaoClass时
1错误
在com.google.inject.internal.InternalProvisionException.toProvisionException上(InternalProvisionException.java:226)
位于com.google.inject.internal.InjectorImpl$1.get(InjectorImpl.java:1097)
位于com.google.inject.internal.InjectorImpl.getInstance(InjectorImpl.java:1131)
at play.api.inject.guice.GuiceInjector.instanceOf(guiceinjectbuilder.scala:436)
at play.api.inject.guice.GuiceInjector.instanceOf(guiceinjectbuilder.scala:431)
在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)
在akka.actor.TypedCreatorFunctionConsumer.product(IndirectActorProducer.scala:91)
在阿卡。演员。道具。新演员(道具。斯卡拉:226)
在akka.actor.ActorCell.newActor(ActorCell.scala:613)
在akka.actor.ActorCell.create(ActorCell.scala:640)
…省略了9个公共帧
原因:java.lang.NoClassDefFoundError:无法初始化类io.ebean.ebean
位于module.EbeanServerReader.getReader(EbeanServerReader.java:8)
我做错了什么?我尝试过其他东西,比如
@Inject
,但都是一样的。 这是主要思想:我有一个带有两个数据库的同步集群,正如我前面提到的,这是我公司提供给我的当前配置。应用程序模型配置为只在一个数据库中完成所有操作,所以这个思想是应用程序在一个数据库中写入数据,其中一个数据库使用另一个实例,当请求到达应用程序进行fecth时,将从另一个数据库实例执行该提取


通过更换以下部件解决问题:

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

ebean.default = ["models.*"]
ebean.writer = ["models.*"]
因为我的应用程序使用相同的
类模型
只是不同的
db
实例,一个用于读取,另一个用于写入