一种常见的做法是将其配置为相关servlet container 中的DataSource。它将为您提供连接池设施,这将大大提高性能。还有一种常见的做法是将原始设置外部化到放置在类路径中的某些配置文件中。
如果您使用 Tomcat 作为 servletcontainer,您需要根据其 JNDI documentation 配置数据源。你会看到有几种方法。最简单的方法是在动态 Web 项目的 Web 内容中创建一个 /META-INF/context.xml(需要明确的是,/META-INF 与 Web 应用的 /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-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>
这大致意味着网络应用程序应该使用名称为jdbc/db的服务器提供的数据源。
然后将您的连接管理器更改为以下内容:
private DataSource dataSource;
public Database(String jndiname) {
try {
dataSource = (DataSource) new InitialContext().lookup("java:comp/env/" + jndiname);
} catch (NamingException e) {
// Handle error that it's not configured in JNDI.
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()。如有必要,您可以从某个配置文件 (Properties file?) 中获取值 jdbc/db。
或者,通过@Resource 注释在容器管理的工件中注入DataSource,例如@WebServlet servlet 类:
@Resource(name="jdbc/db")
private DataSource dataSource;
应该是这样的。只需使用上述更改部署您的 Web 应用程序并运行它。不要忘记将数据库 JDBC 驱动程序放在 Tomcat/lib 中,或者将其路径添加到 Tomcat/conf/catalina.properties 的 shared.loader 属性中,因为加载 JDBC 驱动程序的责任现在从 web 应用程序转移到了服务器。如需更多提示和其他基本 JDBC/JNDI 示例,您可能会发现 this article 也很有用。
另见: