Rick,
Setting openjpa.DynamicEnhancementAgent to false did not have any effect.
I have figured out that the issue depends on the database connected. I can
reproduce it with MySQL and PostgreSQL but not with DB2. Even with the first
two databases the reproducibility is "not always". Below I have included
suspended thread dumps from Eclipse (Windows) - the first one is from
PostgreSQL, the other one is from MySQL. As you can see, this seems to be
related to executing finalize() on driver's Connection implementations. If I
can read that stuff correctly, a hang-up occurs in TemporaryClassLoader, line
59, in Class.forName:
// bug #283. defer to system if the name is a protected name.
// "sun." is required for JDK 1.4, which has an access check for
// sun.reflect.GeneratedSerializationConstructorAccessor1
if (name.startsWith("java.") || name.startsWith("javax.")
|| name.startsWith("sun."))
return Class.forName(name, resolve, getClass().getClassLoader());
The name variable has a value of "sun.net.ConnectionResetException". The
hang-up vanishes when I remove "|| name.startsWith("sun.")". Does someone
understand what's going on?
Regards,
Milosz
PGSQL:
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner at localhost:1950
(Suspended)
System Thread [Finalizer] (Suspended)
Class<T>.forName0(String, boolean, ClassLoader) line: not
available
[native method]
Class<T>.forName(String, boolean, ClassLoader) line: not
available
TemporaryClassLoader.loadClass(String, boolean) line: 59
TemporaryClassLoader.loadClass(String) line: 44
TemporaryClassLoader(ClassLoader).loadClassInternal(String)
line: not
available
Class<T>.forName0(String, boolean, ClassLoader) line: not
available
[native method]
Class<T>.forName(String, boolean, ClassLoader) line: not
available
PCClassFileTransformer.needsEnhance(String, Class, byte[])
line: 186
PCClassFileTransformer.transform0(String, Class, byte[]) line:
132
PCClassFileTransformer.transform(ClassLoader, String, Class,
ProtectionDomain, byte[]) line: 120
TransformerManager.transform(ClassLoader, String, Class,
ProtectionDomain,
byte[]) line: not available
InstrumentationImpl.transform(ClassLoader, String, Class,
ProtectionDomain, byte[]) line: not available
SocketOutputStream.socketWrite(byte[], int, int) line: not
available
SocketOutputStream.write(byte[], int, int) line: not available
BufferedOutputStream.flushBuffer() line: not available
BufferedOutputStream.flush() line: not available
PGStream.flush() line: 508
ProtocolConnectionImpl.close() line: 138
Jdbc3Connection(AbstractJdbc2Connection).close() line: 516
Jdbc3Connection(AbstractJdbc2Connection).finalize() line: 834
Finalizer.invokeFinalizeMethod(Object) line: not available
[native
method]
Finalizer.runFinalizer() line: not available
Finalizer.access$100(Finalizer) line: not available
Finalizer$FinalizerThread.run() line: not available
System Thread [Reference Handler] (Suspended)
Thread [main] (Suspended)
ClassLoader.findBootstrapClass(String) line: not available
[native
method]
Launcher$ExtClassLoader(ClassLoader).findBootstrapClass0(String) line: not
available
Launcher$ExtClassLoader(ClassLoader).loadClass(String, boolean)
line: not
available
Launcher$AppClassLoader(ClassLoader).loadClass(String, boolean)
line: not
available
Launcher$AppClassLoader.loadClass(String, boolean) line: not
available
Launcher$AppClassLoader(ClassLoader).loadClass(String) line: not
available
Launcher$AppClassLoader(ClassLoader).loadClassInternal(String)
line: not
available
Class<T>.forName0(String, boolean, ClassLoader) line: not
available
[native method]
Class<T>.forName(String, boolean, ClassLoader) line: not
available
Package.getPackageInfo() line: not available
Package.getDeclaredAnnotations() line: not available
AnnotationPersistenceMetaDataParser.parsePackageAnnotations()
line: 451
AnnotationPersistenceMetaDataParser.parse(Class<?>) line: 415
PersistenceMetaDataFactory.load(Class<?>, int, ClassLoader)
line: 231
MetaDataRepository.getMetaDataInternal(Class<?>, ClassLoader)
line: 489
MetaDataRepository.getMetaData(Class<?>, ClassLoader, boolean)
line: 309
PCClassFileTransformer.needsEnhance(String, Class, byte[])
line: 188
PCClassFileTransformer.transform0(String, Class, byte[]) line:
132
PCClassFileTransformer.transform(ClassLoader, String, Class,
ProtectionDomain, byte[]) line: 120
TransformerManager.transform(ClassLoader, String, Class,
ProtectionDomain,
byte[]) line: not available
InstrumentationImpl.transform(ClassLoader, String, Class,
ProtectionDomain, byte[]) line: not available
ClassLoader.defineClass1(String, byte[], int, int,
ProtectionDomain,
String) line: not available [native method]
Launcher$AppClassLoader(ClassLoader).defineClass(String,
byte[], int, int,
ProtectionDomain) line: not available
Launcher$AppClassLoader(SecureClassLoader).defineClass(String,
byte[],
int, int, CodeSource) line: not available
Launcher$AppClassLoader(URLClassLoader).defineClass(String,
Resource)
line: not available
URLClassLoader.access$100(URLClassLoader, String, Resource)
line: not
available
URLClassLoader$1.run() line: not available
AccessController.doPrivileged(PrivilegedExceptionAction<T>,
AccessControlContext) line: not available [native method]
Launcher$AppClassLoader(URLClassLoader).findClass(String) line:
not
available
Launcher$AppClassLoader(ClassLoader).loadClass(String, boolean)
line: not
available
Launcher$AppClassLoader.loadClass(String, boolean) line: not
available
Launcher$AppClassLoader(ClassLoader).loadClass(String) line: not
available
Launcher$AppClassLoader(ClassLoader).loadClassInternal(String)
line: not
available
JDBCBrokerFactory.newStoreManager() line: 106
JDBCBrokerFactory(AbstractBrokerFactory).initializeBroker(boolean, int,
BrokerImpl, boolean) line: 224
JDBCBrokerFactory(AbstractBrokerFactory).newBroker(String,
String,
boolean, int, boolean) line: 205
DelegatingBrokerFactory.newBroker(String, String, boolean, int,
boolean)
line: 160
EntityManagerFactoryImpl.createEntityManager(Map) line: 212
EntityManagerFactoryImpl.createEntityManager() line: 165
TestBasicAnnotation.testEagerFetchType() line: 44
NativeMethodAccessorImpl.invoke0(Method, Object, Object[])
line: not
available [native method]
NativeMethodAccessorImpl.invoke(Object, Object[]) line: not
available
DelegatingMethodAccessorImpl.invoke(Object, Object[]) line: not
available
Method.invoke(Object, Object...) line: not available
TestBasicAnnotation(TestCase).runTest() line: 154
TestBasicAnnotation(TestCase).runBare() line: 127
TestBasicAnnotation(PersistenceTestCase).runBare() line: 466
TestResult$1.protect() line: 106
TestResult.runProtected(Test, Protectable) line: 124
TestResult.run(TestCase) line: 109
TestBasicAnnotation(TestCase).run(TestResult) line: 118
TestBasicAnnotation(PersistenceTestCase).run(TestResult) line:
181
TestSuite.runTest(Test, TestResult) line: 208
TestSuite.run(TestResult) line: 203
JUnit3TestReference.run(TestExecution) line: 128
TestExecution.run(ITestReference[]) line: 38
RemoteTestRunner.runTests(String[], String, TestExecution)
line: 460
RemoteTestRunner.runTests(TestExecution) line: 673
RemoteTestRunner.run() line: 386
RemoteTestRunner.main(String[]) line: 196
System Thread [Signal Dispatcher] (Suspended)
Thread [ReaderThread] (Suspended)
MySQL:
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner at localhost:2016
(Suspended)
System Thread [Finalizer] (Suspended)
Class<T>.forName0(String, boolean, ClassLoader) line: not
available
[native method]
Class<T>.forName(String, boolean, ClassLoader) line: not
available
TemporaryClassLoader.loadClass(String, boolean) line: 59
TemporaryClassLoader.loadClass(String) line: 44
TemporaryClassLoader(ClassLoader).loadClassInternal(String)
line: not
available
Class<T>.forName0(String, boolean, ClassLoader) line: not
available
[native method]
Class<T>.forName(String, boolean, ClassLoader) line: not
available
PCClassFileTransformer.needsEnhance(String, Class, byte[])
line: 186
PCClassFileTransformer.transform0(String, Class, byte[]) line:
132
PCClassFileTransformer.transform(ClassLoader, String, Class,
ProtectionDomain, byte[]) line: 120
TransformerManager.transform(ClassLoader, String, Class,
ProtectionDomain,
byte[]) line: not available
InstrumentationImpl.transform(ClassLoader, String, Class,
ProtectionDomain, byte[]) line: not available
SocketOutputStream.socketWrite(byte[], int, int) line: not
available
SocketOutputStream.write(byte[], int, int) line: not available
BufferedOutputStream.flushBuffer() line: not available
BufferedOutputStream.flush() line: not available
MysqlIO.send(Buffer, int) line: 3251
MysqlIO.quit() line: 1659
ConnectionImpl.realClose(boolean, boolean, boolean, Throwable)
line:
4296
ConnectionImpl.cleanup(Throwable) line: 1265
ConnectionImpl.finalize() line: 2667
Finalizer.invokeFinalizeMethod(Object) line: not available
[native
method]
Finalizer.runFinalizer() line: not available
Finalizer.access$100(Finalizer) line: not available
Finalizer$FinalizerThread.run() line: not available
System Thread [Reference Handler] (Suspended)
Thread [main] (Suspended)
ClassLoader.findBootstrapClass(String) line: not available
[native
method]
Launcher$ExtClassLoader(ClassLoader).findBootstrapClass0(String) line: not
available
Launcher$ExtClassLoader(ClassLoader).loadClass(String, boolean)
line: not
available
Launcher$AppClassLoader(ClassLoader).loadClass(String, boolean)
line: not
available
Launcher$AppClassLoader.loadClass(String, boolean) line: not
available
Launcher$AppClassLoader(ClassLoader).loadClass(String) line: not
available
Launcher$AppClassLoader(ClassLoader).loadClassInternal(String)
line: not
available
ConnectionImpl.rollback() line:
4628
LoggingConnectionDecorator$LoggingConnection_(DelegatingConnection).rollback()
line:
234
LoggingConnectionDecorator$LoggingConnection_(LoggingConnectionDecorator$LoggingConnection).rollback()
line:
398
ConfiguringConnectionDecorator$ConfiguringConnection_(DelegatingConnection).rollback()
line:
234
ConfiguringConnectionDecorator$ConfiguringConnection_(ConfiguringConnectionDecorator$ConfiguringConnection).rollback()
line: 148
SchemaTool.executeSQL(String[]) line: 1196
SchemaTool.deleteTableContents() line: 427
SchemaTool.run() line: 335
MappingTool.record(MappingTool$Flags) line: 501
MappingTool.record() line: 453
JDBCBrokerFactory.synchronizeMappings(ClassLoader,
JDBCConfiguration)
line: 159
JDBCBrokerFactory.synchronizeMappings(ClassLoader) line: 163
JDBCBrokerFactory.newBrokerImpl(String, String) line: 119
JDBCBrokerFactory(AbstractBrokerFactory).newBroker(String,
String,
boolean, int, boolean) line: 204
DelegatingBrokerFactory.newBroker(String, String, boolean, int,
boolean)
line: 160
EntityManagerFactoryImpl.createEntityManager(Map) line: 212
EntityManagerFactoryImpl.createEntityManager() line: 165
TestBasicAnnotation.testEagerFetchType() line: 44
NativeMethodAccessorImpl.invoke0(Method, Object, Object[])
line: not
available [native method]
NativeMethodAccessorImpl.invoke(Object, Object[]) line: not
available
DelegatingMethodAccessorImpl.invoke(Object, Object[]) line: not
available
Method.invoke(Object, Object...) line: not available
TestBasicAnnotation(TestCase).runTest() line: 154
TestBasicAnnotation(TestCase).runBare() line: 127
TestBasicAnnotation(PersistenceTestCase).runBare() line: 466
TestResult$1.protect() line: 106
TestResult.runProtected(Test, Protectable) line: 124
TestResult.run(TestCase) line: 109
TestBasicAnnotation(TestCase).run(TestResult) line: 118
TestBasicAnnotation(PersistenceTestCase).run(TestResult) line:
181
TestSuite.runTest(Test, TestResult) line: 208
TestSuite.run(TestResult) line: 203
JUnit3TestReference.run(TestExecution) line: 128
TestExecution.run(ITestReference[]) line: 38
RemoteTestRunner.runTests(String[], String, TestExecution)
line: 460
RemoteTestRunner.runTests(TestExecution) line: 673
RemoteTestRunner.run() line: 386
RemoteTestRunner.main(String[]) line: 196
System Thread [Signal Dispatcher] (Suspended)
Thread [ReaderThread] (Suspended)
Thread [MySQL Statement Cancellation Timer] (Suspended)
>
> Milosz -
>
> Setting openjpa.DynamicEnhancementAgent to false should not have any affect
> on your scenario for two reasons. First, when you are using the javaagent
> for enhancement the dynamic enhancer detects that and will not do any work.
> Second, the dynamic enhancer depends on an API that exists ONLY on the Sun
> 1.6 JDK.
>
> Let me know if you have any more debug info as I'd be interested in getting
> to the bottom of the hang that you're observing.
>
> -Rick
> --
> View this message in context:
> http://n2.nabble.com/Hang-ups-with--javaagent-tp3072225p3080441.html
> Sent from the OpenJPA Developers mailing list archive at Nabble.com.
>
>