我有一个使用Tomcat和Hibernate + c3p0的完美工作webapp。 我正在以编程方式配置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”)我正确获取路径: 罐子:文件:/ C:!/apache-tomcat-7.0.29/webapps/MyApp/WEB-INF/lib/MyJar.jar /a/b/c/HibernateConnector.class
因为我在请求getClass()时删除了c3p0并配置了Tomcat连接池.getResource(/ a / b / model)我得到文件:/ C:/apache-tomcat-7.0.29/work/Catalina/localhost / MyApp的/装载器/ A / b /模型
我没有碰到任何关于加载的代码,所以很明显新配置会发生一些奇怪的事情。有没有人知道如何解决这个问题?为什么路径会变成工作/卡塔利娜......?
很抱歉很长的帖子,并提前致谢!!
以下是我使用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>
context.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");
答案 0 :(得分:0)
在经历了很多关于类加载器的资源以及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>
希望这有助于将来。