2013-08-20 177 views
0

我使用的評估版本爲StelsDBF JDBC Driver 5.2 我有一個dbf文件,包含8302行和43列5mb,而StelsDBF似乎無法正常工作。 StelsDBF可以和其他小文件一起工作。StelsDBF java.lang.OutOfMemoryError:Java堆空間

我查詢

select codi,descrip from \"DATA.DBF\" limit 10 

當我試圖得到的結果我得到以下

Exception in thread "'DATA.DBF' producer" java.lang.OutOfMemoryError: Java heap space 
    at jstels.database.b.d.if(Unknown Source) 
    at jstels.database.b.e.do(Unknown Source) 
    at jstels.jdbc.dbf.a.b.a(Unknown Source) 
    at jstels.jdbc.common.h2.OperationTable$a.do(Unknown Source) 
    at jstels.jdbc.common.h2.OperationTable$a.a(Unknown Source) 
    at jstels.utils.b.b$a.run(Unknown Source) 

我加了參數& DBPATH = d:/胡安/同步/ syncro_db & TEMPPATH = C:/ Temp並獲得下一個

Exception in thread "'DATA.DBF' producer" java.lang.OutOfMemoryError: Java heap space 
    at jstels.database.b.d.if(Unknown Source) 
    at jstels.database.b.e.do(Unknown Source) 
    at jstels.jdbc.dbf.a.b.a(Unknown Source) 
    at jstels.jdbc.common.h2.OperationTable$a.do(Unknown Source) 
    at jstels.jdbc.common.h2.OperationTable$a.a(Unknown Source) 
    at jstels.utils.b.b$a.run(Unknown Source) 
java.sql.SQLException: [StelsDBF JDBC driver] Can't load the file 'DATA.DBF' to H2 database. Error was: Time is out in 'consumer' thread 
    at jstels.jdbc.common.h2.OperationTables.loadTable(Unknown Source) 
    at jstels.jdbc.common.h2.g.a(Unknown Source) 
    at jstels.jdbc.common.h2.g.executeQuery(Unknown Source) 
    at com.rhemsolutions.customer.TestStelsDbf.main(TestStelsDbf.java:27) 

我也向我的IDE添加了虛擬機參數-XX:MaxPermSize = 512m -Xmx2048m但獲得相同的例外。

這裏是我的代碼:

import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.ResultSet; 
import java.sql.SQLException; 
import java.sql.Statement; 

public class TestStelsDbf { 

    public static void main(String[] args) { 
     String drive = "D:/juan/dbf"; 

     try { 
      Class.forName("jstels.jdbc.dbf.DBFDriver2"); 
     } catch (ClassNotFoundException e) { 
      e.printStackTrace(); 
     } 
      try { 
//   Connection conn = DriverManager.getConnection("jdbc:jstels:dbf:"+drive+"?extension=.DBF"); 
//   Connection conn = DriverManager.getConnection("jdbc:jstels:dbf:"+drive+"?extension=.DBF&dbPath=D:/juan/sync/syncro_db&tempPath=C:/Temp"); 
       Connection conn = DriverManager.getConnection("jdbc:jstels:dbf:"+drive+"?extension=.DBF&dbInMemory=false&tempPath=C:/Temp"); 

      String cli = "select codi,descrip from \"DATA.DBF\" limit 10"; 
      Statement stmt = conn.createStatement(); 

      ResultSet rs = stmt.executeQuery(cli); 
      for (int j = 1; j <= rs.getMetaData().getColumnCount(); j++) { 
       System.out.print(rs.getMetaData().getColumnName(j) + "\t"); 
      } 
      System.out.println(); 
      while (rs.next()) { 
       for (int j = 1; j <= rs.getMetaData().getColumnCount(); j++) { 
        System.out.print(rs.getObject(j) + "\t"); 
       } 
       System.out.println(); 
       } 
      rs.close(); 
      stmt.close(); 
      conn.close(); 
     } catch (SQLException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

對不起太多的例外。你可以幫幫我嗎?提前致謝。

+0

您使用的是32位還是64位Java?如果你沒有堆,那麼你需要更多的堆,也許一個32位的Java不能把堆擴展到你需要的大小。 – djna

+0

我正在使用64位Java,並有6克的RAM –

+0

所以你試過增加堆還有更多?而不是-Xmx2048m嘗試一個更大的數字。做一些實驗。將堆設置爲一個值,8000行不起作用,最大的行數是多少?增加一些數量的堆。現在有多少行工作。很快你就有了一個模型來了解內存是如何被消耗的,因此可以看到什麼是可行的。 – djna

回答

0

恕我直言,你需要將同步器移出Java堆。

我注意到你已經嘗試過持久性同步化酶。兩個建議:

1)不要使用驅動器的根目錄,而要使用目錄。將您的.DBF文件移到那裏。

String drive = "D:/myDB"; 

2)嘗試臨時synchrobase。

Connection conn = DriverManager.getConnection("jdbc:jstels:dbf:"+drive+"?extension=.DBF&dbInMemory=false&tempPath=C:/Temp"); 
+0

謝謝。我嘗試了兩個建議,但仍然無法正常工作 –

+0

您是否試過詢問供應商該產品已經過測試的JVM版本?如果不可能,您可以嘗試舊的JVM版本,32位。還有一種研究方法:不僅嘗試使用較少的行,而且還要壓制列,特別是使用不同的數據類型(這些數據類型是否存在於dBASE中?我不記得了)。 –

相關問題