db-derby-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Daniel John Debrunner <...@debrunners.com>
Subject Re: [jira] Commented: (DERBY-230) "Schema already exists" when creating a table
Date Fri, 22 Apr 2005 16:47:26 GMT
Øystein Grøvlen wrote:

>>>>>>"DJD" == Daniel John Debrunner <djd@debrunners.com> writes:
> 
> 
>     DJD> [As an aside traditionally Cloudscape did not use synchronized *static*
>     DJD> methods as there were locking issues related to class loading - this was
>     >> From jdk 1.1 days, have those issues been fixed now?]
> 
> I am not an expert on this, but Doug Lea says in "Concurrent
> Programming in Java":
> 
>         The JVM internally obtains and releases the locks for Class
>         objects during class loading and intialization.  Unless you
>         are writing a special class ClassLoader or holding multiple
>         locks during static initialization sequences, these internal
>         mechanics cannot interfere with the use of ordinary methods
>         and blocks synchronized on Class objects.

Thanks. The "Unless ... holding multiple locks.. " part is a little
troubling. And exactly what is meant by 'Class objects', as while you
can have a synchronized static method, I don't see how you could have a
block synchronized in the same way.

The Derby code uses the workaround of creating a static final member
referencing an object to be used as the synchronization object and uses
that to synchronized static methods. That may still be the safest
approach. E.g.

public class X
{
 private static final Object syncMe = new Object();

 public void static someMethod()
  {
      synchronized (syncMe)
      {
       // ... code
      }
   }
}


> 
> I found an example of how one catches a StandardException.  I guess in
> my case it should be something like this:
> 
> ConstantAction csca = new CreateSchemaConstantAction(schemaName, (String) null);
> try {    
>     csca.executeConstantAction(activation);
> } catch (StandardException se) {
>     if (se.getMessageId().equals(SQLState.LANG_OBJECT_ALREADY_EXISTS)) {
>         // Ignore "Schema already exists".  
>         // Another thread has probably created it since we checked for it
>     } else {
>         throw se;
>     }
> }
> 
> Does this look OK?

Yes.

Dan.


Mime
View raw message