java - 为什么单线程使我的 Java 程序速度如此之快?

标签 java sql multithreading performance

我的任务是创建一个 SQL 数据库并用 Java 创建一个 GUI 来访问它。我几乎已经有了它,但我有一个关于线程的问题。今天之前,我没有在程序中使用任何线程,因此,为了从数据库中提取 150 条记录,我必须等待大约 5 - 10 秒。这非常不方便,我不确定是否可以解决这个问题。今天,我在互联网上查找了有关在与我的程序类似的程序中使用线程的信息,我决定在此方法中仅使用一个线程:

public Vector VectorizeView(final String viewName) {
    final Vector table = new Vector();
    int cCount = 0;
    try {
        cCount = getColumnCount(viewName);
    } catch (SQLException e1) {
        e1.printStackTrace();
    }
    final int viewNameCount = cCount;

    Thread runner = new Thread(){

        public void run(){
            try {
                Connection connection = DriverManager.getConnection(getUrl(),
                        getUser(), getPassword());
                Statement statement = connection.createStatement();
                ResultSet result = statement.executeQuery("Select * FROM "
                        + viewName);
                while (result.next()) {
                    Vector row = new Vector();
                    for (int i = 1; i <= viewNameCount; i++) {
                        String resultString = result.getString(i);
                        if (result.wasNull()) {
                            resultString = "NULL";
                        } else {
                            resultString = result.getString(i);
                        }
                        row.addElement(resultString);

                    }
                    table.addElement(row);
                }
            } catch (SQLException e) {

                e.printStackTrace();
            }
        }
    };
    runner.start();
    return table;

}

我真正改变的唯一一件事是添加线程“运行程序”,性能呈指数级增长。通过这种方式,几乎可以立即提取 500 条记录。

该方法之前看起来像这样:

public Vector VectorizeTable(String tableName) {

    Vector<Vector> table = new Vector<Vector>();
    try {
        Connection connection = DriverManager.getConnection(getUrl(),
                getUser(), getPassword());
        Statement statement = connection.createStatement();
        ResultSet result = statement.executeQuery("Select * FROM "
                + tableName);
        while (result.next()) {
            Vector row = new Vector();
            for (int i = 1; i <= this.getColumnCount(tableName); i++) {
                String resultString = result.getString(i);
                if (result.wasNull()) {
                    resultString = "NULL";
                } else {
                    resultString = result.getString(i);
                }
                row.addElement(resultString);

            }
            table.addElement(row);
        }
    } catch (SQLException e) {

        e.printStackTrace();
    }
    return table;
}

我的问题是为什么带线程的方法比不带线程的方法快得多?我不在程序中的任何地方使用多线程。我在网上查了一下,但似乎没有什么可以回答我的问题。

任何人可以提供的任何信息将不胜感激。我是线程 XO 的菜鸟

如果您需要任何其他附加信息来帮助了解正在发生的情况,请告诉我!

答案:

看看亚伦的回答,这根本不是线程的问题。我现在感觉很菜鸟:(。谢谢@Aaron!

最佳答案

我认为您所做的似乎是为了使数据库加载速度更快,因为 VectorizeView 方法在数据加载之前返回。然后加载将在后台进行,并在(可能)与之前相同的时间完成。

您可以通过在 thread.start() 调用后添加 thread.join() 调用来测试这一理论。

<小时/>

如果发生这种情况,您可能需要采取一些措施来阻止应用程序的其他部分在加载完成之前访问 table 对象。否则,如果用户在启动后过早执行某些操作,您的应用程序可能会表现不正确。

<小时/>

FWIW,从数据库加载 100 或 500 条记录应该很快,除非查询本身对于数据库来说很昂贵。从表中进行简单的选择不应该是这种情况......除非您实际上是从 View 而不是表中进行选择,并且 View 设计得很糟糕。无论哪种方式,您可能最好关注为什么这样一个简单的查询花费这么长时间,而不是尝试在单独的线程中运行它。

<小时/>

在您的后续文章中,您说在 start 之后具有 join 的版本与没有它的版本一样快。

我的第一 react 是:“将 join 保留在那里。您已经解决了问题。”

但这并不能解释实际发生的情况。我现在完全困惑了。我能想到的最好的情况是,您的应用程序在当前线程上执行此操作之前所做的事情是导致此问题的原因。

也许您应该调查应用程序在发生这种情况的期间正在做什么。看看您是否能弄清楚所有时间都花在哪里了。

  • 获取线程转储并查看线程。
  • 在调试器下运行它以查看“暂停”发生的位置。
  • 对其进行概要分析。
  • 将应用程序日志记录设置为较高级别,看看是否有任何线索。
  • 检查数据库日志。
  • 等等

关于java - 为什么单线程使我的 Java 程序速度如此之快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6672761/

相关文章:

java - 库中的 Google 广告商 ID

mysql - 了解自连接

multithreading - 使用Delphi TThread

multithreading - 从多线程调用 uv_write,它的回调永远不会被调用

java - JAXB:列表和元素同名

java - 为什么我不能直接访问(并锁定)对象用于同步块(synchronized block)的隐式锁

Java MimeMessage 电子邮件在正文中打印标题信息

mysql - mysql命令错误

mysql - 如何在更新时加入表格

java - 我怎样才能在这场线程竞赛中区分出胜利者呢?