【问题标题】:SQL Server JDBC: unable to create new native threadSQL Server JDBC:无法创建新的本机线程
【发布时间】:2009-09-15 14:41:08
【问题描述】:

我们正在使用微软的 sqljdbc 驱动程序 1.2 与 Windows 下的 Hibernate 结合使用。尽管 JVM 堆中仍有大量内存可用,但有时我们会从 JDBC 驱动程序中收到 OutOfMemoryError。 这是我们得到的异常的堆栈跟踪:

java.lang.OutOfMemoryError: unable to create new native thread
    at java.lang.Thread.start0(Native Method)
    at java.lang.Thread.start(Thread.java:597)
    at com.microsoft.sqlserver.jdbc.TimeoutTimer.start(Unknown Source)
    at com.microsoft.sqlserver.jdbc.TDSCommand.startResponse(Unknown Source)
    at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.doExecutePreparedStatement(Unknown Source)
    at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement$PrepStmtExecCmd.doExecute(Unknown Source)
    at com.microsoft.sqlserver.jdbc.TDSCommand.execute(Unknown Source)
    at com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(Unknown Source)
    at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeCommand(Unknown Source)
    at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeStatement(Unknown Source)
    at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.executeQuery(Unknown Source)
    at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeQuery(NewProxyPreparedStatement.java:76)
    at org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:208)
    at org.hibernate.loader.Loader.getResultSet(Loader.java:1808)
    at org.hibernate.loader.Loader.doQuery(Loader.java:697)
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:259)
    at org.hibernate.loader.Loader.doList(Loader.java:2228)
    at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2125)
    at org.hibernate.loader.Loader.list(Loader.java:2120)
    at org.hibernate.loader.criteria.CriteriaLoader.list(CriteriaLoader.java:118)
    at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1596)
    at org.hibernate.impl.CriteriaImpl.list(CriteriaImpl.java:306)

sqljdbc 会不会泄露原生线程?

【问题讨论】:

    标签: java sql-server hibernate orm sqljdbc


    【解决方案1】:

    有人警告我不要使用此驱动程序。 我引用:

    使用 jTDS 会更好,因为 Microsoft 自己的驱动程序不受 Hibernate 支持,并且存在一些问题,使其成为一个糟糕的选择。

    在 SqlServer 上 Hibernate 的首选驱动程序是 jTDS http://jtds.sourceforge.net/

    【讨论】:

      【解决方案2】:

      根据this thread,在statement 上使用setQueryTimeout 会使executeQuery 为每个查询打开一个线程。这可能导致驱动程序使用大量线程并导致内存问题。不确定这里是否是这种情况,也不确定它是否在您的控制之下。所以实际上,您可能必须减少线程堆栈大小以避免此问题。

      尝试将-Xss128k 添加到您的JVM 设置中。

      有关线程堆栈大小和硬件限制的更多信息,请参阅 this thread 和 this one。

      【讨论】:

      • 这个问题确实是由我们在SQL语句上使用的setQueryTimeout引起的。有趣的是,即使相应的查询已经完成,这些超时线程似乎也不会立即被垃圾回收。
      • 这是一个很好的答案。不幸的是,答案中的链接指向 forums.sun.com,该链接现在已迁移到 forums.oracle.com,无法查找旧的 sun 线程 ID。有人在新论坛部分有这些主题的链接吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-04
      • 2015-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多