Hi all,

Just to let you know, I just pushed an "openjpa" branch on arthur
repository.
It contains two new modules/knights: openjpa and derby.
Goal is to be able to use openjpa in a native app easily (it is already
doable with a lot of conf).

integration-test/src/test/resources/integration-tests/openjpa
<https://github.com/apache/geronimo-arthur/tree/openjpa/integration-test/src/test/resources/integration-tests/openjpa>
provides
the test I'm trying to run.
It is not yet a setup which can be merged but current setup enables to run
the test from this folder using "mvn clean package -Parthur
arthur:native-image@runtime && ./target/openjpa.graal.bin
-Dorg.slf4j.simpleLogger.defaultLogLevel=INFO" command. It means that if
you modify derby/openjpa knight, you recompile the knight (mvn install) and
can rerun this command from the test folder directly to see if it changes
something/works - it is faster than recompiling everything or going through
docker test layer.

It seems that openjpa EMF started and fails when sending DDL to derby due
to a threadlocal issue:

Exception in thread "main" <openjpa-0.0.0-rnull nonfatal general
error> org.apache.openjpa.persistence.PersistenceException: XJ001.U :
[0] org.apache.derby.shared.common.sanity.AssertFailure, [1] ASSERT
FAILED 
lcc=org.apache.derby.impl.sql.conn.GenericLanguageConnectionContext@24a77e1e
getContextOrNull=null
        at org.apache.openjpa.jdbc.meta.MappingTool.record(MappingTool.java:625)
        at org.apache.openjpa.jdbc.meta.MappingTool.record(MappingTool.java:489)
        at 
org.apache.openjpa.jdbc.kernel.JDBCBrokerFactory.synchronizeMappings(JDBCBrokerFactory.java:177)
        at 
org.apache.openjpa.jdbc.kernel.JDBCBrokerFactory.synchronizeMappings(JDBCBrokerFactory.java:182)
        at 
org.apache.openjpa.jdbc.kernel.JDBCBrokerFactory.newBrokerImpl(JDBCBrokerFactory.java:138)
        at 
org.apache.openjpa.kernel.AbstractBrokerFactory.newBroker(AbstractBrokerFactory.java:213)
        at 
org.apache.openjpa.kernel.DelegatingBrokerFactory.newBroker(DelegatingBrokerFactory.java:166)
        at 
org.apache.openjpa.persistence.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:262)
        at 
org.apache.openjpa.persistence.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:177)
        at 
org.apache.openjpa.persistence.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:167)
        at 
org.apache.openjpa.persistence.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:64)
        at 
org.apache.geronimo.arthur.integrationtests.OpenJPAMain.main(OpenJPAMain.java:77)
Caused by: java.sql.SQLException: XJ001.U : [0]
org.apache.derby.shared.common.sanity.AssertFailure, [1] ASSERT FAILED
lcc=org.apache.derby.impl.sql.conn.GenericLanguageConnectionContext@24a77e1e
getContextOrNull=null
        at 
org.apache.derby.impl.jdbc.SQLExceptionFactory.getSQLException(SQLExceptionFactory.java:115)
        at 
org.apache.derby.impl.jdbc.SQLExceptionFactory.getSQLException(SQLExceptionFactory.java:141)
        at org.apache.derby.impl.jdbc.Util.seeNextException(Util.java:252)
        at org.apache.derby.impl.jdbc.Util.javaException(Util.java:274)
        at 
org.apache.derby.impl.jdbc.TransactionResourceImpl.wrapInSQLException(TransactionResourceImpl.java:437)
        at 
org.apache.derby.impl.jdbc.TransactionResourceImpl.handleException(TransactionResourceImpl.java:353)
        at 
org.apache.derby.impl.jdbc.EmbedConnection.handleException(EmbedConnection.java:2405)
        at 
org.apache.derby.impl.jdbc.ConnectionChild.handleException(ConnectionChild.java:88)
        at 
org.apache.derby.impl.jdbc.EmbedDatabaseMetaData.getPreparedQueryUsingSystemTables(EmbedDatabaseMetaData.java:3642)
        at 
org.apache.derby.impl.jdbc.EmbedDatabaseMetaData.getPreparedQuery(EmbedDatabaseMetaData.java:3686)
        at 
org.apache.derby.impl.jdbc.EmbedDatabaseMetaData.getPreparedQuery(EmbedDatabaseMetaData.java:3713)
        at 
org.apache.derby.impl.jdbc.EmbedDatabaseMetaData.doGetCols(EmbedDatabaseMetaData.java:1969)
        at 
org.apache.derby.impl.jdbc.EmbedDatabaseMetaData.getColumns(EmbedDatabaseMetaData.java:1941)
        at 
org.apache.commons.dbcp2.DelegatingDatabaseMetaData.getColumns(DelegatingDatabaseMetaData.java:227)
        at 
org.apache.commons.dbcp2.DelegatingDatabaseMetaData.getColumns(DelegatingDatabaseMetaData.java:227)
        at 
org.apache.openjpa.lib.jdbc.DelegatingDatabaseMetaData.getColumns(DelegatingDatabaseMetaData.java:137)
        at 
org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator$LoggingConnection$LoggingDatabaseMetaData.getColumns(LoggingConnectionDecorator.java:737)
        at 
org.apache.openjpa.lib.jdbc.DelegatingDatabaseMetaData.getColumns(DelegatingDatabaseMetaData.java:137)
        at 
org.apache.openjpa.jdbc.sql.DBDictionary.getColumns(DBDictionary.java:4428)
        at 
org.apache.openjpa.jdbc.schema.SchemaGenerator.generateTables(SchemaGenerator.java:532)
        at 
org.apache.openjpa.jdbc.schema.SchemaGenerator.generateSchema(SchemaGenerator.java:368)
        at 
org.apache.openjpa.jdbc.schema.SchemaGenerator.generateSchemas(SchemaGenerator.java:303)
        at 
org.apache.openjpa.jdbc.schema.SchemaTool.getDBSchemaGroup(SchemaTool.java:1314)
        at org.apache.openjpa.jdbc.schema.SchemaTool.drop(SchemaTool.java:410)
        at org.apache.openjpa.jdbc.schema.SchemaTool.run(SchemaTool.java:375)
        at org.apache.openjpa.jdbc.meta.MappingTool.record(MappingTool.java:571)
        ... 11 more
Caused by: ERROR XJ001: XJ001.U : [0]
org.apache.derby.shared.common.sanity.AssertFailure, [1] ASSERT FAILED
lcc=org.apache.derby.impl.sql.conn.GenericLanguageConnectionContext@24a77e1e
getContextOrNull=null
        at 
org.apache.derby.impl.jdbc.SQLExceptionFactory.wrapArgsForTransportAcrossDRDA(SQLExceptionFactory.java:170)
        at 
org.apache.derby.impl.jdbc.SQLExceptionFactory.getSQLException(SQLExceptionFactory.java:75)
        ... 36 more
Caused by: org.apache.derby.shared.common.sanity.AssertFailure: ASSERT
FAILED 
lcc=org.apache.derby.impl.sql.conn.GenericLanguageConnectionContext@24a77e1e
getContextOrNull=null
        at 
org.apache.derby.shared.common.sanity.SanityManager.ASSERT(SanityManager.java:120)
        at 
org.apache.derby.iapi.util.InterruptStatus.restoreIntrFlagIfSeen(InterruptStatus.java:245)
        at 
org.apache.derby.impl.jdbc.EmbedConnection.prepareMetaDataStatement(EmbedConnection.java:2889)
        at 
org.apache.derby.impl.jdbc.EmbedDatabaseMetaData.prepareSPS(EmbedDatabaseMetaData.java:3803)
        at 
org.apache.derby.impl.jdbc.EmbedDatabaseMetaData.getPreparedQueryUsingSystemTables(EmbedDatabaseMetaData.java:3635)
        ... 28 more


The not debug mode looks more raw - yeah, jdbc driver still publish not
debuggable jars but derby is easy to build from sources and then you can
set it as systemPath in the pom to debug:

Caused by: ERROR XJ001: XJ001.U : [0] java.lang.NullPointerException, [1]
at
org.apache.derby.impl.jdbc.SQLExceptionFactory.wrapArgsForTransportAcrossDRDA(Unknown
Source)
... 42 more
Caused by: java.lang.NullPointerException
at org.apache.derby.impl.sql.compile.CastNode.bindCastNodeOnly(Unknown
Source)
at org.apache.derby.impl.sql.compile.CastNode.bindExpression(Unknown Source)
at org.apache.derby.impl.sql.compile.ResultColumn.bindExpression(Unknown
Source)
at
org.apache.derby.impl.sql.compile.ResultColumnList.bindExpressions(Unknown
Source)
at org.apache.derby.impl.sql.compile.SelectNode.bindExpressions(Unknown
Source)
at
org.apache.derby.impl.sql.compile.DMLStatementNode.bindExpressions(Unknown
Source)
at org.apache.derby.impl.sql.compile.DMLStatementNode.bind(Unknown Source)
at org.apache.derby.impl.sql.compile.CursorNode.bindStatement(Unknown
Source)
at org.apache.derby.impl.sql.GenericStatement.prepMinion(Unknown Source)
at org.apache.derby.impl.sql.GenericStatement.prepareStorable(Unknown
Source)
at
org.apache.derby.iapi.sql.dictionary.SPSDescriptor.compileStatement(Unknown
Source)
at
org.apache.derby.iapi.sql.dictionary.SPSDescriptor.prepareAndRelease(Unknown
Source)
at
org.apache.derby.iapi.sql.dictionary.SPSDescriptor.getPreparedStatement(Unknown
Source)
at
org.apache.derby.iapi.sql.dictionary.SPSDescriptor.getPreparedStatement(Unknown
Source)
at org.apache.derby.impl.sql.compile.ExecSPSNode.generate(Unknown Source)
at org.apache.derby.impl.sql.GenericStatement.prepMinion(Unknown Source)
at org.apache.derby.impl.sql.GenericStatement.prepare(Unknown Source)
at
org.apache.derby.impl.sql.conn.GenericLanguageConnectionContext.prepareInternalStatement(Unknown
Source)
... 34 more

Overall it is mainly about making derby graalifyable I think.
I need to switch to another topic for a moment so if anyone wants to
continue the experimentations just jump in.

The small side notes I can gives are:

1. we can do a dbcp2-knight and a commons-logging-knight (for now they are
in openjpa one - it is commented as such), these ones should be easy since
already coded, just not packaged properly
2. the immediate fix for deby will likely sit either
in org.apache.geronimo.arthur.knight.derby.DerbyExtension or a substitution
in the same module
3. if easier we can use another database (h2 does not work and will likely
not work in embedded mode so hsqldb can be saner - at least I don't know
for this one)

If you are motivated to proove openjpa runs in native mode and finish this
branch, don't hesitate to answer this thread, I'd also be happy to discuss
more on slack or by mail details if it helps.

Romain Manni-Bucau
@rmannibucau <https://twitter.com/rmannibucau> |  Blog
<https://rmannibucau.metawerx.net/> | Old Blog
<http://rmannibucau.wordpress.com> | Github <https://github.com/rmannibucau> |
LinkedIn <https://www.linkedin.com/in/rmannibucau> | Book
<https://www.packtpub.com/application-development/java-ee-8-high-performance>

Reply via email to