Hi,

I have a data source defined as:
  <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" 
destroy-method="close">
    <property name="driverClassName" value="com.mysql.jdbc.Driver" />
    <property name="url"             
value="${com.groupgti.esb.cxf.tracking.dataSource.url}" />
    <property name="username"        
value="${com.groupgti.esb.cxf.tracking.dataSource.username}" />
    <property name="password"        
value="${com.groupgti.esb.cxf.tracking.dataSource.password}" />
    <property name="initialSize"     value="10" />
    <property name="maxActive"       value="100" />
    <property name="maxIdle"         value="10" />
    <property name="maxWait"         value="5000" />
    <property name="minEvictableIdleTimeMillis"     value="300000" />
    <property name="timeBetweenEvictionRunsMillis"  value="100000" />
    <property name="testWhileIdle"   value="true" />
    <property name="validationQuery" value="select 1;" />
  </bean>

Entities in the system have @Id values defined as:
  @Entity
  @Table( name = "Message" )
  @NamedQueries( {
      @NamedQuery( name = "Message_JpaImpl.findAll", query = "SELECT o from 
Message_JpaImpl o " )
  } )
  public class Message_JpaImpl implements Message {
      @Id
      @GeneratedValue( strategy = GenerationType.SEQUENCE, generator = 
"Message_JpaImpl" )
      @SequenceGenerator( name = "Message_JpaImpl", sequenceName = 
"class-table()" )
      @Column
      private long id;
      
  
When we thrash the system we get up to 100 connections to the database and then 
it deadlocks - the connections remain there but no more are created and nothing 
gets through them.

Looking at a thread dump I see:
153 threads calling org.apache.commons.pool.impl.GenericObjectPool.borrowObject 
to try to get a connection
100 threads calling org.apache.openjpa.jdbc.kernel.TableJDBCSeq.nextInternal to 
try to get an ID value
1 thread stuck calling borrowObject inside a call to nextInternal - to get a 
connection in order to grab the next chunk of IDs.

This is pretty much a deadlock (every 5s the attempt to get a chunk of IDs will 
fail, so another thread will try to get them, but the chances of it succeeding 
are pretty slim (1:153 against)).

There are a few things I can do to reduce the chances of hitting this, but the 
only way to fix it completely is for the call to nextInternal to avoid using my 
main connection pool.
According to the JavaDoc for AbstractJDBCSeq it "handles whether a second 
datasource is configured" - if this is true, how can I configure it to use a 
second connection?
It looks like I ought to be able to set something in the sequenceName 
parentheses, but I can't see what.
Is there some other fix for this?

Thanks

Jim

Reply via email to