How can I build an Agroal connection at runtime with native support

1.6k views Asked by At

I'm trying to build a dynamic database connection via Agroal inside a native image. It's not possible to use the default config params because I don't know the connection params at compile time. Is that even possible right now? The connection is built like this at runtime:

AgroalDataSource.from(
    AgroalDataSourceConfigurationSupplier()
      ...)

I'm currently seeing this error:

Class io.agroal.pool.ConnectionHandler[] is instantiated reflectively but was never registered. 
Register the class by using org.graalvm.nativeimage.hosted.RuntimeReflection

The installed features include: [agroal, cdi, jdbc-h2, jdbc-mysql, jdbc-postgresql, kotlin, narayana-jta, resteasy, resteasy-jackson]

It runs fine on the JVM, but not using Graal. It feels like it should be possible and I'm probably missing something here. I was hoping adding agraol extension would be sufficient but obviously isn't picked up correctly.

1

There are 1 answers

0
Guillaume Smet On

The current situation is that we configure Agroal for native images only if you have a datasource defined using Quarkus configuration.

Thus for your use case, for now, you will have to do what we do automatically manually. What we do being registering some classes for reflection and including some resources in the native image.

See https://github.com/quarkusio/quarkus/blob/master/extensions/agroal/deployment/src/main/java/io/quarkus/agroal/deployment/AgroalProcessor.java#L91 and https://quarkus.io/guides/writing-native-applications-tips#using-a-configuration-file.

Obviously, that's not ideal. Could you open an issue on our GitHub so that we can discuss it internally and see if we should/can improve the situation?

In the end, you would still need some reflection registration for your JDBC driver though.