You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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环境是否存在自定义的线程池配置,是否与容器的线程管理逻辑冲突
  • 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 03:20:04