我使用的評估版本爲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();
}
}
}
對不起太多的例外。你可以幫幫我嗎?提前致謝。
您使用的是32位還是64位Java?如果你沒有堆,那麼你需要更多的堆,也許一個32位的Java不能把堆擴展到你需要的大小。 – djna
我正在使用64位Java,並有6克的RAM –
所以你試過增加堆還有更多?而不是-Xmx2048m嘗試一個更大的數字。做一些實驗。將堆設置爲一個值,8000行不起作用,最大的行數是多少?增加一些數量的堆。現在有多少行工作。很快你就有了一個模型來了解內存是如何被消耗的,因此可以看到什麼是可行的。 – djna