我将 Resultset 对象传递给每个线程。每个线程都连接到数据库并插入数据。直到线程 110 它工作正常。跨越111线程后抛出上述异常。
我正在使用 Oracle 11g。
我的示例线程代码是:
class MyThreadClass implements Runnable
{
public Connection connection;
public Statement statement2;
public ResultSet rs2;
public String cookie;
public MyThreadClass(ResultSet rs1)
{
rs2=rs1;
}
public void run()
{
try
{
cookie=rs2.getString("COOKIE");
driver = "oracle.jdbc.driver.OracleDriver";
url = "jdbc:oracle:thin:@127.0.0.1:1521:xx";
/* connection
statement2.executeUpdate("INSERT INTO visit_header VALUES ('"+cookie+"')");
}
我不知道如何处理这个异常。
最佳答案
您的多线程应用程序打开了过多的连接/ session 。因此,监听器会在一段时间内丢弃并阻止新连接。
首先检查您的数据库资源使用情况:
SELECT * FROM v$resource_limit WHERE resource_name IN ('processes','sessions');
检查您的进程或 session 的 MAX_UTILIZATION 是否太接近 LIMIT_VALUE。如果是,您应该:
- 使用数据库连接池在线程之间共享
Connection
对象。或者, - 增加 Oracle 可以同时服务的进程/ session 的数量。
实际上,连接池 (#1) 应该始终完成。否则应用程序无法扩展。检查Apache Commons DBCP了解详情。对于 #2,以 SYSTEM 身份打开一个新的 SQL*Plus session 并运行:
ALTER system SET processes=<n-as-per-number-of-threads> scope=spfile;
增加后端并发。然后重新启动数据库。重要!
关于java.sql.SQLException : Listener refused the connection with the following error: ORA-12519, TNS:找不到合适的服务处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16230446/