3

私はhibenateとspringを使用しており、250人のユーザーでjmeterからヒットした例外を下回っています

「原因: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: データ ソースが接続の確立を拒否しました。サーバーからのメッセージ: 「接続が多すぎます」

hibernate_cfg.xml

<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
    <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
    <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/my_db</property>
    <property name="hibernate.connection.username">user1</property>
    <property name="hibernate.connection.pool_size">1</property>
    <property name="hibernate.c3p0.min_size">5</property>
    <property name="hibernate.c3p0.max_size">50</property>
    <property name="hibernate.c3p0.timeout">300</property>
    <property name="hibernate.c3p0.max_statements">500</property>
    <property name="hibernate.c3p0.idle_test_period">3000</property>
    <property name="hibernate.current_session_context_class">thread</property>
    <property name="hibernate.hbm2ddl.auto">update</property>`

<bean id="dataSource" scope="prototype" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
    <property name="driverClassName">
        <value>${dbDriver}</value>
    </property>  
    <property name="url">
        <value>${dbURL}</value> 
    </property>
    <property name="username">
        <value>${dbUsername}</value>
    </property>
    <property name="password">
        <value>${dbPassword}</value>
    </property>
</bean>
4

4 に答える 4

7

これはサーバーからのメッセージなので、サーバーが報告している接続クライアントの数を確認します。これが 500 程度などの予想される数である場合、アプリケーションでそのレベルの同時実行が本当に予想される場合は、サーバーでこの制限を増やします。それ以外の場合は、クライアントの数を減らしてください。

どのように動作するかについての背景: 各クライアントはサーバー上のスレッドであり、各スレッドは少なくとも 1 つの接続を消費します。正しく実行している場合、スレッドが終了すると (つまり、応答がクライアントに送信されると)、接続はプールに戻ります。したがって、約 500 人のユーザーが接続している場合、最良のケースでは 500 接続になります。同時ユーザー数の倍数 (つまり、2 ユーザー、4 接続) に近い数値が表示されている場合は、スレッドごとに複数の接続を消費している可能性があります (これは、アプリケーション サーバーを使用している場合)。非常に高い数 (ユーザー数の 10 倍など) が表示されている場合は、どこかで接続リークが発生している可能性があります。これは、接続を閉じるのを忘れた場合に発生する可能性があります。

アプリケーションサーバーによって管理される EntityManager を使用し、それによって提供される DataSource を使用することを本当にお勧めします。そうすれば、接続プーリングの管理について心配する必要がなくなります。

于 2012-08-23T09:21:28.393 に答える
1

毎回接続が作成されると、この問題が発生する可能性があります。解決策は簡単です。シングルオン。各セッシンの接続。そのため、投稿の下部にいくつかのコードを公開しています。正しくないコーディングと正しいコーディングを確認してください。1-不正解、2-正解

private  EntityManagerFactory emf = null;

@SuppressWarnings("unchecked")
public BaseDAO() {


        emf = Persistence.createEntityManagerFactory("aaHIBERNATE");
        persistentClass = (Class<T>) ((ParameterizedType) getClass()
                .getGenericSuperclass()).getActualTypeArguments()[0];


}

private static EntityManagerFactory emf = null;

@SuppressWarnings("unchecked")
public BaseDAO() {

    if (emf == null) {
        emf = Persistence.createEntityManagerFactory("aaHIBERNATE");}
        persistentClass = (Class<T>) ((ParameterizedType) getClass()
                .getGenericSuperclass()).getActualTypeArguments()[0];


}
于 2013-01-23T13:27:46.660 に答える
0

アプリケーションとデータベース サーバーの両方でトレースする必要があります。

  1. 開いている可能性のある最大接続数については、データベース構成を確認してください。
  2. 別のクライアントからのデータベース接続を使用している場合は、データベース サーバーで現在開かれている接続を確認します。
  3. 開いている接続が多すぎて閉じていない場合は、アプリケーションを確認してください。

データベース サーバー設定で最大オープン接続の値を増やす必要があります。

最大オープン接続を変更するには、データベース サーバーの下の my.cnf ファイルmax_connectionsを編集する必要があります。max_user_connections

ユーザーごとに最大接続数を付与/編集することもできます。詳細はこちら

于 2012-08-23T09:16:20.140 に答える