0

目標は、現在単一の Jetty インスタンスで実行されている Web アプリケーション用のクラスター化された環境を作成することです。クラスタリング構成が追加されると、アプリケーション データ ソース プールが初期化されないように見えます。リモート デバッグ セッションをアタッチしてコードをステップ実行すると、接続がプールから解放されるのを待っている間、アプリケーションが起動時にハングすることが示されます。プールの詳細を調べると、接続が作成されていないことがわかります。c3p0 は、プーリングの実装に使用されます。サーバーがクラスタリング構成なしで起動すると、c3p0 は初期化中であることを示すログ メッセージを生成します。クラスタリングを構成して開始すると、ログ メッセージは表示されません。クラスタリングデータソースプールが何らかの方法でそれを奪っているため、アプリケーションデータソースプールが初期化されていないと私は信じています。

クラスタリングの動作を得るために、%JETTY_HOME%/etc/jetty.xml に以下を追加しました。

<New id="DSClustering" class="org.eclipse.jetty.plus.jndi.Resource">
    <Arg></Arg>
    <Arg>jdbc/DSClustering</Arg>
    <Arg>
        <New class="com.mchange.v2.c3p0.ComboPooledDataSource">            
            <Set name="driverClass">oracle.jdbc.OracleDriver</Set>
            <Set name="jdbcUrl">jdbc:oracle:thin:@xxxxx:1521:xe</Set>
            <Set name="User">xxxx</Set>
            <Set name="Password">xxxx</Set>

        </New>
    </Arg>
</New>


<Set name="sessionIdManager">
    <New id="jdbcidmgr" class="org.eclipse.jetty.server.session.JDBCSessionIdManager">
        <Arg><Ref id="Server"/></Arg>
        <Set name="workerName">jetty1</Set>
        <Set name="DatasourceName">jdbc/DSClustering</Set>
        <Set name="scavengeInterval">60</Set>
    </New>
</Set>
<Call name="setAttribute">
    <Arg>jdbcIdMgr</Arg>
    <Arg><Ref id="jdbcidmgr"/></Arg>
</Call>



そして、アプリケーションの jetty-web.xml に以下を追加しました

<Set name="sessionHandler">
    <New class="org.eclipse.jetty.server.session.SessionHandler">
        <Arg>
            <New class="org.eclipse.jetty.server.session.JDBCSessionManager">
                <Set name="idManager">
                    <Ref id="jdbcidmgr"/>
                </Set>
            </New>
        </Arg>
    </New>
</Set>



アプリケーション データ ソース プールは、Spring Bean として構成されます。

<bean id="sysContextAwareDataSource" class="com.mycompany.datasource.SysContextAwareDataSource">
    <property name="targetDataSource" ref="myPoolDataSource"/>
    <property name="connectionWaitLoggingThreshold" value="1000"/>
</bean>

<bean id="myPoolDataSource" 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}"/>
    <property name="acquireIncrement" value="${jdbc.pool.acquireIncrement}"/>
    <property name="minPoolSize" value="${jdbc.pool.minPoolSize}"/>
    <property name="maxPoolSize" value="${jdbc.pool.maxPoolSize}"/>
    <property name="initialPoolSize" value="${jdbc.pool.initialPoolSize}"/>
    <property name="acquireRetryAttempts" value="${jdbc.pool.acquireRetryAttempts}"/>
    <property name="testConnectionOnCheckin" value="${jdbc.pool.testConnectionOnCheckin}"/>
    <property name="idleConnectionTestPeriod" value="${jdbc.pool.idleConnectionTestPeriod}"/>
    <property name="preferredTestQuery" value="${jdbc.pool.preferredTestQuery}"/>
    <property name="maxIdleTime" value="${jdbc.pool.maxIdleTime}"/>
    <property name="acquireRetryDelay" value="${jdbc.pool.acquireRetryDelay}"/>
    <property name="maxStatements" value="${jdbc.pool.maxStatements}"/>
    <property name="maxStatementsPerConnection" value="${jdbc.pool.maxStatementsPerConnection}"/>
</bean>


<bean id="userDAO" class="com.mycompany.dataaccess.UserDAOImpl">
    <property name="sessionFactory" ref="sessionFactory"/>
    <property name="dataSource" ref="transactionAwareDataSourceProxy"/>
</bean>

環境: jetty 8.1.9、Oracle 11g、Windows 7 Enterprise、JDK 1.6.0_38

4

1 に答える 1

1

理解した!これは、アクセスされていた2つのojdbc-10.2.0.4.0.jarがあったために発生しました。セッション管理DBの実装を機能させるために、ojdbcjarをJETTY_HOME\ lib\extに追加しました。これにより、OracleクラスがJettyサーバーに提供されました。アプリケーションが使用するapplicationslibディレクトリに含まれるojdbcjarもあります。この問題は、ojdbcjarが「封印された」jarであるために発生しました。つまり、あるjarからクラスがロードされると、別のjarから同じクラスをロードしようとすると、セキュリティ例外がスローされます。したがって、Jettyサーバーはjarのlib/extバージョンからOracleクラスをロードします。次に、アプリケーションはojdbc jarから同じクラスを読み込もうとし、セキュリティ例外を引き起こします。例外を受け取ったc3p0クラスが、静かに例外を飲み込んだ後、接続を再確立しようとしました。これは、私が見ていたスレッドとは別のスレッドで発生していました。プールからの接続を待っているスレッドを見ている間、それはプールへの接続を確立していたスレッドでした。ああ!

于 2013-02-19T21:36:12.453 に答える