1

ヒント:私のホスティングTomcatシステムは20db接続しか提供していませ

localhsotでの私の作業プロジェクト

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"
          p:driverClassName="${jdbc.driverClassName}" p:url="${jdbc.url}"
          p:username="${jdbc.username}" p:password="${jdbc.password}" />

これはローカルホストではうまく機能しましたが、本番環境ではしばらく実行され、例外:「ユーザーはすでに最大接続数を持っています」。

多くのグーグルの後

c3p0を使用しました

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close" >
        <property name="driverClass" value="${jdbc.driverClassName}" />
        <property name="jdbcUrl" value="${jdbc.url}" />
        <property name="user" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>
    </bean>

これはローカルホストでは機能しましたが、本番サーバーでも同じ問題が発生しました

ヒント: c3p0のいくつかの設定でこれを解決できると思います。あなたの提案を手伝ってください(私のホスティングは20の接続しか提供していません)

また、Tomcatを試しました

<bean id="dataSource" class="org.apache.tomcat.jdbc.pool.DataSourceFactory">
        <property name="driverClassName" value="${jdbc.driverClassName}" />
        <property name="url" value="${jdbc.url}" />
        <property name="username" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>
        <property name="maxActive" value="20"/>
    </bean>

上記のTomcatコードは間違っており、機能しません-プロパティが間違っているためです(私はそれを知っています)。これを本番環境で使用するために設定する方法(20接続のみ)

Tomcatプールの使用方法を知っている場合は、私たちを助けてください。

私もbonecpを使用しました

<bean id="dataSource" class="com.jolbox.bonecp.BoneCPDataSource" destroy-method="close" >
        <property name="driverClass" value="${jdbc.driverClassName}" />
        <property name="jdbcUrl" value="${jdbc.url}" />
        <property name="username" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>
        <property name="idleConnectionTestPeriod" value="60"/>
        <property name="idleMaxAge" value="240"/>
        <property name="maxConnectionsPerPartition" value="10"/>
        <property name="minConnectionsPerPartition" value="5"/>
        <property name="partitionCount" value="1"/>
        <property name="acquireIncrement" value="5"/>
        <property name="statementsCacheSize" value="1000"/>
        <property name="releaseHelperThreads" value="3"/>
    </bean>

これはローカルホストでは機能しましたが、本番環境でも同じ問題が発生しました。「ユーザーは多くの接続を必要とします」。

私もapache-dbcpを試しました

tomcat 7のドキュメントによると、dbcpは廃止され、tomcatはプールにバンドルされます。dbcpを使用していて、プログラムを実行できませんが。(jarを1つだけ追加しましたが、プロジェクトの実行中にクラスが見つからなかったというエラーが発生しました)

私自身の考えによると:

上記の設定が問題になると思います。あなたの提案を手伝ってください。重量が重いため、今まで休止状態を使用していません。hibernateでこの問題を解決できる場合は、お知らせください。


編集済み

現在、このコードを使用しています。このコードは私の使用に適していますか(20接続)

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"
      p:driverClass="${jdbc.driverClassName}" p:jdbcUrl="${jdbc.url}"
      p:user="${jdbc.username}" p:password="${jdbc.password}"

      p:acquireIncrement="1" 
      p:checkoutTimeout="1"
      p:idleConnectionTestPeriod="5"           
      p:maxIdleTime="5" 
      p:maxIdleTimeExcessConnections="1" 
      p:maxPoolSize="20" p:maxStatements="0" p:maxStatementsPerConnection="0" 
      p:minPoolSize="1" 
      p:numHelperThreads="100"
      p:overrideDefaultUser="${jdbc.username}" p:overrideDefaultPassword="${jdbc.password}"
      p:propertyCycle="3" 
      p:testConnectionOnCheckin="true"
      p:unreturnedConnectionTimeout="5" />

DAOコード:

@Repository
public class TutorialsDAOImpl implements TutorialsDAO {
//---
private JdbcTemplate jdbcTemplate;
    private DataSource dataSource;

    @Autowired
    public void setDataSource(DataSource dataSource) {
        this.jdbcTemplate = new JdbcTemplate(dataSource);
    }
//---
@Override
    public List<TutorialsCategory_vo> getTutorialsCategory() {
        sql = "SELECT * FROM `tutorials_category` ORDER BY `slug` ASC;";
        List<TutorialsCategory_vo> vo = null;
        try {
            vo = this.jdbcTemplate.query(sql, new Object[]{}, tutorialsCategory_mapper);
        } catch (Exception e) {
            log.log(Level.SEVERE, null, e);
        }
        return vo;
    }

これらは私が使用しているコードです。エラー/修正がある場合は、plsは私を修正します。


編集済み(Arun P Johnyの質問用)

私の現在のプロジェクトのURL

上記の現在のコードを更新しました。


4

1 に答える 1

0

これが私の最終的なc3p0設定です。

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"
          p:driverClass="${jdbc.driverClassName}" p:jdbcUrl="${jdbc.url}"
          p:user="${jdbc.username}" p:password="${jdbc.password}"

          p:acquireIncrement="1" 
          p:checkoutTimeout="3000"
          p:idleConnectionTestPeriod="5"           
          p:maxIdleTime="3" 
          p:maxIdleTimeExcessConnections="1" 
          p:maxPoolSize="20" p:maxStatements="20000" p:maxStatementsPerConnection="1000" 
          p:minPoolSize="1" 
          p:numHelperThreads="1000"
          p:overrideDefaultUser="${jdbc.username}" p:overrideDefaultPassword="${jdbc.password}"
          p:propertyCycle="3" 
          p:statementCacheNumDeferredCloseThreads="1"
          p:testConnectionOnCheckin="true"
          p:unreturnedConnectionTimeout="7" />

これは正常に機能しますが、時間がかかります(1または2秒-3秒以下)。

また、mysqlをシャットダウンしてこのコードを確認しました。私のプログラムは、mysqlを起動するまで待機しました。これはいい。このコードは、すべてのdb接続が完了して正しく出力されるのを待ちます。

この設定をさらに速くすることはできますか?ヒント:私のサーバーは20の接続しか提供していません。

あなたが正解を提供するならば、私はチェックした後、それを正解として作ります。

于 2013-01-27T14:02:50.790 に答える