目标是为当前在单个 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