java - JAVA中使用多线程限制oracle连接数的解决方案

标签 java multithreading

我有一个线程,它创建与 Oracle DB 的连接,读取内容并写入 csv 文件。在每个线程中,数据库中的内容都会写入单独的 csv 文件。由于与数据库建立了 n 个连接,因此抛出异常“ORA-00018:超出最大 session 数”。请提供一个解决方案来阻止它,但代码应该同时运行。下面是使用的代码。

  host s1 = new host(SYSNAME,SYSID);
  s1.start();

  class host extends Thread{
     String SYSNAME,SYSID;
     public host(String SYSNAME, String SYSID){
        this.SYSNAME = SYSNAME;
        this.SYSID = SYSID;
     }
     public void run(){
        Connection conn;
    try{
        Class.forName("oracle.jdbc.driver.OracleDriver");
        conn = DriverManager.getConnection(url, username, pwd);
        String csv_file = "AverageValuesHost-" + SYSNAME + "-" + SYSID +  "_Result.csv";
        String host_query = null;
        host_query = "My query";
        ResultSet res_host = conn.createStatement().executeQuery(host_query);

        CSVWriter wr = new CSVWriter(new FileWriter(csv_file), ',');
        wr.writeAll(res_host, true);
        wr.flush();
        wr.close();
        conn.close();
    }

最佳答案

您需要使用具有连接池的DataSource来创建连接(例如C3P0或HikariCP)。这允许您指定最大连接数,并且当连接不可用时,线程将被迫等待(直到超时)直到连接可用。

另请注意,创建更多线程并不总是完成更多工作的最佳方式。您还可以考虑使用 ExecutorService具有固定数量的线程,并将作业提交给该执行器服务。这样,一次运行的作业永远不会超过 n 个,因此您可以通过这种方式限制连接数量。

只需确保始终关闭连接(当发生异常时,当前代码无法正确执行此操作)。看try-with-resources .

关于java - JAVA中使用多线程限制oracle连接数的解决方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35763585/

相关文章:

java - 使用多个可选模式时顺序的重要性

java - 如何返回正确的结果和错误列表

java - JSF1064 : Primefaces can't load resources

c# - 从非异步运行 async() 无需等待

java - Reducer,Mapreduce,不显示错误,但不给出所需的输出

java - 如何在 Java 中使用非抽象类实现 ActionListener

java - 在 Java 集合中并行搜索

c++多线程函数调用,通过引用传递参数

multithreading - 识别linux内核模块中的错误

Java 密码填充错误