Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我的Android应用程序与一个巨大的MS Access数据库的Ucanaccess连接占用了Android设备上太多的堆空间。还有别的选择吗?_Java_Android_Jdbc_Ucanaccess - Fatal编程技术网

Java 我的Android应用程序与一个巨大的MS Access数据库的Ucanaccess连接占用了Android设备上太多的堆空间。还有别的选择吗?

Java 我的Android应用程序与一个巨大的MS Access数据库的Ucanaccess连接占用了Android设备上太多的堆空间。还有别的选择吗?,java,android,jdbc,ucanaccess,Java,Android,Jdbc,Ucanaccess,我正在开发一个Android应用程序,需要从一个120MB大小的巨大MS Access数据库中获取数据 我已经编写了建立连接并在数据库上执行简单查询的代码。我在笔记本电脑和Android设备上运行相同的java代码。代码如下: p package practiceDB; 导入java.io.IOException; 导入java.sql.Connection; 导入java.sql.DriverManager; 导入java.sql.SQLException; 导入java.sql.Statem

我正在开发一个Android应用程序,需要从一个120MB大小的巨大MS Access数据库中获取数据


我已经编写了建立连接并在数据库上执行简单查询的代码。我在笔记本电脑和Android设备上运行相同的java代码。代码如下: p

package practiceDB;
导入java.io.IOException;
导入java.sql.Connection;
导入java.sql.DriverManager;
导入java.sql.SQLException;
导入java.sql.Statement;
导入java.sql.ResultSet;
导入java.util.Scanner;
导入net.ucanaccess.converters.TypesMap.AccessType;
导入net.ucanaccess.ext.FunctionType;
导入net.ucanaccess.jdbc.UcanaccessConnection;
导入net.ucanaccess.jdbc.UcanaccessDriver;
公开课范例{
专用连接UCACON;
公共示例(){
试一试{
this.ucaConn=getUcanaccessConnection(“VehicleDatabase2.mdb”);
}捕获(SQLE异常){
e、 printStackTrace();
}捕获(IOE异常){
e、 printStackTrace();
}
}
公共静态void main(字符串[]args)抛出ClassNotFoundException、SQLException{
System.out.println(“请输入一个int”);
新扫描仪(System.in).nextInt();
试一试{
示例=新示例();
executeQuery();
}捕获(例外情况除外){
System.out.println(“异常:+ex.getMessage());
}
}
私有void executeQuery()引发SQLException{
语句st=null;
试一试{
System.out.println(“请输入一个int”);
新扫描仪(System.in).nextInt();
st=this.ucaConn.createStatement();
System.out.println(“请输入一个int”);
新扫描仪(System.in).nextInt();
结果集rs=st.executeQuery(“从PersonData中选择*,其中EngNo='1544256'”);
System.out.println(“结果:”);
转储(rs,“执行”);
}捕获(例外情况除外){
System.out.println(“Sarah异常:+ex.getMessage());
}最后{
如果(st!=null){
圣克洛斯();
}
}
}
私有连接getUcanaccessConnection(字符串pathNewDB)抛出SQLException、IOException{
字符串url=UcanaccessDriver.url_前缀+“VehicleDatabase2.mdb;newDatabaseVersion=V2003”;
返回DriverManager.getConnection(url);
}
私有无效转储(结果集rs,字符串exName)
抛出SQLException{
System.out.println(“-------------------------------------------------------------”;
System.out.println();
System.out.println();
int jk=0;
while(rs.next()){
系统输出打印(“|”);
int j=rs.getMetaData().getColumnCount();

对于(inti=1;i是的,我知道,它应该在中等大小的db上工作

首先,请注意,您正在测量的时间是VM生命周期中第一次连接到数据库的时间,以下内容(如果需要)将是即时的

从未在Android上尝试过类似的东西,因为您的实验具有挑战性,但是,如果它符合您的要求,您可以尝试:

-使用MirrorFolder(或keepMirror)连接参数(有关详细信息,请参阅ucanaccess网站)。在这种情况下,与db的第一次连接将非常缓慢,以下所有操作(即使vm结束)都将立即进行。但access数据库应仅使用ucanaccess在android上更新

或者,或者

-使用筛选器数据库(在windows上进行配置),该数据库链接应用程序所需的外部链接表子集中的真实数据库(内存使用率可能会下降)。在这种情况下,您必须使用remap connection参数,因为您使用的是基于linux的SO


请参阅另一个与jackcess(底层I/O库)相关的建议,并使用最新的ucanaccess版本。

“我在笔记本电脑和Android设备上运行相同的java代码”——只要Android应用程序没有
stdin
(由您的
扫描仪使用),此代码将不会在Android设备上运行并且不使用
main()
作为一个入口点。如果您想获得Android代码方面的帮助,那么发布Android代码将非常有用。很抱歉在我的问题中没有提及这一点,但我确实对这段代码做了一些细微的更改,以便在Android上运行它,比如添加toasts而不是System.out.println。为了进行调试,我删除了Android的静态主功能,等等。我在java代码中添加了Scanner语句,以确定哪个语句占用了所有的时间。实际上,这就是我如何确定建立连接需要时间,而不是查询的原因。在我的android代码中,我使用按钮和onClick回调来代替Scanner。我制作了两个按钮,其中一个只建立连接,第二个按钮只执行查询所以,我在Android上运行的代码,我确信代码是有效的。我首先使用9MB数据库进行检查。代码按照预期从9MB数据库中获取数据,没有任何问题。如果是9MB数据库,在Android中建立连接大约需要10秒。我有stion.索引可以解决问题吗?它可以加快数据获取速度。我认为在我的情况下,它会使情况变得更糟,因为索引会占用一些空间,这意味着数据库会变得更大,因此建立连接需要更多的时间,我同意。为什么不尝试使用Skipindexes=true connection参数(这样就只创建了引用完整性所需的索引)。内存占用可能会被删除。一个问题是:数据库中有很多ole数据吗?是的,这些数据从未被删除,只是被添加了。因此,1994年的记录也在其中。我无法回答
ackage practiceDB;

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


import java.util.Scanner;

import net.ucanaccess.converters.TypesMap.AccessType;
import net.ucanaccess.ext.FunctionType;
import net.ucanaccess.jdbc.UcanaccessConnection;
import net.ucanaccess.jdbc.UcanaccessDriver;

public class Example {
    private Connection ucaConn;
    public Example() {
        try {
            this.ucaConn = getUcanaccessConnection("VehicleDatabase2.mdb");
        } catch (SQLException e) {
            e.printStackTrace();
        } catch(IOException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        System.out.println("Please enter an int");
        new Scanner(System.in).nextInt();

        try {
            Example example = new Example();

            example.executeQuery();
        } catch (Exception ex) {
            System.out.println("An exception : " + ex.getMessage());
        }
    }

    private void executeQuery() throws SQLException {
        Statement st = null;
        try {
            System.out.println("Please enter an int");
            new Scanner(System.in).nextInt();
            st = this.ucaConn.createStatement();
            System.out.println("Please enter an int");
            new Scanner(System.in).nextInt();
            ResultSet rs = st.executeQuery("Select * from PersonData where EngNo = '1544256'");
            System.out.println(" result:");
            dump (rs, "executeQuery");
        } catch(Exception ex) {
            System.out.println("Sarah exception: " + ex.getMessage());
        } finally {
            if ( st != null ) {
                st.close();
            }
        }
    }

    private Connection getUcanaccessConnection(String pathNewDB) throws SQLException, IOException {
        String url  = UcanaccessDriver.URL_PREFIX + "VehicleDatabase2.mdb;newDatabaseVersion=V2003";

        return DriverManager.getConnection(url);
    }

    private void dump(ResultSet rs, String exName) 
            throws SQLException {
        System.out.println("-------------------------------------------------");
        System.out.println();

        System.out.println();
        int jk = 0;
        while (rs.next()) {

            System.out.print("| ");
            int j=rs.getMetaData().getColumnCount();
            for (int i = 1; i <=j ; ++i) {
                Object o = rs.getObject(i);
                System.out.print(o + " | ");
            }
        System.out.println();
        System.out.println();
        }
    }
}