我的 Android 应用程序与巨大的 MS Access 数据库的 Ucanaccess 连接在 Android 设备上占用了太多堆 space。还有其他选择吗?
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 数据库中获取数据。
我已经编写了代码来建立连接并对数据库执行简单的查询。我 运行 在我的笔记本电脑上使用相同的 java 代码,而我 Android device.Here 的代码是:
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();
}
}
}
当它 运行 在我的笔记本电脑上时,连接只需要大约一分钟即可建立。
但是当它 运行s 在我的 Android 设备上时,连接需要超过 10 分钟,并且占用了所有堆 space,并且当设备 运行s 出内存,应用程序崩溃
我该怎么办??
注:
我在 android 上对 运行 代码做了一些细微的改动,比如添加 toasts 而不是 System.out.println 进行调试,我删除了 android 的静态主函数,使用 Environment.getAbsolutePath() 定位数据库等
另外,我在 运行ning Android 上的代码,我首先使用了一个 9MB 的数据库来检查它是否有效。该代码按预期从 9MB 数据库中提取数据,没有任何问题。在 9MB 数据库的情况下,Android 建立连接大约需要 10 秒(在台式机中,与 9MB 数据库建立连接不到一秒)
是的,我知道,它应该适用于中型数据库。有一个巨大的...
首先,请注意您正在测量的时间是 VM 生命中第一次连接到数据库的时间,以下(如果需要)将是瞬时的。
从未在 Android 上尝试过类似的东西,因为您的实验具有挑战性,但是,如果它符合您的要求,您可以尝试:
-使用 MirrorFolder(或 keepMirror)连接参数(有关更多详细信息,请参阅 ucanaccess 网站)。在这种情况下,与数据库的第一个连接将非常慢,所有后续(即使虚拟机结束)都将是瞬时的。但是访问数据库应该只用 ucanaccess 和你的 android
更新
或者,或者,
-使用过滤数据库(在 windows 上配置),将真实数据库链接到您的应用程序非常需要的外部链接表的子集中(内存使用量可能会下降)。在这种情况下,您必须使用重新映射连接参数,因为您使用的是基于 linux 的 SO。
查看另一个与 jackcess(底层 I/O 库)相关的建议 here 并使用最新的 ucanaccess 版本。
我正在开发一个 Android 应用程序,它需要从 120MB 大小的巨大 MS Access 数据库中获取数据。
我已经编写了代码来建立连接并对数据库执行简单的查询。我 运行 在我的笔记本电脑上使用相同的 java 代码,而我 Android device.Here 的代码是: 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();
}
}
}
当它 运行 在我的笔记本电脑上时,连接只需要大约一分钟即可建立。 但是当它 运行s 在我的 Android 设备上时,连接需要超过 10 分钟,并且占用了所有堆 space,并且当设备 运行s 出内存,应用程序崩溃
我该怎么办??
注:
我在 android 上对 运行 代码做了一些细微的改动,比如添加 toasts 而不是 System.out.println 进行调试,我删除了 android 的静态主函数,使用 Environment.getAbsolutePath() 定位数据库等
另外,我在 运行ning Android 上的代码,我首先使用了一个 9MB 的数据库来检查它是否有效。该代码按预期从 9MB 数据库中提取数据,没有任何问题。在 9MB 数据库的情况下,Android 建立连接大约需要 10 秒(在台式机中,与 9MB 数据库建立连接不到一秒)
是的,我知道,它应该适用于中型数据库。有一个巨大的...
首先,请注意您正在测量的时间是 VM 生命中第一次连接到数据库的时间,以下(如果需要)将是瞬时的。
从未在 Android 上尝试过类似的东西,因为您的实验具有挑战性,但是,如果它符合您的要求,您可以尝试:
-使用 MirrorFolder(或 keepMirror)连接参数(有关更多详细信息,请参阅 ucanaccess 网站)。在这种情况下,与数据库的第一个连接将非常慢,所有后续(即使虚拟机结束)都将是瞬时的。但是访问数据库应该只用 ucanaccess 和你的 android
更新或者,或者,
-使用过滤数据库(在 windows 上配置),将真实数据库链接到您的应用程序非常需要的外部链接表的子集中(内存使用量可能会下降)。在这种情况下,您必须使用重新映射连接参数,因为您使用的是基于 linux 的 SO。
查看另一个与 jackcess(底层 I/O 库)相关的建议 here 并使用最新的 ucanaccess 版本。