关于#tomcat#的问题,如何解决?

tomcat部署下,第五次使用网页出现Executor was closed,需要重启服务器才能恢复正常
工具类

public class DBUtil2 {
    private static SqlSessionFactory sqlSessionFactory;

    /**
     * 类加载时初始化sqlSessionFactory对象
     */
    static {
        try {
            SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
            sqlSessionFactory = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis-config.xml"));
            System.out.println("try");
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("error");
        }
    }

    private static ThreadLocal<SqlSession> local = new ThreadLocal<>();

    /**
     * 每调用一次openSession()可获取一个新的会话,该会话支持自动提交。
     *
     * @return 新的会话对象
     */
    public static SqlSession openSession() {
        SqlSession sqlSession = local.get();
        if (sqlSession == null) {
            sqlSession = sqlSessionFactory.openSession();
            local.set(sqlSession);
        }
        return sqlSession;
    }

    /**
     * 关闭SqlSession对象
     * @param sqlSession
     */
    public static void close(SqlSession sqlSession){
        if (sqlSession != null) {
            sqlSession.close();
        }
        local.remove();
    }
}

servlet:

public class ReserveServlet02 extends HttpServlet {


    private final Lock lock = new ReentrantLock();


    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        int seatId = Integer.parseInt(request.getParameter("seatId"));

        Seat seat = getSeatFromDB(seatId);

        if (seat.getStatus() == 1) {
            if (reserveSeat(seat)) {
                response.sendRedirect(request.getContextPath() + "/reserveSuccess.jsp");
            } else {
                response.sendRedirect(request.getContextPath() + "/reserveFail.jsp");
            }
        } else {
            response.sendRedirect(request.getContextPath() + "/reserveFail.jsp");
        }
    }


    public boolean reserveSeat(Seat seat) {
        boolean isSuccess = false;

        if (seat != null && seat.getStatus() == 1) {
            seat.setStatus(2);

            SqlSession sqlSession2 = DBUtil2.openSession();//添加事务
            SeatMapper seatDAO = sqlSession2.getMapper(SeatMapper.class);
            isSuccess = seatDAO.updateSeat(seat);
            sqlSession2.commit();
            sqlSession2.close();
        }

        return isSuccess;
    }

    public Seat getSeatFromDB(int seatId) {
        Seat seat = null;
        try (SqlSession sqlSession = DBUtil2.openSession()) {
            SeatMapper seatDAO = sqlSession.getMapper(SeatMapper.class);
            seat = seatDAO.getSeatById(seatId);
        }catch (Exception e) {
            e.printStackTrace();
        }
        return seat;
    }

}

mabatis配置:


configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>

    <properties resource="jdbc.properties"/>

    <settings>
        <setting name="cacheEnabled" value="false"/>
    settings>

    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc.driver}"/>
                <property name="url" value="${jdbc.url}"/>
                <property name="username" value="${jdbc.username}"/>
                <property name="password" value="${jdbc.password}"/>

                <property name="poolMaximumActiveConnections" value="2"/>
                
                <property name="poolMaximumCheckoutTime" value="5000"/>

            dataSource>
        environment>
    environments>


    <mappers>
        <mapper resource="RouteMapper.xml"/>
        <mapper resource="SeatMapper.xml"/>
        <mapper resource="UserMapper.xml"/>
    mappers>
configuration>

seatMapper:


mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="book.DAO.SeatMapper">

    <insert id="insertSeat">
        INSERT INTO seat (route_id, name, status) VALUES (#{routeId}, #{name}, #{status})
    insert>

    <delete id="deleteSeat">
        DELETE FROM seat WHERE id = #{id}
    delete>

    <update id="updateSeat">
        UPDATE seat SET route_id = #{routeId}, name = #{name}, status = #{status} WHERE id = #{id}
    update>

    <select id="getSeatById" resultType="book.javabean.Seat">
        SELECT id,route_id as routeId, name, status FROM seat WHERE id = #{id}
    select>

    <select id="getAllSeatsByRouteId" resultType="book.javabean.Seat">
        SELECT id, name, status, route_id as routeId FROM seat WHERE route_id = #{routeId}
    select>


mapper>

看看是不是应用程序池满了,或者是程序内存泄漏。

能详细描述下问题及产生过程吗