- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我执行了我的代码,但我不明白为什么循环的运行时间非常长。
有两个循环。第一个循环在 Invoices 表上,第二个循环在 InvoicesLignes 表上。
InvoicesLignes表有一个索引“Code”,它是Invoice的“外键”。在数据库Access中,Invoices和InvoicesLines之间存在关系,但外键未定义,我无法使用Joiner类。我无法修改数据库。
import java.io.File;
import java.util.Date;
import java.io.IOException;
import com.healthmarketscience.jackcess.*;
class MultipleLoop {
public static void main(String[] args) {
File jfile = new File("/project/database.mdb");
Date start_date= new Date("2013/01/01");
Date end_date= new Date("2013/12/31");
try {
Database db = DatabaseBuilder.open(jfile);
Table invoices = db.getTable("Invoices");
Table invoices_lignes = db.getTable("InvoiceLignes");
Cursor cursor = CursorBuilder.createCursor(invoices_lignes.getIndex("Code"));
for(Row invoice : invoices) {
if ((start_date.before((Date)invoice.get("Date"))
|| start_date.equals((Date)invoice.get("Date")))
&&
(end_date.after((Date)invoice.get("Date"))
|| end_date.equals((Date)invoice.get("Date")) )) {
System.out.println(String.format("Invoice id : '%s' time : '%s'",
invoice.get("Code"),
System.currentTimeMillis( ) ));
long start = System.currentTimeMillis( );
for (Row invoice_ligne : cursor.newIterable().addMatchPattern("Code",
invoice.get("Code")))
{
System.out.println(String.format("Loop time : '%s'",
System.currentTimeMillis( )));
}
long end = System.currentTimeMillis( );
System.out.println(String.format("\n\nEnd loop time : '%s'",
System.currentTimeMillis( )));
long diff = end - start;
System.out.println(String.format("Loop elapsed time : '%s' ms\n\n",
diff ));
}
}
} catch (IOException e) {
//} catch (Exception e) {
System.out.println(e);
}
}
}
我的日志是
Invoice id : '19901/79018' time : '1411043140236'
Loop time : '1411043140237'
Loop time : '1411043140237'
Loop time : '1411043140237'
Loop time : '1411043140237'
End loop time : '1411043141335'
Loop elapsed time : '1098' ms
Invoice id : '138901/909719' time : '1411043141335'
Loop time : '1411043141336'
Loop time : '1411043141336'
End loop time : '1411043142418'
Loop elapsed time : '1083' ms
Invoice id : '1309091/729090' time : '1411043142419'
Loop time : '1411043142419'
Loop time : '1411043142419'
End loop time : '1411043143515'
Loop elapsed time : '1096' ms
我不明白为什么循环的运行时间非常长
感谢您的帮助
最佳答案
我怀疑您仍在有效地扫描整个 [InvoicesLignes] 表以获取外部 [Invoices] 循环的每次迭代。你的方法...
Table invoices = db_opened.getTable("Invoices");
Table invoices_lignes = db_opened.getTable("InvoicesLignes");
Cursor cursor = CursorBuilder.createCursor(invoices_lignes.getIndex("Code"));
for (Row row : invoices) {
long start = System.currentTimeMillis( );
System.out.println(String.format("Invoice : '%s'", start));
for (Row crow : cursor.newIterable().addMatchPattern("Code", row.get("Code"))) {
System.out.println(String.format("Loop : '%s'", System.currentTimeMillis( )));
}
long end = System.currentTimeMillis( );
System.out.println(String.format("End loop : '%s'", System.currentTimeMillis( )));
long diff = end - start;
System.out.println(String.format("Loop elapsed time : '%s' ms", diff ));
}
...产生:
Invoice : '1411041092492'
Loop : '1411041092527'
Loop : '1411041092528'
Loop : '1411041092529'
End loop : '1411041094440'
Loop elapsed time : '1948' ms
Invoice : '1411041094442'
Loop : '1411041094443'
Loop : '1411041094444'
End loop : '1411041095882'
Loop elapsed time : '1440' ms
但是,这种变化......
Table invoices = db_opened.getTable("Invoices");
Table invoices_lignes = db_opened.getTable("InvoicesLignes");
for (Row row : invoices) {
long start = System.currentTimeMillis( );
System.out.println(String.format("Invoice : '%s'", start));
IndexCursor cursor = new CursorBuilder(invoices_lignes)
.setIndexByName("Code")
.setSpecificEntry(row.get("Code"))
.toIndexCursor();
for (Row crow : cursor) {
System.out.println(String.format("Loop : '%s'", System.currentTimeMillis( )));
}
long end = System.currentTimeMillis( );
System.out.println(String.format("End loop : '%s'", System.currentTimeMillis( )));
long diff = end - start;
System.out.println(String.format("Loop elapsed time : '%s' ms", diff ));
}
...产生:
Invoice : '1411041030007'
Loop : '1411041030060'
Loop : '1411041030062'
Loop : '1411041030063'
End loop : '1411041030063'
Loop elapsed time : '56' ms
Invoice : '1411041030067'
Loop : '1411041030069'
Loop : '1411041030070'
End loop : '1411041030071'
Loop elapsed time : '4' ms
另外,您是否考虑过使用 UCanAccess ?对应的UCanAccess代码...
String dbFileSpec = "C:/Users/Gord/Desktop/InvoiceTest.mdb";
try (Connection conn=DriverManager.getConnection("jdbc:ucanaccess://" + dbFileSpec)) {
PreparedStatement psLignes = conn.prepareStatement("SELECT * FROM InvoicesLignes WHERE Code=?");
Statement sInv = conn.createStatement();
ResultSet rsInv = sInv.executeQuery("SELECT Code FROM Invoices");
while (rsInv.next()) {
long start = System.currentTimeMillis( );
System.out.println(String.format("Invoice : '%s'", start));
psLignes.setString(1, rsInv.getString("Code"));
ResultSet rsLignes = psLignes.executeQuery();
while (rsLignes.next()) {
System.out.println(String.format("Loop : '%s'", System.currentTimeMillis()));
}
long end = System.currentTimeMillis( );
System.out.println(String.format("End loop : '%s'", System.currentTimeMillis( )));
long diff = end - start;
System.out.println(String.format("Loop elapsed time : '%s' ms", diff ));
}
conn.close();
} catch (Exception e) {
e.printStackTrace(System.out);
}
...产生:
Invoice : '1411041417462'
Loop : '1411041417478'
Loop : '1411041417478'
Loop : '1411041417479'
End loop : '1411041417479'
Loop elapsed time : '17' ms
Invoice : '1411041417482'
Loop : '1411041417483'
Loop : '1411041417483'
End loop : '1411041417483'
Loop elapsed time : '1' ms
UCanAccess 会增加 Java 应用程序的启动时间,因为它将 Access 数据复制到 hsqldb“镜像”数据库(默认情况下位于内存中),但加载后速度非常快,我们可以使用常规 SQL,而不是直接使用 Jackcess API。
有关 UCanAccess 的更多信息,请参阅
关于java - Jackcess,具有多个匹配行的循环非常慢,,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25907985/
我正在尝试创建一个程序,它从 CSV 文件获取输入并将其写入 Java 创建的 Access 数据库和表。该程序使用 while 循环来遍历 CSV 文件。文件的第一行完美地写入数据库,但在尝试将相同
我正在使用 Jackcess 来帮助进行数据库连接。当我的程序在我的计算机上运行并连接到在 Access 2013 中运行的数据库时,我的程序没有任何问题。 我现在已将其切换到另一台使用 Access
我有一张 Jackcess table ,一切都工作正常。但我找不到任何有关如何更改 Jackcess 表中的列名称的信息。 我想要更改列名的原因是我有一个 ResultSet,它使用 Jackces
我想在像这样创建的 jackcess 表中插入一行; Table t = Database.open(new File(dbUrl)).getTable(tname); 通常,如果我使用 SQL,这将
如何在 jackcess 的帮助下从表中删除行?我尝试这样做,但它很糟糕: Table ptabl = db.getTable("person"); int pcount = ptab
我执行了我的代码,但我不明白为什么循环的运行时间非常长。 有两个循环。第一个循环在 Invoices 表上,第二个循环在 InvoicesLignes 表上。 InvoicesLignes表有一个索引
我需要在 .mdb Access 文件上读取和写入一些数据,通过网络我找到了 Jackcess正是这样做的库。 不幸的是,我找不到任何文档来使用它。在图书馆网站上有几个例子,但没有真正的文档。谁能告诉
我有一个应用程序,它以 xml 格式从 YQL 表 yahoo.finance.quotes 下载财务数据,然后将此数据写入 MS Access 数据库。我正在使用 Jackcess 与数据库交互,但
我正在使用 Jackcess 库 Access Java 上的 MS Access 数据库,我想知道如何通过多个列值查找表格行。 到目前为止,每次我需要按一列值查找一行时,我都遵循此过程: Row r
有没有办法列出 MDB 文件中所有表的名称?我正在尝试创建一个程序来测试用户的 Quizbowl 问题。我想组织问题和答案,以便每个问题集都位于自己的表格中。简而言之,我不熟悉 Jackcess 的
我正在尝试找出是否可以使用 select 在jackcess (v3.0.0)中。我有一个数据库,我想从中显示从 x 到 y 范围内的项目。可以在jackcess中写这个吗?我在 jackces 的文
我正在使用 Jackcess 库,尝试使用以下代码将一些 csv 文件导入到 Access 文件: Database db = DatabaseBuilder.open(new File("my.md
我正在开发一个基于 eclipse 插件的 RCP 应用程序。在我的一个插件项目中,我添加另一个插件项目作为依赖项。假设项目 A 将项目 B 作为其 list 下定义的依赖项。项目 B 包含 jack
我发现了一个名为 Jackcess 的很棒的库,它允许您使用 Microsoft Access 进行转换、解析创建等操作。 目标是转换,此代码成功完成。 导出时有一个过滤功能,可以在下面的文档链接中看
我是 Jackcess 的新手。我必须在 Jackcess 的帮助下从数据库中选择一列,然后将该列的值放入一个数组中。 我怎样才能在 Jackcess 的帮助下做到这一点? 最佳答案 以下代码检索 [
我使用这段代码将数据从 access db 传递到数组 try { for(i=0;i rowdata = new HashMap(cur.getNextRow()); for
我使用 Jackcess 2.1.5 从 Access 2003 表中读取数据,该表在 colA 和 colB 上具有多列索引。给定 colA 和 colB 的值,此方法效果很好。 理论上,这样的索引
在我的 Access 数据库表中,我有一个 cmt_data 列,其中包含一个字符串。例如: Check in the packet TM(12,9) MRSS0319 'Monitoring Lis
我有一个 MS-Access 数据库,其中包含“加密”字符串。这些看起来像这样: 但是,我很快注意到这些字符串的长度与明文的长度完全匹配(我知道明文)。因此,通过尝试使用 Excel,我发现如果您使用
我使用 Jackcess 在 Java 中处理 MS-Access 表: Database mdb = Database.open(new File(myPath)); Table myTable =
我是一名优秀的程序员,十分优秀!