簡體   English   中英

Java JDBC中的太多客戶端任務異常

[英]Too Many Client Task Exception in Java JDBC

我正在通過JAVA程序創建JDBC ODBC連接。 我必須多次進行這種連接。 一段時間后,程序將引發“太多客戶端任務異常”。 如何才能解決這個問題。 我正在粘貼我的要求的示例示例

class connectiondemo
{

public void connect()
{

 try {

   Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
   Connection con=DriverManager.getConnection("Jdbc:Odbc:dsn");
   Statement st= con.createStatement();

   }

  catch(Exception ex)
  {
   ex.printStackTrace();
  }
 }
}


calling programs

 class 
 {
  public static void main(String args[])

   {
    //supose i have to call connect methods thousands of times then what is the solution

    connectdemo demo= new connectdemo();
   dem0.connect();

   }
  }

似乎您打開的數據庫連接過多,沒有關閉它們。 在該連接上執行jdbc語句時,需要確保在完成連接后關閉連接。 但是,如果您忘記了,Java的垃圾收集器將在清理過時的對象時關閉連接。

依靠垃圾回收,特別是在數據庫編程中,是非常差勁的編程實踐。 您應該養成始終使用與連接對象關聯的close()方法關閉連接的習慣。

也許添加一個finally塊應該對您有幫助,如下所示:

Connection con = null;
 try {

   Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
   con=DriverManager.getConnection("Jdbc:Odbc:dsn:);
   Statement st= con.createStatement();

   }

  catch(Exception ex)
  {
   ex.printStackTrace();
  } finally {
      try{
          con.close();
      } catch (Exception e) {
      }
  }
 }

您實際上需要多少個連接? 選項包括:

  • 全局存儲並使用多次的單個連接(僅連接一次)。
  • 一個連接池,其中包含一些在連接池啟動時連接的連接。 這允許多個線程(幾乎)同時訪問數據庫。

我懷疑第一種選擇可能是適合您的應用程序的選擇。 在這種情況下,請連接一次並共享連接,否則您的DBA可能會有話要說:

public static Connection getConnection() {
    if(connection == null) {
        //make and store connection globally
    }
    return connection;
}

public static void closeConnection() {
     if(connection != null) {
          //close connection
     }
}

public void clientMethod() {
    <SomeClass>.getConnection().prepareStatement("whatever");
}

建立數據庫連接是一項昂貴的工作,並且將對應用程序的性能產生顯着影響,請盡可能少地執行幾次。

關鍵是保存連接。為什么不使用靜態方法來調用連接,如下所示:

public class Connector {

private static final String URL = "jdbc:mysql://localhost/";
private static final String LOGIN = "root";
private static final String PASSWORD = "azerty";
private static final String DBNAME = "videotheque";
private static Connector connector;
private static Connection connection;

private Connector() {
}

public synchronized static Connector getInstance() {
    if (connector == null) {
        connector = new Connector();
    }
    return connector;
}

public static Connection getConnection() {
    if (connection == null) {
        Connection c = null;
        try {
            Class.forName("com.mysql.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        try {
            c = DriverManager.getConnection(URL + DBNAME, LOGIN, PASSWORD);
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        return c;
    }
    return connection;
}

對於連接,您可以將其用作:

Connector.getInstance().getConnection()

由於許多原因,這看起來不好看。 考慮到您的編程水平,我建議您不要嘗試自己編寫此代碼。 更好地獲取和使用其他人編寫的連接池,例如Apache DBCP庫。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM