[英]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.