我有一个线程,它创建与 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/