Jdbc StelsDBF java.lang.OutOfMemoryError:java堆空间

Jdbc StelsDBF java.lang.OutOfMemoryError:java堆空间,jdbc,foxpro,dbase,Jdbc,Foxpro,Dbase,我使用的是的评估版本 我有一个包含8302行和43列5mb的dbf文件,StelsDBF似乎无法工作。 StelsDBF可以很好地处理其他较小的文件 我的问题 select codi,descrip from \"DATA.DBF\" limit 10 当我试图得到结果时,我得到了以下结果 Exception in thread "'DATA.DBF' producer" java.lang.OutOfMemoryError: Java heap space at jstels.dat

我使用的是的评估版本 我有一个包含8302行和43列5mb的dbf文件,StelsDBF似乎无法工作。 StelsDBF可以很好地处理其他较小的文件

我的问题

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:/juan/sync/syncro\u 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中添加了VM参数,但是得到了相同的异常

这是我的密码:

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();
        }
    }
}
导入java.sql.Connection;
导入java.sql.DriverManager;
导入java.sql.ResultSet;
导入java.sql.SQLException;
导入java.sql.Statement;
公共类TestStelsDbf{
公共静态void main(字符串[]args){
String drive=“D:/juan/dbf”;
试一试{
类.forName(“jstels.jdbc.dbf.DBFDriver2”);
}catch(classnotfounde异常){
e、 printStackTrace();
}
试一试{
//连接conn=DriverManager.getConnection(“jdbc:jstels:dbf:+drive+”?扩展名=.dbf”);
//连接conn=DriverManager.getConnection(“jdbc:jstels:dbf:+drive+”?扩展名=.dbf&dbPath=D:/juan/sync/syncro_db&tempath=C:/Temp”);
连接conn=DriverManager.getConnection(“jdbc:jstels:dbf:+drive+”?扩展名=.dbf&dbInMemory=false&tempPath=C:/Temp”);
String cli=“选择codi,从\”DATA.DBF \“limit 10”中描述”;
语句stmt=conn.createStatement();
结果集rs=stmt.executeQuery(cli);

对于(intj=1;jIMHO),需要将synchronbase移出Java堆

我注意到您已经尝试了持久同步基础。两个建议:

1) 不要使用驱动器的根目录,而要使用目录。将.DBF文件移到那里

String drive = "D:/myDB";
2) 试着用一个临时的基地

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

您使用的是32位还是64位Java?如果堆用完了,那么您需要更多的堆,可能32位Java无法将堆扩展到您需要的大小。我使用的是64位Java,并且有6g内存。因此您是否尝试进一步增加堆?而不是-Xmx2048m,请尝试更大的数字。进行一些实验。将堆设置为一个值,8000行不行工作,最大的行数是多少?将堆增加一些。现在有多少行可以工作。很快你就有了内存消耗的模型,因此可以看到什么是可行的。你试过问供应商产品测试了哪些JVM版本吗?如果不可能,你能试一下旧的JVM版本,32位吗.还有一个研究备选方案:不仅要减少行数,还要抑制列,特别是不寻常的数据类型(dBASE中是否存在这种数据类型?我不记得了)。