下面开始对“Java 数据库连接池 Tomcat介绍”的攻略进行详细讲解。
一、什么是数据库连接池
在应用中,每次向数据库请求都会建立一个与数据库的连接。但是频繁地打开和关闭连接会给数据库服务器带来额外的负荷,造成系统性能下降。而使用连接池技术,可以在应用启动时就预先创建一组数据库连接,放入连接池中。当需要使用数据库连接时,就从连接池中取出一个连接,使用完后再将其放回连接池以供下次使用,减少连接的创建和关闭次数,提高系统的性能和稳定性。
二、Tomcat中的数据库连接池
Tomcat是一个流行的Web应用服务器,它内置了一个高性能的数据库连接池组件,即 Tomcat JDBC Pool。
1. 配置Tomcat JDBC Pool
首先,在Tomcat目录下的conf/server.xml文件中,可以通过在GlobalNamingResources标签内添加Resource标签来定义数据源连接池配置,例如:
<GlobalNamingResources>
<Resource name="jdbc/TestDB" auth="Container"
type="javax.sql.DataSource" driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/test" username="root" password="root"
maxTotal="20" maxIdle="10" maxWaitMillis="-1"/>
</GlobalNamingResources>
其中,name属性是数据源的JNDI名称,也可以理解为数据源的别名;auth属性为Container表示在Web容器中鉴别用户;type属性为javax.sql.DataSource,表示使用数据源;driverClassName属性是要使用的JDBC驱动程序的完全限定类名;url属性是连接数据库的URL;username和password分别表示连接数据库的用户名和密码。maxTotal、maxIdle和maxWaitMillis属性用来控制连接池的行为。maxTotal表示连接池中创建的最大活动连接数,maxIdle表示连接池中维护的最大空闲连接数,maxWaitMillis表示等待连接的最大时间(单位为毫秒),-1表示无限等待。
2. 在Web应用中使用连接池
接下来,在应用程序代码中可以通过JNDI查找方式来获得数据源连接池,例如:
Context initCtx = new InitialContext();
Context envCtx = (Context) initCtx.lookup("java:comp/env");
DataSource ds = (DataSource) envCtx.lookup("jdbc/TestDB");
Connection conn = ds.getConnection();
其中,InitialContext用于获得JNDI上下文,envCtx用于获得与环境相关的上下文,DataSource用于连接池对象,getConnection()方法用于获取一个数据库连接。
3. 示例说明
通过以下示例程序,可以演示如何在Tomcat中使用数据库连接池:
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.sql.DataSource;
public class TestServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
Context initCtx;
Context envCtx;
DataSource ds;
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try {
initCtx = new InitialContext();
envCtx = (Context) initCtx.lookup("java:comp/env");
ds = (DataSource) envCtx.lookup("jdbc/TestDB");
conn = ds.getConnection();
stmt = conn.createStatement();
rs = stmt.executeQuery("SELECT * FROM user");
out.println("<html><body><h2>用户列表</h2><table>");
while (rs.next()) {
out.println("<tr><td>" + rs.getInt("id") + "</td><td>" + rs.getString("name") + "</td></tr>");
}
out.println("</table></body></html>");
} catch (NamingException | SQLException e) {
e.printStackTrace();
} finally {
try {
if (rs != null) rs.close();
if (stmt != null) stmt.close();
if (conn != null) conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
在此示例中,TestServlet通过JNDI查找方式获取数据源连接池。然后使用Connection、Statement和ResultSet等API访问数据库,输出用户列表。当程序执行完后,会自动将Connection、Statement和ResultSet等资源关闭,以便下一次使用。
另外,在server.xml文件中可以修改连接池的各种配置参数,以适应应用的需要。例如增加maxConnLifetimeMillis属性来设置连接最大生存时间,还可以配置监控等功能。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java 数据库连接池 Tomcat介绍 - Python技术站