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>
看看是不是应用程序池满了,或者是程序内存泄漏。
能详细描述下问题及产生过程吗