我有一个在 Tomcat 中运行的简单 servlet。因为 servlet 连接到数据库,所以我需要使用连接池。然而,互联网上的所有示例都假定(开发人员)永远不会更改 servlet 连接到的数据库。
例如,这里是一个示例 context.xml 文件。
<?xml version="1.0" encoding="UTF-8"?>
<Context antiJARLocking="true" path="/feeds">
<Resource name="jdbc/TestDB"
auth="Container"
type="javax.sql.DataSource"
factory="org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory"
username="username"
password="password"
driverClassName="org.postgresql.Driver"
url="jdbc:postgresql://example.com:1234/myDB"
maxWait="1000"
removeAbandoned="true"
maxActive="30"
maxIdle="10"
removeAbandonedTimeout="60"
logAbandoned="true"/>
</Context>
在我的例子中,我有一个测试服务器 (postgresql) 和一个生产服务器 (ms sql),所以所有假设我只能在 context.xml 中硬编码设置的教程都行不通。
我有 2 个不同的属性文件用于数据库 url、身份验证等,我使用它们,一个用于测试服务器,一个用于生产服务器,效果很好,但现在如果我想使用连接池,我将如何将其集成到我的 servlet 中?
我希望能够在 Netbeans 6.5 中点击“构建”,在 dist 目录中获取 war,并将其放入任一服务器的 tomcat 应用程序目录中,而不必在新 war 完成后四处更改 xml 文件已部署。 servlet 知道从哪里获取每个系统上的属性文件,因此如果我可以将属性文件与连接池属性集成,我就万事大吉了。
任何想法...?
最佳答案
我把我所有的数据源定义放在tomcat的conf/server.xml文件中,所以war完全独立于数据源。
服务器.xml:
<GlobalNamingResources>
<Resource name="mail/Mail" auth="Container" type="javax.mail.Session"
mail.smtp.host="localhost"/>
<Resource auth="Container" type="javax.sql.DataSource" name="jdbc/lagalerie"
driverClassName="org.postgresql.Driver"
url="jdbc:postgresql://localhost/lagalerie?charSet=LATIN1"
maxActive="100" maxIdle="30" maxWait="10000"
username="casashop" password="casashop"/>
</GlobalNamingResources>
上下文.xml:
<ResourceLink global="jdbc/lagalerie" name="jdbc/lagalerie" type="javax.sql.DataSource"/>
<ResourceLink global="mail/Mail" name="mail/Mail" type="javax.mail.Session"/>
web.xml:
<resource-ref>
<description>The datasource</description>
<res-ref-name>jdbc/DataSource</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
<resource-ref>
<description>The mail session</description>
<res-ref-name>mail/Mail</res-ref-name>
<res-type>javax.mail.Session</res-type>
<res-auth>Container</res-auth>
</resource-ref>
关于tomcat连接池,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/734902/