Java执行SQL Server查询时出现IllegalThreadStateException问题求助
问题:JDBC执行SELECT语句时抛出IllegalThreadStateException异常
我们通过Java执行SQL Server的SELECT语句时,抛出如下异常:
Exception in Execute Select java.lang.IllegalThreadStateException: Thread is already started
我们并未手动使用线程,仅通过JDBC连接数据库完成操作。
相关业务代码片段
QueryExecuter queryExec = null; PreparedStatement ps = null; ResultSet rs = null; queryExec = new QueryExecuter("Sql"); // 从MS SQL Server获取连接 ps = queryExec.getPreparedStatement(RegistrationSqlCatalog.strGetCartItemVinData); ps.setString(1,rdto.getVIN()); rs = queryExec.executeSelect(ps);
日志输出
SQL Data source iscom.ibm.ws.rsadapter.jdbc.WSJdbcDataSource@4a4adf7d QueryExecuter.PreparedStatement() sqlQuery SELECT CARTID FROM CARTITEMS WHERE UPPER(VINNUMBER) = ? Excpetion in Execute Select java.lang.IllegalThreadStateException: Thread is already started
环境背景
我们使用WebSphere管理控制台管理数据源,相同的EAR包、mssql-jdbc-10.2.0.jre8.jar驱动、WebSphere及Java版本在DEV环境运行正常,但TEST环境出现异常。将TEST数据库连接到DEV环境可正常执行,现寻求除上述已排除因素外的排查方向。
QueryExecuter相关代码链
public QueryExecuter (String sql) throws SQLException, NamingException{ con = this.getSQLConnection(); } private Connection getSQLConnection() throws SQLException, NamingException{ DataSource datasrc = null; datasrc = OntracServiceLocator.getInstance().getSQLDataSource(); con = datasrc.getConnection(); if (con == null) cat.info("Query Executer Unable to get Connection "); return con; } public DataSource getSQLDataSource() throws NamingException { String dsName = "java:comp/env/jdbc/sql"; cat.info("data source " + dsName); ic = getInitialContext(); DataSource ds = null; ds = (DataSource) ic.lookup(dsName); cat.info("SQL Data source is" + ds); return ds; }
排查方向
WebSphere TEST环境数据源配置差异
- 对比DEV和TEST环境的连接池参数:包括最大连接数、连接超时、连接重用策略、测试连接的频率/方式,确认是否有线程相关的配置不一致
- 检查数据源的连接验证机制:比如是否开启了
testConnectionOnCheckout或testConnectionOnCheckin,这些验证逻辑可能涉及后台线程,若TEST环境配置异常可能导致线程重复启动
JVM参数与线程池配置差异
- 对比DEV和TEST环境的WebSphere JVM启动参数:重点关注线程池大小(如
-Xss、-XX:ParallelGCThreads)、线程相关的系统属性(如java.util.concurrent.ForkJoinPool.common.parallelism等) - 检查TEST环境是否存在自定义的线程池配置,是否与容器的线程管理逻辑冲突
- 对比DEV和TEST环境的WebSphere JVM启动参数:重点关注线程池大小(如
TEST环境数据库与驱动加载问题
- 检查TEST数据库的连接状态:是否存在大量未释放的连接,或数据库端的线程限制导致连接池线程异常
- 确认TEST环境中JDBC驱动的加载优先级:WebSphere自带的JDBC驱动是否与应用包中的
mssql-jdbc-10.2.0.jre8.jar存在版本冲突,导致连接创建时的线程逻辑异常
应用代码的线程安全性检查
- 分析
OntracServiceLocator的getInstance()实现:是否为单例模式且存在非线程安全的共享资源(如ic初始上下文对象),多线程并发调用时是否导致线程状态异常 - 获取TEST环境的线程dump:定位抛出异常的线程栈,确认是否是WebSphere容器线程或连接池线程被重复启动
- 分析
WebSphere补丁与版本细节
- 确认DEV和TEST环境的WebSphere补丁版本是否完全一致:某些WebSphere补丁会调整JDBC连接池的线程管理逻辑,若TEST环境遗漏补丁或多打补丁可能引发问题
内容的提问来源于stack exchange,提问作者Bharath Mocherla
相关产品推荐
相关产品推荐

