如何使用多个线程从数据库中读取数据,我在数据库中有16个表,我想使用多个线程并行读取这些表中的数据。
答案 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)
您有几种选择。
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;
}