![](/img/trans.png)
[英]Listener refused the connection with the following error: ORA-12519, TNS:no appropriate service handler found
[英]java.sql.SQLException: Listener refused the connection with the following error: ORA-12519, TNS:no appropriate service handler found
我將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+"')");
}
我沒有得到如何處理此異常。
您的多線程應用程序打開了太多的連接/會話。 因此,監聽器暫時停止並阻止新連接。
首先檢查數據庫資源使用情況:
SELECT * FROM v$resource_limit WHERE resource_name IN ('processes','sessions');
檢查您的進程或會話的MAX_UTILIZATION是否過於接近LIMIT_VALUE。 如果是,您應該:
Connection
對象。 要么, 實際上,應始終完成連接池(#1)。 否則應用程序無法擴展。 有關詳細信息,請查看Apache Commons DBCP 。 對於#2,以SYSTEM身份打開一個新的SQL * Plus會話並運行:
ALTER system SET processes=<n-as-per-number-of-threads> scope=spfile;
增加后端並發性。 然后重新啟動數據庫。 重要!
我想數據庫只是不接受來自主機的更多連接。 如果我理解你的問題,你可能會制作100個線程,每個線程在短時間內連接到數據庫。 也許您甚至沒有正確關閉連接,或者訪問持續時間太長以至於打開了大量連接。 數據庫具有接受連接的限制。
你應該通過一些聰明的技術減少連接數量。 也許減少並發線程的數量和/或使用連接池。
在你的最后嘗試這個解決方案。 它對我有用。 關閉try / catch塊中的連接,在關閉連接后,寫入 -
Thread.sleep(1000);
在這種情況下,您可以將其寫為 -
finally {
try {
if (conn != null && !conn.isClosed())
{
conn.close();
Thread.sleep(1000);
}
}
catch (SQLException e) {
e.printStackTrace();}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.