Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在多线程中执行SQL查询(HSQLDB)_Java_Sql_Multithreading_Jdbc_Hsqldb - Fatal编程技术网

Java 在多线程中执行SQL查询(HSQLDB)

Java 在多线程中执行SQL查询(HSQLDB),java,sql,multithreading,jdbc,hsqldb,Java,Sql,Multithreading,Jdbc,Hsqldb,假设我们有一个SQL数据库(hsqldb),并希望在其上运行一些不修改内容的查询。 对于某些查询,这需要很长时间,我希望在多个线程中运行查询。 所以我的问题是:实现这一点的最佳方式是什么 我没有找到任何好的样本来做这件事,所以我提出了以下建议(我很想得到一些评论) 首先,简单地说: 我使用线程安全集合来访问查询并将结果放入。查询在多个辅助线程中执行。结果在主线程中处理,主线程检查新结果,直到所有线程完成 现在代码是: 创建查询和结果的线程安全集合: ConcurrentLinkedQueue&l

假设我们有一个SQL数据库(hsqldb),并希望在其上运行一些不修改内容的查询。 对于某些查询,这需要很长时间,我希望在多个线程中运行查询。 所以我的问题是:实现这一点的最佳方式是什么

我没有找到任何好的样本来做这件事,所以我提出了以下建议(我很想得到一些评论)

首先,简单地说: 我使用线程安全集合来访问查询并将结果放入。查询在多个辅助线程中执行。结果在主线程中处理,主线程检查新结果,直到所有线程完成

现在代码是:

创建查询和结果的线程安全集合:

ConcurrentLinkedQueue<String> queries = new ConcurrentLinkedQueue<String>()
ConcurrentLinkedQueue<ResultSet> sqlResults = new ConcurrentLinkedQueue<ResultSet>();

用于并行处理的Java标准解决方案是ThreadPoolExecutor。试试看。

好的,所以我将线程创建更改为ThreadPoolExecutor。谢谢你。但我也感兴趣的是ConcurrentLinkedQueue和SQL操作的使用。
ExecutorService executorService = Executors.newFixedThreadPool(4);
for(int i=0; i<4; i++){
    executorService.execute(new QueryThread(sqlResults, queries));
}
private class QueryThread implements Runnable {
    private ConcurrentLinkedQueue<ResultSet> sqlResults;
    private ConcurrentLinkedQueue<String> queries;

    public QueryThread(ConcurrentLinkedQueue<ResultSet> sqlResults, ConcurrentLinkedQueue<String> queries){
        this.sqlResults = sqlResults;
        this.queries = queries;
    }

    @Override
    public void run(){
        Connection connThr = null;
        try{
            try {
                connThr = DriverManager.getConnection(dbModeSave, "sa", "");
                connThr.setAutoCommit(false);
            } catch (SQLException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }

            String currentQuery;
            do {
                currentQuery = queries.poll(); // get and remove element from remaining queries
                if (currentQuery != null) { // only continue if element was found
                    try {
                        Statement stmnt = connThr.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
                        try {
                            ResultSet resultSet = stmnt.executeQuery(currentQuery);
                            sqlResults.add(resultSet);
                        } catch (SQLException e) {
                            // (Do something specific)
                        } finally {
                            stmnt.close();
                        }
                    } catch (SQLException e) {
                        // (Do something specific)
                    }
                }
            } while (currentQuery != null);

        } finally {
            if (connThr != null) {
                try {
                    connThr.close();
                } catch (SQLException e) {
                    // Nothing we can do?
                }
            }
        }
    }
}
while (!executorService.isTerminated()) {
    try {
        Thread.sleep(100);
    } catch (InterruptedException e) {
        Thread.currentThread().interrupt();
    }
    while (!sqlResults.isEmpty()) {
        ResultSet result = sqlResults.poll();
        //process result and close it in the end
    }
}