违反了ActiveMQ唯一约束
我在10000条消息的负载测试中看到了一些独特的约束冲突(10000条消息中只有8条受到影响)。我想知道我是否需要在DBCP数据源设置或活动MQ设置中更改它。错误是违反了ActiveMQ唯一约束,activemq,Activemq,我在10000条消息的负载测试中看到了一些独特的约束冲突(10000条消息中只有8条受到影响)。我想知道我是否需要在DBCP数据源设置或活动MQ设置中更改它。错误是 org.springframework.jms.UncategorizedJmsException: Uncategorized exception occured during JMS processing; nested exception is javax.jms.JMSException: ORA-00001: unique
org.springframework.jms.UncategorizedJmsException: Uncategorized exception occured during
JMS processing; nested exception is javax.jms.JMSException:
ORA-00001: unique constraint (WEBSVC.SYS_C00181594) violated
我查找了这个约束,并将其跟踪到ACTIVEMQ_MSGS一个表,我们让ACTIVEMQ在Oracle中创建和维护它自己。e、 g
select * from all_constraints
where constraint_name = 'SYS_C00181594'
OWNER CONSTRAINT_NAME CONSTRAINT_TYPE TABLE_NAME SEARCH_CONDITION R_OWNER R_CONSTRAINT_NAME DELETE_RULE STATUS DEFERRABLE DEFERRED VALIDATED GENERATED BAD RELY LAST_CHANGE INDEX_OWNER INDEX_NAME INVALID VIEW_RELATED
------ --------------- --------------- ------------- ---------------- ------- ----------------- ----------- ------- -------------- --------- --------- -------------- --- ---- -------------------- ----------- ------------- ------- ------------
WEBSVC SYS_C00181594 P ACTIVEMQ_MSGS ENABLED NOT DEFERRABLE IMMEDIATE VALIDATED GENERATED NAME 22-Mar-2013 16:16:22 SYS_C00181594
当我在队列上放置消息时,会发生这种情况,随后会出现完整的堆栈跟踪
原因:java.io.IOException:ORA-00001:违反了唯一约束(WEBSVC.SYS_C00181594)
原因:java.sql.BatchUpdateException:ORA-00001:违反了唯一约束(webvc.SYS_C00181594)
目前我有一个相当偏执的DBCP源,即
<bean id="basicOracleDataSource" class="org.apache.commons.dbcp.BasicDataSource"
abstract="true" destroy-method="close">
<property name="driverClassName" value="oracle.jdbc.OracleDriver" />
<property name="poolPreparedStatements" value="true"/>
<property name="initialSize" value="5"/>
<property name="maxActive" value="30"/>
<property name="maxWait" value="60000"/> <!-- default indefinitely -->
<property name="timeBetweenEvictionRunsMillis" value="30000" />
<!-- verify connections in the pool to stop connection closed errors -->
<property name="logAbandoned" value="false"/> <!-- default false -->
<property name="maxIdle" value="5"/> <!-- default 8, minIdle defaults to 0 which is OK -->
<property name="numTestsPerEvictionRun" value="4"/> <!-- default 3 -->
<property name="removeAbandoned" value="true"/> <!-- default false -->
<property name="removeAbandonedTimeout" value="60"/><!-- default 300 seconds -->
<property name="testOnBorrow" value="true"/> <!-- default false -->
<property name="testOnReturn" value="true"/> <!-- default false -->
<property name="testWhileIdle" value="true"/> <!-- default false -->
<property name="validationQuery" value="SELECT 1 FROM dual"/>
</bean>
以防万一,这也是我的JMS模板
<!-- Spring JMS Template -->
<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
<property name="connectionFactory">
<!-- lets wrap in a pool to avoid creating a connection per send -->
<bean class="org.springframework.jms.connection.SingleConnectionFactory">
<property name="targetConnectionFactory">
<ref local="jmsFactory" />
</property>
</bean>
</property>
</bean>
<bean id="basicOracleDataSource" class="org.apache.commons.dbcp.BasicDataSource"
abstract="true" destroy-method="close">
<property name="driverClassName" value="oracle.jdbc.OracleDriver" />
<property name="poolPreparedStatements" value="true"/>
<property name="initialSize" value="5"/>
<property name="maxActive" value="30"/>
<property name="maxWait" value="60000"/> <!-- default indefinitely -->
<property name="timeBetweenEvictionRunsMillis" value="30000" />
<!-- verify connections in the pool to stop connection closed errors -->
<property name="logAbandoned" value="false"/> <!-- default false -->
<property name="maxIdle" value="5"/> <!-- default 8, minIdle defaults to 0 which is OK -->
<property name="numTestsPerEvictionRun" value="4"/> <!-- default 3 -->
<property name="removeAbandoned" value="true"/> <!-- default false -->
<property name="removeAbandonedTimeout" value="60"/><!-- default 300 seconds -->
<property name="testOnBorrow" value="true"/> <!-- default false -->
<property name="testOnReturn" value="true"/> <!-- default false -->
<property name="testWhileIdle" value="true"/> <!-- default false -->
<property name="validationQuery" value="SELECT 1 FROM dual"/>
</bean>
<!-- Spring JMS Template -->
<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
<property name="connectionFactory">
<!-- lets wrap in a pool to avoid creating a connection per send -->
<bean class="org.springframework.jms.connection.SingleConnectionFactory">
<property name="targetConnectionFactory">
<ref local="jmsFactory" />
</property>
</bean>
</property>
</bean>