1

私のアプリケーションは呪われていると思います。デバッグは必要な場所に行きますが、その理由はわかりません。行ごとのデバッグは、コメント行も分析しているようです。問題は接続方法にあると思います。パフォーマンスが大幅に低下し、3 番目 (または 4 番目の nvm) の接続で次のエラーが発生します。

com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Too many connections

DBにアクセスするたびに接続を閉じると確信しています(実装のtry catchからfinallyステートメントを使用)。

これが私の接続クラスです:

package Connection;

import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.rmi.RemoteException; import java.sql.*; import java.util.Properties;

public class ConnectionDB {         
    public static ResultSet rs = null;  
    public static Statement stat = null;    
    public static Connection cn = null;

    public static void connect() throws RemoteException     {
            String dbHost="",dbUser="",dbPassword="";
            Properties prop=new Properties();
            try
            {
                //carico il file:
                prop.load(new FileInputStream("***/config.properties"));
                //Leggo le proprietà del file:
                dbHost=prop.getProperty("host");
                dbUser=prop.getProperty("user");
                dbPassword=prop.getProperty("password");
            }catch(FileNotFoundException fe){
                System.out.println("config file not found");
            }catch(IOException ex){
                System.out.println("Error reading config file");
            }
            try 
            {
                String driver = "com.mysql.jdbc.Driver";
                Class.forName(driver);
                dbHost = "jdbc:mysql://"+dbHost;
                cn = DriverManager.getConnection(dbHost,dbUser,dbPassword);
                stat = cn.createStatement();
            }catch(SQLException e){
                System.out.println("Can't connect to the DB");
            }
            catch(ClassNotFoundException cln){
                System.out.println("Error using JDBC driver");
            }   
    }   

    public static void disconnect() throws RemoteException  {
            try{
                if(rs != null) rs.close();
                if(stat != null) stat.close();
                if(cn != null) cn.close();
            }
            catch(SQLException sqlEx){
                System.out.println("Error: disconnect");
            }   
      }
}
4

5 に答える 5

2

切断メソッドは、次の拡張が必要になる場合があります。この例では、ResultSet、Statement、および Connection を個別に閉じます。これにより、個々の例外によって接続オブジェクトが閉じられないという状況が回避されます。

public static void disconnect() throws RemoteException {
        try{
            if(rs != null) rs.close();
        }
        catch(SQLException sqlEx){
            System.out.println("Error: disconnect");
        }   


        try{
           if(stat != null) stat.close();
        }
        catch(SQLException sqlEx){
            System.out.println("Error: disconnect");
        }   

        try{
            if(cn != null) cn.close();
        }
        catch(SQLException sqlEx){
            System.out.println("Error: disconnect");
        }   
  }
于 2012-07-19T18:56:39.250 に答える
0

あなたが試すことができると思ういくつかのオプションがあります:

于 2012-07-19T15:39:04.270 に答える
0

これを試して

if(cn == null){
    String driver = "com.mysql.jdbc.Driver";
    Class.forName(driver);
    dbHost = "jdbc:mysql://"+dbHost;
    cn = DriverManager.getConnection(dbHost,dbUser,dbPassword);
}
于 2014-05-13T12:01:47.153 に答える
0

通常、ユーザーが利用できる接続の数は限られています。さらに、接続の確立はコストのかかる操作です。したがって、パフォーマンスの問題が発生した場合は、接続プールの使用を開始する必要があります。接続プールについての 説明

コードに関しては、必ず最終ブロックで接続を解放してください。また、実行するクエリの種類もわかりません。クエリを印刷し、mysql で手動で実行してみて、問題が Java ではなく SQL にあるのかどうかを確認してください。また、FileInputStream を閉じることはありません。つまり、ファイル ハンドラーが不足する可能性があります。

ループ内で同じステートメントを実行する場合は、PreparedStatements とバッチ更新およびトランザクションの使用を検討してください。トランザクションを使用する場合は、コミットされていない状態のデータがあまりないことを確認してください。

クエリのパフォーマンスを分析したい場合は、JAMon (Java Application Monitor)を使用できます。

接続数を増やすようにという提案は、下痢の人にもっと食べるようにアドバイスするのと似ています。

于 2012-07-19T16:58:26.460 に答える