当前位置:首页 > 问答 > 正文

Tomcat里头怎么弄SQLServer连接池,配置步骤和实现大概说说

在Tomcat里设置SQL Server连接池,说白了就是告诉Tomcat:“你帮我管着一批到SQL Server数据库的连接,我的程序需要的时候找你拿,用完了还给你,你不用每次都新建一个连接,太麻烦了。” 这样做的好处是速度快,因为建立真实的数据库连接是很耗时的,连接池提前建好一批,随用随取;而且连接池还能管理这些连接,比如检查连接是否还有效,最多允许多少个连接等等。

下面我就说说具体的配置步骤和简单的实现方法,整个过程主要分为两大步:第一是配置Tomcat本身,第二是在你的Web程序里使用这个连接池。

第一步:把SQL Server的“驱动程序”交给Tomcat

Tomcat里头怎么弄SQLServer连接池,配置步骤和实现大概说说

想让Tomcat能和SQL Server对话,首先得把翻译官——也就是JDBC驱动程序——给它,SQL Server的官方驱动程序是一个叫mssql-jdbc的jar包。

  1. 获取jar包:你可以从微软的官方网站(来源:Microsoft Download Center 或 Maven Central Repository)下载最新的mssql-jdbc的jar文件,文件名字可能类似于mssql-jdbc-12.2.0.jre11.jar
  2. 放置jar包:把这个下载好的jar包放到你的Tomcat安装目录下的lib文件夹里,你的Tomcat装在C:\apache-tomcat-9.0.xx,那么就放进去C:\apache-tomcat-9.0.xx\lib,这一步非常关键,相当于给Tomcat服务器装上了连接SQL Server的驱动,放好之后,最好重启一下Tomcat,让它加载这个新的驱动。

第二步:在Tomcat的全局配置文件里“声明”连接池

我们要在Tomcat的配置文件里写下连接池的详细信息,比如数据库地址、用户名、密码、连接数等,这个配置文件是context.xml,这里有个关键点:这个文件有两个地方可以改,效果范围不同。

Tomcat里头怎么弄SQLServer连接池,配置步骤和实现大概说说

  • 全局配置(推荐给多个应用使用):修改Tomcat根目录下的conf/context.xml文件,这样配置的连接池,在这个Tomcat里部署的所有Web应用程序都可以使用。
  • 局部配置(仅限单个应用使用):在你自己的Web应用的META-INF目录下创建一个context.xml文件(如果不存在就新建)。

这里以修改全局的conf/context.xml为例,这样更通用,你用文本编辑器打开这个文件,在<Context>标签里面,加上一段<Resource>的配置,下面是一个具体的例子,你需要把它里面的占位符换成你自己的数据库信息:

<Context>
  ... (其他已有的配置)
  <Resource name="jdbc/YourConnectionPoolName"
            auth="Container"
            type="javax.sql.DataSource"
            driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver"
            url="jdbc:sqlserver://你的服务器地址:1433;databaseName=你的数据库名;encrypt=true;trustServerCertificate=true;"
            username="你的数据库用户名"
            password="你的数据库密码"
            maxTotal="100"
            maxIdle="30"
            maxWaitMillis="10000"
            validationQuery="SELECT 1"
            testOnBorrow="true"/>
</Context>

我来解释一下上面这些参数都是什么意思(来源:Apache Tomcat官方文档关于JNDI DataSource的配置):

  • name:这是你给这个连接池起的名字,你的程序后面就通过这个名字来找它,通常以jdbc/开头。
  • authtype:照着我上面写的填就行,Container表示由Tomcat容器来管理认证,DataSource是标准的数据源类型。
  • driverClassName:驱动类的全名,对于SQL Server就是这个。
  • url:数据库的连接地址。你的服务器地址如果是本机就写localhost,如果是远程服务器就写IP或域名。1433是SQL Server默认端口。databaseName换成你的实际数据库名。encrypttrustServerCertificate是为了解决新版本驱动安全连接的问题,如果不需要加密可以设为false
  • usernamepassword:登录数据库的用户名和密码。
  • maxTotal:连接池里最多能同时存在的活动连接数,根据你的应用压力调整。
  • maxIdle:连接池里空闲连接的最大数量。
  • maxWaitMillis:当连接池耗尽时,应用请求连接的最大等待时间(毫秒),超时则抛出异常。
  • validationQuery:一条简单的SQL语句,用于验证连接是否还有效。SELECT 1就很好。
  • testOnBorrow:设为true表示应用从池中 borrow(获取)连接时,先验证一下是否有效,避免拿到坏连接。

配置保存后,必须重启Tomcat,让这个新的配置生效。

Tomcat里头怎么弄SQLServer连接池,配置步骤和实现大概说说

第三步:在你的Web程序里“使用”连接池

现在Tomcat这边已经准备好了,你的Java Web程序(比如一个Servlet或JSP)该怎么用它呢?很简单,通过JNDI lookup(可以理解为“按名字查找资源”)来获取数据源。

这里给一个在Servlet里使用的简单例子:

import java.io.*;
import java.sql.*;
import javax.annotation.Resource;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.sql.DataSource;
public class MyServlet extends HttpServlet {
    // 使用@Resource注解,直接注入数据源,name就是你在context.xml里配置的名字
    @Resource(name="jdbc/YourConnectionPoolName")
    private DataSource dataSource;
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        // 声明Connection和Statement
        Connection conn = null;
        Statement stmt = null;
        ResultSet rs = null;
        try {
            // 关键一步:从数据源获取连接,而不是用DriverManager创建
            conn = dataSource.getConnection();
            // 剩下的就是标准的JDBC操作了
            stmt = conn.createStatement();
            String sql = "SELECT id, name FROM your_table";
            rs = stmt.executeQuery(sql);
            while (rs.next()) {
                int id = rs.getInt("id");
                String name = rs.getString("name");
                out.println("ID: " + id + ", Name: " + name + "<br>");
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            // 非常重要:使用完毕后,一定要关闭资源,但注意,关闭Connection并不是真的关闭,而是还给连接池
            if (rs != null) { try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } }
            if (stmt != null) { try { stmt.close(); } catch (SQLException e) { e.printStackTrace(); } }
            if (conn != null) { try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } }
        }
    }
}

最后强调几个要点:

  1. 驱动版本匹配:确保你用的mssql-jdbc驱动版本与你的SQL Server版本和Java版本大致兼容,太老的驱动可能连不上新版本数据库。
  2. 网络和权限:确保Tomcat服务器所在的机器能网络通畅地访问到SQL Server服务器,并且你提供的用户名密码有足够的权限。
  3. 关闭连接:在finally块中关闭连接 (conn.close()) 是必须的,但这个关闭操作在连接池环境下,并不是断开物理连接,而是将这个连接标记为空闲,返还给连接池供其他请求使用,如果不关闭,会导致连接泄露,很快耗光连接池资源。
  4. 故障排查:如果连不上,首先检查Tomcat的日志文件(logs/catalina.outlogs/localhost.yyyy-mm-dd.log),里面通常会有非常详细的错误信息,比如驱动类找不到、URL格式错误、认证失败等。

就是Tomcat中配置和使用SQL Server连接池的主要步骤和要点,整个过程的核心就是配置Tomcat的context.xml和在代码中通过JNDI查找DataSource