java - JDBC连接并发充足性

标签 java multithreading jdbc fork-join

我想创建程序的多线程部分(使用 GUI),以便使用 Fork/Join FrameworkRecursiveAction 从非常大的数据库表(超过 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 使用一个静态连接是否是线程安全的?如果您知道解决此任务的更好方法,请展示

最佳答案

通常此类应用程序会使用连接池来实现这一点,这样每个线程都可以独占一个连接,如果同时拥有的线程数多于连接数,则未分配连接的线程必须等等。

如果您想要一个实现连接池的框架,您可以检查这些:

另一方面,也许您希望将所有线程和连接管理委托(delegate)给 EJB 容器,基本上您可以通过某些容器管理的 EJB 和连接池来实现相同的功能,您可以检查以下容器:

关于java - JDBC连接并发充足性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24165529/

相关文章:

java - 在 JSP 中使用 MySQL 连接到 Tomcat 服务器

java 8迭代列表并按索引与另一个列表进行比较

java - Java中如何解析方法引用

java - 通过 JDBC 瘦驱动程序连接 Oracle 11g 时出现问题 (Domino Java)

multithreading - JavaFx ProgressBar 不更新

java - 如何在 Java 中执行 Oracle PLSQL block

Java parallelStream 映射丢失记录

iphone - 在这种情况下,@synchronize 是否可以防止竞争条件?

c - 在线程中使用 sleep()

java - "Batch update returned unexpected row count from update [0]; actual row count: 2; expected: 1"是什么意思