“流已关闭”的例外情况…相当模糊。
假设没有网络问题,并且SQL Server日志没有显示任何其他更详细的错误消息,或者服务器本身没有CPU/内存/磁盘空间问题,您可能会考虑:
-
查看您的
HikariCP connection pool settings
。您可能需要调整
max-lifetime
,
idle-timeout
和
leakDetectionThreshold
设置,以确保连接不会过早关闭或保持时间过长。
-
优化查询:尽管直接在SQL Server上执行查询时,查询本身表现良好,但您仍然可以尝试通过向
Request
表,或者使用更有效的分页方法,例如使用基于键集的分页。
还可以尝试捕获具有更多细节的异常,例如中的(来自“
How to catch Hibernate SQL EXCEPTIONS IN SPRING
"):
import javax.persistence.PersistenceException;
import org.hibernate.exception.JDBCConnectionException;
import org.springframework.dao.DataAccessException;
@Repository
@Transactional(readOnly = true)
@Log4j2
public class SearchService {
@PersistenceContext
private EntityManager entityManager;
public List<Request> searchRequests(SearchModel searchModel, int pageNumber) {
List<Request> result = new ArrayList<>();
try {
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<Request> criteriaQuery = criteriaBuilder.createQuery(Request.class);
Root<Request> requestRoot = criteriaQuery.from(Request.class);
requestRoot.alias("r");
Predicate predicate = createConditions(requestRoot, criteriaBuilder, searchModel);
criteriaQuery.select(requestRoot);
Order orderBy = criteriaBuilder.desc(requestRoot.get("id"));
String orderByProperty = searchModel.getOrderBy();
criteriaQuery.where(predicate).orderBy(orderBy);
int startFrom = (pageNumber - 1) * searchModel.getPageSize();
result = entityManager.createQuery(criteriaQuery).setMaxResults(searchModel.getMaxResult())
.setFirstResult(startFrom).getResultList();
} catch (PersistenceException | DataAccessException e) {
if (e.getCause() instanceof JDBCConnectionException) {
log.error("JDBC connection exception occurred: {}", e.getMessage(), e);
} else {
log.error("An exception occurred while executing the search query: {}", e.getMessage(), e);
}
} catch (Exception e) {
log.error("An unexpected exception occurred while executing the search query: {}", e.getMessage(), e);
}
return result;
}
}
我已经将查询执行封装在try-catch块中,以捕获任何
PersistenceException
,
DataAccessException
,或其他一般例外情况。如果
JDBCConnectionException
发生时,将使用特定消息进行记录。对于其他异常,将记录一条更通用的错误消息。
这将帮助您识别和诊断在执行查询过程中可能出现的任何问题。