Java 我的Android应用程序与一个巨大的MS Access数据库的Ucanaccess连接占用了Android设备上太多的堆空间。还有别的选择吗?
我正在开发一个Android应用程序,需要从一个120MB大小的巨大MS Access数据库中获取数据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设备上运行相同的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();
}
}
}