目標は、現在単一の 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