2009-09-15 33 views
0

我們在Windows下使用Microsoft的sqljdbc驅動程序1.2與Hibernate結合使用。偶爾我們會從JDBC驅動程序中獲取OutOfMemoryError,儘管JVM堆中仍有大量內存可用。 下面是我們正在對異常的堆棧跟蹤:SQL Server JDBC:無法創建新的本機線程

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泄漏本地線程?

回答

1

this thread,在statement使用setQueryTimeout使得executeQuery開一個線程爲每個查詢。這可能會導致驅動程序使用大量線程,並導致內存問題。不確定是否屬於這種情況,無論如何不確定它是否在您的控制之下。實際上,您可能必須減少線程堆棧大小以避免此問題。

嘗試將-Xss128k添加到您的JVM設置中。

有關線程堆棧大小和硬件限制的更多信息,請參閱this threadthis one

+0

這個問題確實是由我們在SQL語句中使用的setQueryTimeout造成的。有趣的是,即使相應的查詢已經完成,這些超時線程似乎也不會立即收集垃圾。 – sakra 2009-09-16 08:47:07

+0

這是一個非常好的答案。不幸的是,答案中的鏈接指向的forums.sun.com現在已經遷移到forums.oracle.com,而沒有任何方式查看舊的太陽線程ID。任何人在新的論壇部分都有鏈接到這些主題? – neesh 2011-01-18 21:40:05

2

我被警告不要使用這個驅動程序。 我舉:

好得多是使用JTDS,因爲微軟自己的驅動程序不是由Hibernate支持,有一些問題,這使得它一個糟糕的選擇。

的青睞司機對Hibernate對SQLServer是JTDS http://jtds.sourceforge.net/

+0

不幸的是,jTDS不支持故障轉移...... – Ben 2010-04-29 09:51:12

相關問題