Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 创建自定义数据源ClassName_Java_Spring_Hibernate_Playframework_Hikaricp - Fatal编程技术网

Java 创建自定义数据源ClassName

Java 创建自定义数据源ClassName,java,spring,hibernate,playframework,hikaricp,Java,Spring,Hibernate,Playframework,Hikaricp,我有一个使用playFramework、Spring和Hibernate的应用程序,如下所示: 我想用AbstractRoutingDataSource实现多个数据源,因此我有自己的自定义类: package mx; import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource; /** * */ public class MyRouting extends AbstractRoutingData

我有一个使用playFramework、Spring和Hibernate的应用程序,如下所示:

我想用AbstractRoutingDataSource实现多个数据源,因此我有自己的自定义类:

package mx;

import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;

/**
 *
 */
public class MyRouting extends AbstractRoutingDataSource {
    @Override
    protected Object determineCurrentLookupKey() {
        System.out.println("Logic to determine the datasource");
        return "key";
    }
}
但当我尝试在application.conf中设置数据源时,如下所示:
db.routingDS.dataSourceClassName=mx.MyRouting

我得到一份工作

[error] play - Error while stopping the application
play.api.PlayException: Cannot load plugin[An exception occurred during Plugin [com.edulify.play.hikaricp.HikariCPPlugin] initialization]
at play.api.WithDefaultPlugins$$anonfun$plugins$1$$anonfun$apply$9.apply(Application.scala:154) ~[play_2.10-2.3.10.jar:2.3.10]
at play.api.WithDefaultPlugins$$anonfun$plugins$1$$anonfun$apply$9.apply(Application.scala:130) ~[play_2.10-2.3.10.jar:2.3.10]
at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:244) ~[scala-library.jar:0.13.5]
at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:244) ~[scala-library.jar:0.13.5]
at scala.collection.immutable.List.foreach(List.scala:318) ~[scala-library.jar:0.13.5]
Caused by: play.api.Configuration$$anon$1: Configuration error[java.lang.ClassNotFoundException: mx.MyRouting]
at play.api.Configuration$.play$api$Configuration$$configError(Configuration.scala:94) ~[play_2.10-2.3.10.jar:2.3.10]
at play.api.Configuration.reportError(Configuration.scala:743) ~[play_2.10-2.3.10.jar:2.3.10]
at com.edulify.play.hikaricp.HikariCPDBApi$$anonfun$2.apply(HikariCPDBApi.scala:64) ~[play-hikaricp_2.10-2.0.6.jar:2.0.6]
at com.edulify.play.hikaricp.HikariCPDBApi$$anonfun$2.apply(HikariCPDBApi.scala:44) ~[play-hikaricp_2.10-2.0.6.jar:2.0.6]
at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:244) ~[scala-library.jar:0.13.5]
Caused by: java.lang.RuntimeException: java.lang.ClassNotFoundException: mx.MyRouting
at com.zaxxer.hikari.util.UtilityElf.createInstance(UtilityElf.java:120) ~[HikariCP-2.3.8.jar:na]
at com.zaxxer.hikari.pool.PoolUtilities.initializeDataSource(PoolUtilities.java:102) ~[HikariCP-2.3.8.jar:na]
at com.zaxxer.hikari.pool.BaseHikariPool.<init>(BaseHikariPool.java:156) ~[HikariCP-2.3.8.jar:na]
at com.zaxxer.hikari.pool.HikariPool.<init>(HikariPool.java:60) ~[HikariCP-2.3.8.jar:na]
at com.zaxxer.hikari.pool.HikariPool.<init>(HikariPool.java:48) ~[HikariCP-2.3.8.jar:na]
Caused by: java.lang.ClassNotFoundException: mx.MyRouting
at java.net.URLClassLoader$1.run(URLClassLoader.java:372) ~[na:1.8.0_25]
at java.net.URLClassLoader$1.run(URLClassLoader.java:361) ~[na:1.8.0_25]
at java.security.AccessController.doPrivileged(Native Method) ~[na:1.8.0_25]
at java.net.URLClassLoader.findClass(URLClassLoader.java:360) ~[na:1.8.0_25]
at java.lang.ClassLoader.loadClass(ClassLoader.java:424) ~[na:1.8.0_25]
[error]播放-停止应用程序时出错
play.api.PlayException:无法加载插件[插件[com.edulify.play.hikaricp.HikariCPPlugin]初始化期间发生异常]
在play.api.WithDefaultPlugins$$anonfun$plugins$1$$anonfun$apply$9.apply(Application.scala:154)~[play_2.10-2.3.10.jar:2.3.10]
在play.api.WithDefaultPlugins$$anonfun$plugins$1$$anonfun$apply$9.apply(Application.scala:130)~[play_2.10-2.3.10.jar:2.3.10]
在scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:244)~[scala library.jar:0.13.5]
在scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:244)~[scala library.jar:0.13.5]
在scala.collection.immutable.List.foreach(List.scala:318)~[scala library.jar:0.13.5]
原因:play.api.Configuration$$anon$1:配置错误[java.lang.ClassNotFoundException:mx.MyRouting]
在play.api.Configuration$.play$api$Configuration$$configError(Configuration.scala:94)~[play_2.10-2.3.10.jar:2.3.10]
在play.api.Configuration.reportError(Configuration.scala:743)~[play_2.10-2.3.10.jar:2.3.10]
在com.edulify.play.hikaricp.HikariCPDBApi$$anonfun$2.apply(HikariCPDBApi.scala:64)~[play-hikaricp_2.10-2.0.6.jar:2.0.6]
在com.edulify.play.hikaricp.HikariCPDBApi$$anonfun$2.apply(HikariCPDBApi.scala:44)~[play-hikaricp_2.10-2.0.6.jar:2.0.6]
在scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:244)~[scala library.jar:0.13.5]
原因:java.lang.RuntimeException:java.lang.ClassNotFoundException:mx.MyRouting
在com.zaxxer.hikari.util.UtilityElf.createInstance(UtilityElf.java:120)~[HikariCP-2.3.8.jar:na]
在com.zaxxer.hikari.pool.PoolUtilities.initializeDataSource(PoolUtilities.java:102)~[HikariCP-2.3.8.jar:na]
在com.zaxxer.hikari.pool.BaseHikariPool.(BaseHikariPool.java:156)~[HikariCP-2.3.8.jar:na]
在com.zaxxer.hikari.pool.HikariPool.(HikariPool.java:60)~[HikariCP-2.3.8.jar:na]
在com.zaxxer.hikari.pool.HikariPool.(HikariPool.java:48)~[HikariCP-2.3.8.jar:na]
原因:java.lang.ClassNotFoundException:mx.MyRouting
在java.net.URLClassLoader$1.run(URLClassLoader.java:372)~[na:1.8.0\u 25]
在java.net.URLClassLoader$1.run(URLClassLoader.java:361)~[na:1.8.0\u 25]
在java.security.AccessController.doPrivileged(本机方法)~[na:1.8.0\u 25]
在java.net.URLClassLoader.findClass(URLClassLoader.java:360)~[na:1.8.0\u 25]
在java.lang.ClassLoader.loadClass(ClassLoader.java:424)~[na:1.8.0_25]
(Im也使用带有HikariCP的db配置)


我还尝试用这个类生成一个jar,结果是一样的,有人知道吗?谢谢

您试图通过直接播放应用程序配置来实现的目标是不可能的。主要问题是,默认情况下,play需要URL和驱动程序来创建数据源(至少在play 2.3和play 2.4中)

换句话说,play期望您总是要创建一个数据源,您将使用一个连接到真实数据库的连接池,而不是RoutingDatasource

由于您使用的是JPA种子,因此需要通过JNDI访问资源,因此需要以某种方式将数据源添加到JNDI中

这是如何实现的:

在application.conf中,仅声明将与数据库交互的数据源。您想要多少就有多少:

# Database configuration
#
db.mydb1.driver=org.h2.Driver
db.mydb1.url="jdbc:h2:mem:play"
db.mydb1.jndiName=DB1DS
db.mydb2.driver=org.h2.Driver
db.mydb2.url="jdbc:h2:mem:play"
db.mydb2.jndiName=DB2DS
现在,在persistence.xml中,确保不声明任何数据源。(既不是jta也不是jta)

最后,正如您所提到的,创建您自己的RoutingDatasource:

public class RoutingDatasource extends AbstractRoutingDataSource {

   @Override
   protected Object determineCurrentLookupKey() {
     return selectRandom("DB1DS","DBDS2");
   }
}

就这些。我希望这有助于解决您的问题。

您能发布整个堆栈跟踪吗?
//This is the routing Datasource in spring context
@Bean
public RoutingDatasource routingDataSource() {
  RoutingDatasource rd = new RoutingDatasource();
  java.util.HashMap ds = new java.util.HashMap();
  ds.put("DB1DS","DB1DS");
  ds.put("DB2DS","DB2DS");
  rd.setTargetDataSources(ds);
  return rd;
}

@Bean
public EntityManagerFactory entityManagerFactory() {
  java.util.Map props = new java.util.HashMap();  
  try{
//This is the magic line.
  ((javax.naming.Context)(new javax.naming.InitialContext())).bind("routingDataSource", ctx.getBean("routingDataSource"));
   }catch(Exception e){}
  props.put("javax.persistence.jtaDataSource", "routingDataSource");
            return Persistence.createEntityManagerFactory(DEFAULT_PERSISTENCE_UNIT,props);
}
public class RoutingDatasource extends AbstractRoutingDataSource {

   @Override
   protected Object determineCurrentLookupKey() {
     return selectRandom("DB1DS","DBDS2");
   }
}