我希望这是一个愚蠢的事情.但我一直盯着它看太久了.
我在Linux上升级到Tomcat 7(从6开始),它忽略了我的context.xml文件.如果我在server.xml中包含Context(数据源),它可以正常工作.但我想最终从server.xml中获取这些东西.
我使用分离的上下文在Windows/Eclipse中运行Tomcat 7,它运行正常.
我尝试过Host copyXML参数.即使它确实复制了context.xml,它也不会使用它...除非我将它包含在server.xml中的Host中.当它失败时,它抱怨它无法获得我的MySQL连接:"无法获得连接,DataSource无效"
我确定配置的其余部分很好,因为当我将它粘贴到server.xml时它可以工作...
有人可以指出我错过了什么吗?不应该这么困难.谢谢!
顺便说一句:在CentOS 5.9(64)上,它是简单的Tomcat7(不是rpm),JDK-7u11.
位置:
/var/webapps/shop1
query.jsp
/var/webapps/shop1/META-INF
context.xml
Run Code Online (Sandbox Code Playgroud)
在server.xml中:
<Host name="dev3.domain.net" appBase="/var/webapps"
unpackWARs="true" autoDeploy="true">
<Context docBase="shop1" path="" reloadable="true" />
</Host>
Run Code Online (Sandbox Code Playgroud)
context.xml中:
<?xml version="1.0" encoding="UTF-8"?>
<Context>
<Resource name="jdbc/shop1db" auth="Container"
type="javax.sql.DataSource"
factory="org.apache.commons.dbcp.BasicDataSourceFactory"
maxActive="50" maxIdle="25" maxWait="10000"
username="user" password="pass"
driverClassName="com.mysql.jdbc.Driver"
validationQuery="SELECT 1"
url="jdbc:mysql://localhost/shop1"
logAbandoned="true" removeAbandoned="true" removeAbandonedTimeout="60"
/>
</Context>
Run Code Online (Sandbox Code Playgroud)
在web.xml中:
<context-param>
<param-name>javax.servlet.jsp.jstl.sql.dataSource</param-name>
<param-value>jdbc/shop1db</param-value>
</context-param>
Run Code Online (Sandbox Code Playgroud) 我通过JNDI资源使用tomcat连接池.
在context.xml:
<Resource name="jdbc/mydb" auth="Container" type="javax.sql.DataSource"
username="root" password="root" driverClassName="com.mysql.jdbc.Driver"
maxActive="1000" maxIdle="100" maxWait="10000"
url="jdbc:mysql://localhost:3306/mydatabase"
factory="org.apache.tomcat.jdbc.pool.DataSourceFactory" />
Run Code Online (Sandbox Code Playgroud)
在web.xml:
<resource-ref>
<description>DB Connection</description>
<res-ref-name>jdbc/mydb</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
Run Code Online (Sandbox Code Playgroud)
从我需要数据库连接的java类中,我执行以下查找:
Context initContext = new InitialContext();
DataSource ds = (DataSource)initContext.lookup("java:/comp/env/jdbc/mydb");
Run Code Online (Sandbox Code Playgroud)
我的第一个疑问是DataSource类型.是否使用相同javax.sql.DataSource或org.apache.tomcat.jdbc.pool.DataSource?
而且,有时我会收到"Too many connections"错误.我已经阅读了很多有关此问题的stackoverflow问题/答案,但我没有成功地理解问题所在.
我已经关注了tomcat文档,并且我正确地关闭了结果集,语句和连接.
编辑
我的tomcat版本是7.0.26.所以应该有一个bug(参见informatik01用户建议的链接)
我有一个部署到Tomcat 7.0.22的最小Spring Web应用程序 - 它包含几个页面,一个控制器,一个服务和一个DAO,它有一个运行SELECT查询的方法.
webapp配置为使用新的Tomcat JDBC连接池 - 这是webapp的context.xml中的资源配置:
<Resource name="jdbc/myDB"
auth="Container"
type="javax.sql.DataSource"
driverClassName="oracle.jdbc.OracleDriver"
url="jdbc:oracle:thin:@blah blah"
factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
maxActive="15"
initialSize="5"
maxWait="40000"
validationQuery="select 1 from dual"
removeAbandoned="true"
removeAbandonedTimeout="300"
logAbandoned="false"
username="user"
password="pass"
testOnBorrow="true"
validationInterval="30000"
timeBetweenEvictionRunsMillis="60000"
minEvictableIdleTimeMillis="60000" />
Run Code Online (Sandbox Code Playgroud)
当我部署webapp时,我看到出现了5个连接(从SQL Developer查询v $ session).当我取消部署webapp时,连接仍然存在(状态为WAITING).每次重新部署我的webapp时,都会显示5个新连接.
看来游泳池仍在闲逛 - 而Tomcat经理应用程序中的"Find Leaks"按钮告诉我应用程序正在泄漏内存.
取消部署webapp时如何摆脱池?