通过数据库的Jetty集群覆盖Web应用程序指定的数据源池

通过数据库的Jetty集群覆盖Web应用程序指定的数据源池,web,jetty,load-balancing,Web,Jetty,Load Balancing,目标是为当前在单个Jetty实例中运行的web应用程序创建集群环境。添加群集配置时,似乎会阻止应用程序数据源池初始化。附加远程调试会话并单步执行代码显示应用程序在启动时挂起,同时等待连接从池中释放。检查池的详细信息表明尚未创建任何连接。c3p0用于池实现。当服务器在没有集群配置的情况下启动时,c3p0生成一条日志消息,显示它正在初始化。在配置集群的情况下启动时,不会看到日志消息。这让我相信应用程序数据源池从未初始化,因为集群数据源池以某种方式篡夺了它 为了获得集群行为,我在%JETTY_HOME

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

jdbc/dsc集群
oracle.jdbc.OracleDriver
jdbc:oracle:thin:@xxxxx:1521:xe
xxxx
xxxx
码头1
jdbc/dsc集群
60
jdbcIdMgr


并将以下内容添加到应用程序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>



应用程序数据源池配置为Springbean-

<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!这是因为我有2个被访问的ojdbc-10.2.0.4.0.jar。为了使会话管理数据库实现正常工作,我向JETTY_HOME\lib\ext添加了一个ojdbc jar。这为JETTY服务器提供了Oracle类。应用程序库目录中还包含一个ojdbc jar,应用程序使用它。出现问题的原因是ojdbc jar是一个“密封”的jar。这意味着,一旦从一个jar加载了一个类,尝试从另一个jar加载同一个类就会引发安全异常。因此Jetty服务器将从jar的lib/ext版本加载一个Oracle类。然后,应用程序将尝试从其ojdbc jar加载相同的类,从而导致安全异常。需要一段时间才能弄清楚,因为接收到异常的c3p0类默默地接受了异常,然后再次尝试建立连接。这发生在另一个线程上,然后是我正在查看的线程。这就是为池建立连接的线程,而我正在查看等待池连接的线程。啊

请注意你的标签。是一项数据挖掘任务(称为集群),而您可能的意思是(不准确地也被称为“集群”,但这不是这里的标签SO的含义)