如何使用java中的多个线程从数据库中读取数据

时间:2017-08-03 06:03:34

标签: java multithreading jdbc concurrency

如何使用多个线程从数据库中读取数据,我在数据库中有16个表,我想使用多个线程并行读取这些表中的数据。

3 个答案:

答案 0 :(得分:1)

这是创建我们如何使用2个线程和2个表的示例。同样明智的,你可以将它用于多个表。

只需要一个连接,因为我们只是从不更新或不从表中删除的表中读取。

public class ClearPoppup implements Runnable {

    Connection c;

    private static final String DB_DRIVER = "com.mysql.jdbc.Driver";
    private static final String DB_CONNECTION = "jdbc:mysql://localhost:3306/project";
    private static final String DB_USER = "root";
    private static final String DB_PASSWORD = "****";

    public ClearPoppup() {

        try {
            Class.forName(DB_DRIVER);
            c = DriverManager.getConnection(DB_CONNECTION, DB_USER, DB_PASSWORD);
        } catch (SQLException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        ClearPoppup impClass = new ClearPoppup();

        Thread t1 = new Thread(impClass) {
            public void run() {

                Statement s;
                try {
                    s = impClass.c.createStatement();
                    ResultSet rs = s.executeQuery("select * from user");
                    while (rs.next())
                        System.out.println(rs.getInt(1) + "  " + rs.getString(2) + "  " + rs.getString(3));
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

            }
        };

        Thread t2 = new Thread() {
            public void run() {
                Statement s;
                try {
                    s = impClass.c.createStatement();
                    ResultSet rs = s.executeQuery("select * from userprofile");
                    while (rs.next())
                        System.out.println(rs.getInt(1) + "  " + rs.getString(2) + "  " + rs.getString(3));

                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }

        };

        t1.start();
        t2.start();

    }

    @Override
    public void run() {
        // TODO Auto-generated method stub

    }
}

答案 1 :(得分:0)

您有几种选择。

  1. 在每个帖子中创建一个新连接。
  2. 根据需要创建连接池并从线程获取连接。
  3. 在线程中使用之前创建单个连接并synchronize。这不会让你读取数据库"并行"但它允许您跨线程使用相同的连接。

答案 2 :(得分:0)

创建一个分区程序,它将您的所有数据集划分为将由单线程处理的子组数。

创建单个任务并通过executorservice执行。

使用countdownlatch停止主线程直到所有任务完成。

使用大小与threadpool相当的连接池。

public class  Partitioner {

    @Override
    public Map<String, SomeDomainObject> partition(int size) {

        Map<String, SomeDomainObject> result
                       = new HashMap<String, SomeDomainObject>();

        int range = 10;//calculate your range depending on threadsize.
        int fromId = 1;
        int toId = range;

        for (int i = 1; i <= size; i++) {
            SomeDomainObject value = new SomeDomainObject();
            value.setFromId(fromId);
            value.setToId(toId);
            value.setThreadName("Thread" + i);
            result.put("partition" + i, value);
            fromId = toId + 1;
            toId += range;

        }

        return result;
    }