2

我正在通过 JAVA 程序创建 JDBC ODBC 连接。我不得不多次建立这种联系。一段时间后,程序会抛出 Too Many Client Task Exception 。怎么可能解决这个问题。我正在粘贴我的要求的示例

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();

   }
  }
4

4 回答 4

0

您实际需要多少个连接?选项包括:

  • 全局存储并多次使用的单个连接(仅连接一次)。
  • 一个连接池,其中包含在池启动时连接的多个连接。这允许多个线程(几乎)同时访问数据库。

我怀疑第一个选项可能适合您的应用程序。在这种情况下,连接一次并共享连接,否则您的 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");
}

建立数据库连接是一项代价高昂的工作,并且会对应用程序的性能产生显着影响,尽可能少做几次。

于 2013-07-25T11:23:56.647 回答
0

关键是保存连接。为什么不使用静态方法来调用连接,如下所示:

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()
于 2013-07-25T12:22:28.957 回答
0

由于许多原因,这是看起来很糟糕的代码。考虑到您的编程水平,我建议您不要尝试自己编写此代码。最好获取和使用别人编写的连接池,比如 Apache DBCP 库。

于 2013-07-25T12:22:38.403 回答
0

似乎您打开了太多的数据库连接而不是关闭它们。在该连接上执行 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) {
      }
  }
 }
于 2013-07-25T11:21:50.203 回答