【发布时间】:2019-10-26 09:02:10
【问题描述】:
我在具有 8 GB RAM 的 Windows 10 64 位上使用 JDK 1.8。
我有一个 Swing 应用程序。
在应用程序中,我查询了一个 DB2 数据库。
该查询返回每个表的数据库表名称和查询条件的列表。
这些表存在于单独的 SQL Server Express 数据库中。
我的 Swing 应用程序为每个 SQL Server Express 数据库表创建一个单独的 JComboBox,并使用接收到的条件查询该表,并使用查询结果填充 JComboBox 模型。
我遍历 DB2 查询的结果,并为每一行创建一个新的 JComboBox 并启动一个新的 SwingWorker 来查询 SQL Server Express 数据库。
最初我的应用程序在 Windows 7 上使用 JDK 1.5 运行。
当然SwingWorker 在 1.5 版中不是 JDK 的一部分,所以我使用了第三方实现。
原始版本运行良好,但是在 Windows 10 上迁移到 JDK 1.8 后,完成所有这些初始化需要更多时间。
使用 VisualVM,时间增加是由于 SwingWorker 线程在类 LockSupport 的方法 park() 中等待。
我测量了执行过程中每个单独步骤所花费的时间,其中大多数需要百分之几秒才能完成,所有步骤的总时间不超过三秒。
我尝试在 JDK 1.8 版本中使用我的 JDK 1.5 应用程序中的 SwingWorker 实现,但所用时间没有改变。
我怎样才能发现是什么导致某些SwingWorker 线程在方法park() 中花费大约6 秒?
或者,我怎样才能改变我的设计以避免这个问题?
部分[伪]代码...
JPanel panel = new JPanel();
Connection db2Conn = // Connect to DB2
Statement s = db2Conn.createStatement();
ResultSet rs = s.executeQuery("SQL query");
while (rs.next()) {
new ListTask(panel, /* data from 'rs' */).execute();
}
class ListTask extends SwingWorker<Void, Void> {
// JComboBox will be added to this. See method 'done()'
private JPanel panel;
// Name of table in database.
private String tableName;
// Criteria for querying 'tableName'.
private List<String> criteria;
// Results of query.
private Object[] results;
public ListTask(JPanel aPanel, String table, List<String> where) {
panel = aPanel;
tableName = table;
criteria = where;
}
protected void doInBackground() {
// Populate "results"
return null;
}
protected void done() {
JComboBox<Object> combo = new JComboBox(results);
panel.add(combo);
}
}
VisualVM 屏幕截图:
【问题讨论】:
-
你关闭 SQL 连接了吗?
-
@MikhailIonkin 是的,我关闭了所有 SQL 连接。
-
原来问题是我在 Windows 10 64 位上使用 JDK 1.8 32 位编译和运行。
标签: java swing swingworker