【发布时间】:2016-08-21 12:27:32
【问题描述】:
编辑:虽然给出并授予了(好的)答案,但这仅涵盖了我的问题中相当不重要的部分。这个问题的主要部分仍然悬而未决。
我在一个云项目中使用 EclipseLink (2.6.2)。该项目是一个打包为WAR 文件并部署在Apache Tomcat 8 上的Web 应用程序。持久性上下文是使用Java 代码设置的,其中我使用entityManagerFactoryBean.setPackagesToScan(packagesToScan) 指定要使用的实体。此配置通常按预期工作,在其中找到指定包中的实体类。
我现在无法理解何时使用哪个类加载器,尤其是在考虑 Tomcat、运行测试和使用不同的连接池实现时。
在包括 Tomcat 连接池的 Apache Tomcat 上运行时,DataSource 实例是使用 spring-cloud-connector 插件 (spring-cloud-spring-service-connector) 创建的。
在此设置中,只要我不按如下所述更改类加载器,一切都会按预期工作(否则我将面对实体类的ClassNotFoundExceptions)。
在JUnit 和spring-test 的帮助下运行单元测试时,DataSource 实例是使用内存数据库 H2 创建的(使用来自spring-jdbc 的EmbeddedDatabaseBuilder)。在此设置中,我必须指定 JPA 以使用用于 DataSource 实例的类加载器(JPA 属性映射中的键 eclipselink.classloader),否则我会得到“Object ... is not a known Entity type”。
在嵌入式 Apache Tomcat 8 中运行测试时,我没有看到任何指示正在使用的连接池的消息。在此设置中,我还必须将类加载器设置为单元测试。
如果我将commons-dbcp (2.1.1) 添加到我的项目并显式配置spring-cloud-connector 插件以使用它而不是Tomcat 的连接池,我可以在不配置类加载器的情况下在Tomcat 上运行应用程序,但它也可以工作使用上述类加载器规范。
对于测试,commons-dbcp 与上述场景相比没有任何变化(因为未使用相应的配置)。
总结:
- Tomcat (Tomcat CP):仅使用未修改的 JPA 类加载器
- Tomcat (DBCP):两种变体
- 测试:仅使用
DataSource的 JPA 类加载器
您能帮我理解这里的区别,并提出一个适用于所有情况的简单解决方案吗?我假设 DBCP 和 Spring 使用与 Tomcat(和 Tomcat 的连接池)不同的类加载器。
如果您需要更多信息,我很乐意添加。
编辑:我添加了一个示例项目,其中包含有关如何重现的大型 README。
【问题讨论】:
-
我不明白你的问题。您的问题混合了数据源、连接池和服务发现 (spring-cloud-service-*)。我认为您最好使用 github 中的简单项目创建案例研究并在此处询问您的确切问题。
-
@xsalefter 我添加了一个带有一些文档的示例项目。谢谢你的建议。
-
刚刚发现为什么你的 tomcat:run 不能与你的 CloudDatabaseConfig 一起工作。您需要在 tomcat7-maven-plugin 上配置 postgresql 依赖项。我现在会尝试找到其他错误。
-
@fhofmann 实际上它可以工作,只是不是在所有配置变体中。 “配置postgresql依赖”是什么意思?
标签: java jpa eclipselink classloader apache-commons-dbcp