如何使用Java在不同的线程或不同的进程上运行不同的sql查询

时间:2017-03-06 10:42:58

标签: mysql database multithreading jdbc

我只想知道如何在不同的线程或单独的进程上运行不同的SQL查询。例如:

如果我从JDBC发送SQL查询(SQL1)并且运行需要很长时间,我应该能够发送另一个SQL查询(SQL2),这可能需要更短的时间来完成执行。我希望此查询在单独的线程或进程上运行,以便它不必等待SQL1完成。

2 个答案:

答案 0 :(得分:0)

MySQL JDBC驱动程序(Connector / J)是线程保存。所以你可以在同一个数据库上启动两个执行不同操作的线程。只需在每个Thread上启动一个不同的连接。请记住,thread1上的SQL Lock可以阻止thread2。

简单的例子。不要使用旧学校Class.forName("com.mysql.jdbc.Driver")。 JDBC4将使用连接URL中的数据为您完成此操作。主线程将启动两个线程并等待两者完成。两个线程都填充了虚拟查询。

public class TestThreads {
    public static class Thread1 implements Runnable {
        @Override
        public void run() {
            try {
                Connection connection = DriverManager
                        .getConnection("jdbc:mysql://localhost/test?"
                                + "user=myuser&password=mypassword");

                Statement statment = connection.createStatement();

                statment.executeQuery("select * from `table1`");

                [...]

            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

    public static class Thread2 implements Runnable {
        @Override
        public void run() {
            try {
                Connection connection = DriverManager
                        .getConnection("jdbc:mysql://localhost/test?"
                                + "user=myuser&password=mypassword");

                Statement statment = connection.createStatement();

                statment.executeQuery("select * from `table2`");

                [...]

            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

    public static void main(String[] args) {
        Thread thread1 = new Thread(new Thread1());
        Thread thread2 = new Thread(new Thread2());

        thread1.start();
        thread2.start();

        try {
            thread1.join(1000000);
            thread2.join(1000000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

答案 1 :(得分:0)

如果您需要ResultSet,则为不同的查询编写创建不同的线程。执行是一个阻止过程。因此,您必须创建不同的线程,以便在同一进程中运行不同的查询。