我想创建程序的多线程部分(使用 GUI),以便使用 Fork/Join Framework
和 RecursiveAction
从非常大的数据库表(超过 30kk 行)加载数据> 类,因为许多小查询的执行速度比一个大查询的执行速度更快,经过实验检查。
例如,每个 fork 从需要的 1000 行中加载 50 行。如下所示:
class ForkLoader extends RecursiveAction{
private static Connection con;
private Map<Integer, Double> map; //In our case ConcurrentHashMap
private final static int seqThreshold=50;
private List<Integer> id; //List with id_field in DB table
int start,end;
{
try {
con=DriverManager.getConnection("jdbc:mysql://some_ip/some_db","username", "password");
} catch (SQLException e) {
e.printStackTrace();
}
}
public ForkLoader(Map<Integer, Double> map, List<Integer> id,int start, int end){
this.map=map;
this.start=start;
this.end=end;
this.id=id;
}
@Override
protected void compute() {
if((end-start)<seqThreshold){
try {
Statement stmt=con.createStatement();
for(int i=start;i<end;i++){
String query="text of some query" + id.get(i);
ResultSet rs=stmt.executeQuery(query);
map.put(id.get(i), /*some double form result set*/);
}
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
} else {
int middle=(start+end)/2;
invokeAll(new ForkLoader(map, id, start, middle), new ForkLoader(map, id, middle,end));
}
}
}
为所有 fork 使用一个静态
连接是否是线程安全的?如果您知道解决此任务的更好方法,请展示
最佳答案
通常此类应用程序会使用连接池来实现这一点,这样每个线程都可以独占一个连接,如果同时拥有的线程数多于连接数,则未分配连接的线程必须等等。
如果您想要一个实现连接池的框架,您可以检查这些:
- Apache Commons DBCP http://commons.apache.org/proper/commons-dbcp/
- C3PO http://sourceforge.net/projects/c3p0/
- Apache jdbc-pool http://tomcat.apache.org/tomcat-7.0-doc/jdbc-pool.html (感谢 MRalwasser)
另一方面,也许您希望将所有线程和连接管理委托(delegate)给 EJB 容器,基本上您可以通过某些容器管理的 EJB 和连接池来实现相同的功能,您可以检查以下容器:
- Apache TomEE http://tomee.apache.org/
- Oracle Glassfish https://glassfish.java.net/
- Apache OpenEJB(如果您只需要 EJB 容器而不需要完整的 Java EE 平台)
关于java - JDBC连接并发充足性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24165529/