java - getClass().getResource + Tomcat + hibernate

标签 java hibernate tomcat resources

我有一个完美运行的网络应用程序,它使用 Tomcat 和 Hibernate + c3p0。 我正在以编程方式配置 hibernate ,使用 getClass().getResource(/a/b/model) 加载模型类并添加带注释的类。

现在,我被要求更改 c3p0 并改用 Tomcat JDBC 连接池。我关注了几篇文章,显然一切都设置正确。现在的问题是我在尝试加载模型类和配置 hibernate 时遇到错误。

配置 hibernate 的类 (HibernateConnector.class) 位于 webapps\MyApp\WEB-INF\lib\MyJar.jar 中的 jar (MyJar) 中。

如果我执行 getClass().getResource("HibernateConnector.class") 我会正确获取路径: jar:file:/C:/apache-tomcat-7.0.29/webapps/MyApp/WEB-INF/lib/MyJar.jar!/a/b/c/HibernateConnector.class

因为我在请求 getClass().getResource(/a/b/model) 时删除了 c3p0 并配置了 Tomcat 连接池,所以我得到了文件:/C:/apache-tomcat-7.0.29/work/Catalina/localhost/MyApp/loader/a/b/模型

我没有触及任何有关加载的代码,因此显然新配置发生了一些奇怪的事情。有没有人知道如何解决这个问题?为什么路径会变成 work/Catalina.....?

抱歉发了这么长的帖子,提前致谢!!


以下是我为使用 Tomcat 连接池所做的更改。 在 web.xml 中我添加了:

<resource-ref>
 <description>This is a MySQL database connection</description>
 <res-ref-name>jdbc/myDb</res-ref-name>
 <res-type>javax.sql.DataSource</res-type>
 <res-auth>Container</res-auth>
</resource-ref>

上下文.xml:

<Context antiJARLocking="true" path="MyApp">
<Resource auth="Container" driverClassName="com.mysql.jdbc.Driver" maxActive="30" maxIdle="10" maxWait="10000" name="jdbc/myDb" password="pass"
type="javax.sql.DataSource" url="jdbc:mysql://localhost/myDb" username="user"/>
</Context>

并以编程方式配置 Hibernate:

props.put("hibernate.connection.datasource", "java:comp/env/jdbc/myDb");
props.put("hibernate.dialect", "org.hibernate.dialect.MySQLDialect");

最佳答案

在浏览了大量有关类加载器和 tomcat 加载所有内容的方式的资源之后,我找不到任何对我的问题特别有用的东西(尽管我确实在这个主题上学到了很多东西)。

无论如何,我开始浏览 Tomcat 的文档,了解我在上面的问题中列出的每个 Web 应用程序上下文 XML 文件。

我将 antiJARLocking=true 切换为 antiResourceLocking=true,我认为某些东西被锁定了,我需要更广泛的反锁定工作。通过该设置,我能够运行我的应用程序。但是 antiResourceLocking 会对启动时间产生显着的负面影响,所以为了尝试我删除了该属性(均默认为 false),这也奏效了!!! :-D。

我的 context.xml 结束时看起来像这样:

<Context path="MyApp">
   <Resource auth="Container" driverClassName="com.mysql.jdbc.Driver" maxActive="30" maxIdle="10"    maxWait="10000" name="jdbc/myDb" password="pass" type="javax.sql.DataSource" url="jdbc:mysql://localhost/myDb" username="user"/>
</Context>

希望这对以后的人有帮助。

关于java - getClass().getResource + Tomcat + hibernate ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12105054/

相关文章:

java : if i create new object on each request do i need threads still?

java - JBoss 5.1.0 添加队列

spring - 带有可选参数的 jpa 查询

java - 元素类型 "Resource"必须后跟属性规范 ">"或 "/>"

多个 tomcat 中的 session

java - Spring 无法在 Tomcat 类路径中找到属性文件。

java - 无法实例化接收器 : class has no zero argument

java - QueryDSL-maven-您需要使用 JDK 运行构建或在类路径上有 tools.jar

java - 如何在 hibernate 中知道父实体中是否加载了子实体

java - 使用 hibernate 空间查询n公里半径内的所有对象?