簡體   English   中英

我的Android應用程序與巨大的MS Access數據庫的Ucanaccess連接在Android設備上占用了太多的堆空間。 任何替代品?

[英]Ucanaccess connection of my Android app with a huge MS Access database is taking too much heap space on Android device. Any alternatives?

我正在開發一個Android應用程序,需要從120MB大小的巨大MS Access數據庫中獲取數據。

我編寫了代碼來建立連接並在數據庫上執行簡單查詢。 我在我的筆記本電腦和我的Android設備上運行相同的java代碼。這是代碼:p

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();
        }
    }
}

當它在我的筆記本電腦上運行時,連接只需要大約一分鍾即可完成。 但是當它在我的Android設備上運行時,連接需要超過10分鍾,並占用所有堆空間,當設備內存不足時,應用程序崩潰

我該怎么辦??

注意:
我在這個代碼上做了一些小的改動,在android上運行它,比如添加toast而不是System.out.println進行調試,我刪除了android的靜態main函數,使用Environment.getAbsolutePath()來定位數據庫等。另外,我在Android上運行的代碼,我首先使用9MB數據庫來檢查它是否有效。 代碼從9MB數據庫中按預期獲取數據,沒有任何問題。 在9MB數據庫的情況下,在Android中建立連接大約需要10秒鍾(在桌面上,與9MB數據庫建立連接只需不到一秒鍾)

是的,我知道,它應該適用於中型數據庫。 有一個巨大的......

首先,請注意您測量的時間,即VM生命周期中第一次連接數據庫的時間,以下(如果需要)將是即時的。

從未在Android上嘗試類似的東西,因為您的實驗很有挑戰性,但是,如果它符合您的要求,您可以嘗試:

-use MirrorFolder(或keepMirror)連接參數(有關它的更多詳細信息,請參閱ucanaccess網站)。 在這種情況下,與db的第一次連接將非常慢,所有以下(即使vm結束)將是瞬時的。 但是只能使用ucanaccess和你的android更新訪問數據庫

或者,或者

- 使用過濾器數據庫(在Windows上配置它)鏈接外部鏈接表子集中的真實數據庫,這是您的應用程序非常需要的(內存使用量可能會下降)。 在這種情況下,您將不得不使用remap連接參數,因為您使用的是基於Linux的SO。

請參閱相關的jackcess另一項建議(底層的I / O庫), 在這里 ,並使用最新的ucanaccess釋放。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM