一种常见的做法是将这个东西配置成一个 DataSource
,放在相关的servlet容器中。这将为您提供连接池设施,大大提高性能。还有一种常见的做法是将原始设置外部化到某个配置文件中,并将其放置在类路径中。
如果您使用的是Tomcat作为 servlet 容器,那么您需要按照其JNDI文档中的说明来配置数据源。您会发现有几种方法可用。最简单的方法是在您的动态 Web 项目的 webcontent 中创建一个 /META-INF/context.xml
文件(要清楚的是,/META-INF
与 webapp 的 /WEB-INF
在同一级别),并填写如下内容:
<?xml version="1.0" encoding="UTF-8"?>
<Context>
<Resource
name="jdbc/db" type="javax.sql.DataSource"
maxActive="100" maxIdle="30" maxWait="10000"
url="jdbc:mysql://hostname.com/db"
driverClassName="com.mysql.jdbc.Driver"
username="user" password="pass"
/>
</Context>
这大致意味着Tomcat服务器应该使用JNDI名称为jdbc/db
创建一个数据源,最多可以有100个活动连接、30个空闲连接以及最长等待时间为10000毫秒,超过这个时间连接将会被您的应用程序关闭(实际上:由您的应用程序关闭连接,所以您的应用程序在获取连接和关闭连接之间有10秒的时间)。其余的设置对您来说应该很熟悉并且足够自解释;那些是JDBC的设置。
最后,在您的Web项目中,编辑文件/WEB-INF/web.xml
并添加以下条目:
<resource-env-ref>
<resource-env-ref-name>jdbc/db</resource-env-ref-name>
<resource-env-ref-type>javax.sql.DataSource</resource-env-ref-type>
</resource-env-ref>
大致意思是Web应用程序应该使用服务器提供的名为jdbc/db
的数据源。
然后将连接管理器更改为以下内容:
private DataSource dataSource;
public Database(String jndiname) {
try {
dataSource = (DataSource) new InitialContext().lookup("java:comp/env/" + jndiname);
} catch (NamingException e) {
throw new IllegalStateException(jndiname + " is missing in JNDI!", e);
}
}
public Connection getConnection() {
return dataSource.getConnection();
}
将所有的Class.forName(driver)
调用替换为new Database("jdbc/db")
,并将所有的DriverManager.getConnection()
调用替换为database.getConnection()
。如果必要,您可以从某个配置文件(属性文件?)中获取值jdbc/db
。
或者,通过在受容器管理的工件中注入DataSource
,例如 @WebServlet
servlet 类,使用@Resource
注释:
@Resource(name="jdbc/db")
private DataSource dataSource
就这样了。只需使用以上更改部署Web应用程序并运行即可。别忘了将数据库JDBC驱动程序放置在Tomcat/lib
中,或将其路径添加到Tomcat/conf/catalina.properties
的shared.loader
属性中,因为现在加载JDBC驱动程序的责任已经从Web应用程序转移到了服务器上。您还可以在此文章中找到更多提示和其他基本的JDBC/JNDI示例。
另请参阅:
/shared/lib
文件夹。finally
中调用close()
方法。连接池实现本身会负责关闭或释放连接。还请查看上述链接的最后一章节。