リソースを適切に閉じているにもかかわらず、MYSQLがデータを取得する接続が多すぎる

パワン

私はmysql5.0を使用していますが、データが多すぎる接続エラーが頻繁に発生します。finallyブロック内のすべての接続を閉じていると確信しています。

これはデータベース接続を取得するための私のクラスです

public class DBConnection {

    final static Logger logger = Logger.getLogger(DBConnection.class);
     private static DataSource dataSource;
        static {
            try {
                  dataSource = (DataSource) new InitialContext().lookup("java:/comp/env/jdbc/REDEX");
            } catch (NamingException e) {
                logger.error("NamingException Occured" , e);
                e.printStackTrace();
                try {
                  //  throw new Exception("'jndifordbconc' not found in JNDI",e);

                } catch (Exception e1) {

                    //logger.error("Exception Occured" , e1);
                    logger.error("NamingException Occured" , e1);
                        e1.printStackTrace();

                }
            }
        }

        public static Connection getDBConnection() {
            try {
                return dataSource.getConnection();
            } catch (SQLException e) {
                logger.error("Exception Occured Under getDBConnection" , e);
                return null;
            }

        }


    public static void close(Connection con)
    {
        if (con != null)
        {
            try
            {
                con.close();
            }
            catch (SQLException e)
            {
                logger.error("Exception Occured inside close " , e);
            }
        }
    }

    public static void close(Statement stmt, ResultSet rs) 
    {
        if (rs != null)
        {
            try
            {
                rs.close();
            }
            catch (SQLException e)
            {
                logger.error("Exception Occured while closing resultset " , e);
            }
        }
        if (stmt != null)
        {
            try
            {
                stmt.close();
            }
            catch (SQLException e)
            {
                logger.error("Exception Occured while closing statement " , e);
            }
        }
    }
}

接続プーリング設定

<ResourceLink name="jdbc/REDEX"
                global="jdbc/REDEX"
                type="javax.sql.DataSource" />

<Resource name="jdbc/REDEX"
      global="jdbc/REDEX"
      type="javax.sql.DataSource"
      auth="Container"
      driverClassName="com.mysql.jdbc.Driver"
      url="jdbc:mysql://localhost:3306/REDEX?allowMultiQueries=true"
     factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
      username="root"
      password="xxxxx@123"
    initialSize="100"
      maxActive="100"
      maxIdle="20"
     minIdle="10"
    suspectTimeout="60"
    timeBetweenEvictionRunsMillis="30000"
    minEvictableIdleTimeMillis="60000"
   validationQuery="SELECT 1"
   validationInterval="34000"
  testOnBorrow="true"
   removeAbandoned="true"
  removeAbandonedTimeout="55"
  />

サンプルJavaクラス接続をどのように使用して閉じていますか

public class GetBrands {
    final static Logger logger = Logger.getLogger(GetBrands.class);
    @GET
    @Consumes("application/text")
    @Produces("application/json")
    public String getAllBrands() throws JSONException 
    {
        logger.error("the GetBrands got called");
        Connection dbConnection = null;
        PreparedStatement getAllBrandsPst = null ;
        ResultSet getAllBrandsResltSet = null;
        JSONArray jsonarray_listedBrands = new JSONArray();
        JSONObject jsonObj_allbrands = new JSONObject();
        try
        {
            dbConnection = DBConnectionOrient.getDBConnection();
            getAllBrandsPst = dbConnection.prepareStatement("select distinct listedBrandName,listedbrandID from tbl_listedBrand  group by listedBrandName");
            getAllBrandsResltSet = getAllBrandsPst.executeQuery();
            while(getAllBrandsResltSet.next())
            {
                //
            }
            jsonObj_allbrands.put("brands", jsonarray_listedBrands);
        }
        catch(Exception e)
        {
            logger.error("Exception Occured" , e);
        }
        finally
        {
            DBConnectionOrient.close(getAllBrandsPst,getAllBrandsResltSet);
            DBConnectionOrient.close(dbConnection);
        }

        String  response = "jsonCallback("+jsonObj_allbrands.toString()+")";
        return response;
    }
}

これは私がログで取得している例外です

SEVERE: Unable to create initial connections of pool.
com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Data source rejected establishment of connection,  message from server: "Too many connections"
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
    at com.mysql.jdbc.Util.getInstance(Util.java:386)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1014)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:988)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:974)
    at com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1110)
    at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2465)
    at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2498)
    at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2283)
    at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:822)
    at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:47)
    at sun.reflect.GeneratedConstructorAccessor10.newInstance(Unknown Source)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
    at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:404)
    at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:317)
    at org.apache.tomcat.jdbc.pool.PooledConnection.connectUsingDriver(PooledConnection.java:278)
    at org.apache.tomcat.jdbc.pool.PooledConnection.connect(PooledConnection.java:182)
    at org.apache.tomcat.jdbc.pool.ConnectionPool.createConnection(ConnectionPool.java:701)
    at org.apache.tomcat.jdbc.pool.ConnectionPool.borrowConnection(ConnectionPool.java:635)
    at org.apache.tomcat.jdbc.pool.ConnectionPool.init(ConnectionPool.java:486)
    at org.apache.tomcat.jdbc.pool.ConnectionPool.<init>(ConnectionPool.java:144)
    at org.apache.tomcat.jdbc.pool.DataSourceProxy.pCreatePool(DataSourceProxy.java:116)
    at org.apache.tomcat.jdbc.pool.DataSourceProxy.createPool(DataSourceProxy.java:103)
    at org.apache.tomcat.jdbc.pool.DataSourceFactory.createDataSource(DataSourceFactory.java:554)
    at org.apache.tomcat.jdbc.pool.DataSourceFactory.getObjectInstance(DataSourceFactory.java:242)
    at org.apache.naming.factory.ResourceFactory.getObjectInstance(ResourceFactory.java:141)
    at javax.naming.spi.NamingManager.getObjectInstance(NamingManager.java:321)
    at org.apache.naming.NamingContext.lookup(NamingContext.java:842)
    at org.apache.naming.NamingContext.lookup(NamingContext.java:153)
    at org.apache.naming.NamingContext.lookup(NamingContext.java:830)
    at org.apache.naming.NamingContext.lookup(NamingContext.java:167)
    at org.apache.catalina.core.NamingContextListener.addResource(NamingContextListener.java:1103)
    at org.apache.catalina.core.NamingContextListener.createNamingContext(NamingContextListener.java:682)
    at org.apache.catalina.core.NamingContextListener.lifecycleEvent(NamingContextListener.java:271)
    at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:117)
    at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:90)
    at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:731)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.startup.Catalina.start(Catalina.java:689)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:321)
    at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:455)

複数ある場合は、この方法に従うことができます

finally {
    try {
        DBConnectionOrient.close(getAllBrandsPst,getAllBrandsResltSet);
 DBConnectionOrient.close(getAllBrandsPst2,getAllBrandsResltSet2);
    } catch (Exception e) {}
    try {
        DBConnectionOrient.close(dbConnection);
    } catch (Exception e) {}
}
Tim Biegeleisen

コードに潜在的な問題が1つあります。これは、閉じられていないぶら下がっているデータベース接続の原因である可能性があります。次の2行のコードに注意を向けます。

DBConnectionOrient.close(getAllBrandsPst,getAllBrandsResltSet);
DBConnectionOrient.close(dbConnection);

DBConnectionOrient.close()ステートメントと結果セットの最初の呼び出し中に例外が発生した場合、データベース接続が閉じられることはないことを認識してください。これを行うためのより安全な方法は次のとおりです。

finally {
    try {
        DBConnectionOrient.close(getAllBrandsPst,getAllBrandsResltSet);
    } catch (Exception e) {}
    try {
        DBConnectionOrient.close(dbConnection);
    } catch (Exception e) {}
}

これで、ステートメントと結果セットを閉じる際に問題が発生した場合でも、データベース接続を閉じようとします。

JDBC呼び出しで従う必要のある一般的なミームは次のとおりです。

Connection con = null;
Statement stmt = null;
ResultSet rs = null;

try {
    // get a connection, statement and result set, in this order
    // make your JDBC calls here
} catch (Exception e) {
    // handle all exceptions here
} finally {
     try {
         try {rs.close();} catch (Exception e) {}
         try {stmt.close();} catch (Exception e) {}
          // Note that we will attempt to close the database connection even
          // if something went wrong with closing the statement or result set
         try {con.close();} catch (Exception e) {}
     } catch (Exception e) {  }
}

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

接続が閉じられているにもかかわらず、「作成されるclose_wait接続が多すぎる」を修正するにはどうすればよいですか?

分類Dev

Camel jdbc:mysql接続が閉じられた場合にデータソースをリセットするにはどうすればよいですか?

分類Dev

ステートメントが適切に閉じられているにもかかわらず、Doエラーなしでループする

分類Dev

データベースから必要なデータを取得できず、接続を閉じるときにエラーが発生する

分類Dev

データベース間を循環すると、閉じられない接続のリークが発生し、「接続が多すぎる」

分類Dev

基になる接続が閉じられました:接続が予期せず閉じられました。データが大きすぎますか?

分類Dev

アプリが閉じている間にサーバーからデータを取得する

分類Dev

接続ごとにJNDIから新しいデータソースを取得する必要がありますか?

分類Dev

どのデータベースに接続するかを事前に知らなくても、データベースからオブジェクトのリストにデータを取得する方法についてのアドバイスが必要です

分類Dev

UI5は、デバッグがオフになっているにもかかわらず、デバッグソースをロードし続けます

分類Dev

2つのデータフレームが同じスキーマを持っているにもかかわらず、SparkScalaユニオンが失敗する

分類Dev

データベースによって接続が閉じられている場合、手動で閉じる必要がありますか?

分類Dev

Nodejs + SocketIO + MySql接続が適切に閉じず、データベースのオーバーヘッドが発生する

分類Dev

データソースからの接続を閉じる必要がありますか?

分類Dev

「リソースを閉じる必要がある」というルールは、接続が閉じられていることをどのようにチェックしますか?

分類Dev

PHPがデータをフェッチしているにもかかわらず、PHPへのjQueryGETリクエストが失敗する

分類Dev

gitでssh_exchange_identificationを取得するのはなぜですか:リモートホストによって接続が閉じられましたか?

分類Dev

短いPythonスクリプトでデータベース接続を閉じる必要がありますか?

分類Dev

私の春のプロジェクトにMySQLデータベースを接続するカント(すべてのポストにもかかわらず、私読んだことがあります)

分類Dev

スキーマ(MySQL)からデータをインポートするときに開いているファイルが多すぎます

分類Dev

データベースに接続しているにもかかわらず、mysqliクエリ応答は空のままです

分類Dev

Android Studioで適切な角かっこを使用しているにもかかわらず、式で予期されるエラーが発生する

分類Dev

MySQL接続エラー(golangを使用):show processlistを実行している接続が多すぎ、スリープ接続が多すぎ(8000以上)

分類Dev

データベースに保存した後、mongoose node.js接続を閉じる必要がありますか?

分類Dev

Linux AWSボックスにSSHで接続しましたが、AWSボックスで実行されているスクリプトを閉じずにターミナルを終了するにはどうすればよいですか?

分類Dev

存在するにもかかわらず、c#をオーバーライドする適切なメソッドが見つかりませんか?

分類Dev

存在するにもかかわらず、c#をオーバーライドする適切なメソッドが見つかりませんか?

分類Dev

データがDB /モデルにあるにもかかわらず、FastAPIがネストされたスキーマを取得していません

分類Dev

データがDB /モデルにあるにもかかわらず、FastAPIがネストされたスキーマを取得していません

Related 関連記事

  1. 1

    接続が閉じられているにもかかわらず、「作成されるclose_wait接続が多すぎる」を修正するにはどうすればよいですか?

  2. 2

    Camel jdbc:mysql接続が閉じられた場合にデータソースをリセットするにはどうすればよいですか?

  3. 3

    ステートメントが適切に閉じられているにもかかわらず、Doエラーなしでループする

  4. 4

    データベースから必要なデータを取得できず、接続を閉じるときにエラーが発生する

  5. 5

    データベース間を循環すると、閉じられない接続のリークが発生し、「接続が多すぎる」

  6. 6

    基になる接続が閉じられました:接続が予期せず閉じられました。データが大きすぎますか?

  7. 7

    アプリが閉じている間にサーバーからデータを取得する

  8. 8

    接続ごとにJNDIから新しいデータソースを取得する必要がありますか?

  9. 9

    どのデータベースに接続するかを事前に知らなくても、データベースからオブジェクトのリストにデータを取得する方法についてのアドバイスが必要です

  10. 10

    UI5は、デバッグがオフになっているにもかかわらず、デバッグソースをロードし続けます

  11. 11

    2つのデータフレームが同じスキーマを持っているにもかかわらず、SparkScalaユニオンが失敗する

  12. 12

    データベースによって接続が閉じられている場合、手動で閉じる必要がありますか?

  13. 13

    Nodejs + SocketIO + MySql接続が適切に閉じず、データベースのオーバーヘッドが発生する

  14. 14

    データソースからの接続を閉じる必要がありますか?

  15. 15

    「リソースを閉じる必要がある」というルールは、接続が閉じられていることをどのようにチェックしますか?

  16. 16

    PHPがデータをフェッチしているにもかかわらず、PHPへのjQueryGETリクエストが失敗する

  17. 17

    gitでssh_exchange_identificationを取得するのはなぜですか:リモートホストによって接続が閉じられましたか?

  18. 18

    短いPythonスクリプトでデータベース接続を閉じる必要がありますか?

  19. 19

    私の春のプロジェクトにMySQLデータベースを接続するカント(すべてのポストにもかかわらず、私読んだことがあります)

  20. 20

    スキーマ(MySQL)からデータをインポートするときに開いているファイルが多すぎます

  21. 21

    データベースに接続しているにもかかわらず、mysqliクエリ応答は空のままです

  22. 22

    Android Studioで適切な角かっこを使用しているにもかかわらず、式で予期されるエラーが発生する

  23. 23

    MySQL接続エラー(golangを使用):show processlistを実行している接続が多すぎ、スリープ接続が多すぎ(8000以上)

  24. 24

    データベースに保存した後、mongoose node.js接続を閉じる必要がありますか?

  25. 25

    Linux AWSボックスにSSHで接続しましたが、AWSボックスで実行されているスクリプトを閉じずにターミナルを終了するにはどうすればよいですか?

  26. 26

    存在するにもかかわらず、c#をオーバーライドする適切なメソッドが見つかりませんか?

  27. 27

    存在するにもかかわらず、c#をオーバーライドする適切なメソッドが見つかりませんか?

  28. 28

    データがDB /モデルにあるにもかかわらず、FastAPIがネストされたスキーマを取得していません

  29. 29

    データがDB /モデルにあるにもかかわらず、FastAPIがネストされたスキーマを取得していません

ホットタグ

アーカイブ