Hello, Francesco,

Thanks for your reply.

MariaDB is a given right now, and upgrading to Syncope 4.0.0 is planned for the near future, but we will adjust the database software and settings and give it a try.

Kind regards

Stephan

On Mon, Jun 16, 2025 at 12:21:28PM +0200, Francesco Chicchiriccò wrote:
Hi Stephan,
sorry for late reply.

I believe your issue is... MariaDB, especially under load.

We have verified that it is by far the less performant DBMS with Syncope
and it also shows some limitations when enabling the JSON support [1],
which can lead to the errors reported about db metadata.

I would at least ensure to:

1. run the latest MariaDB server (11.8.2 as it seems) and JDBC driver
(3.5.3 at present)

2. configure an adequate size for the db connection pool, e.g. increase the
default values of

persistence.domain[0].poolMaxActive=20
persistence.domain[0].poolMinIdle=5

in your core-something.properties where "something" is the Spring Boot
profile you are currently using.

3. upgrade to Syncope 4.0.0 as soon as possible, especially for a new
project

HTH
Regards.

[1] https://syncope.apache.org/docs/3.0/reference-guide.html#mariadb-json

Il giorno mer 11 giu 2025 alle ore 13:18 Feder, Stephan <
stephan.fe...@tu-darmstadt.de> ha scritto:

Hello,

On Syncope 3.0.12, I have (probably related) problems under, and even
after, heavy load:

First problem:

org.apache.openjpa.persistence.PersistenceException: Cannot invoke
"org.mariadb.jdbc.client.DataType.getColumnConstructor()" because
"dataType" is null
   at org.apache.openjpa.kernel.BrokerImpl.findAll(BrokerImpl.java:1254)
~[openjpa-kernel-3.2.2.jar:3.2.2]
   at org.apache.openjpa.kernel.BrokerImpl.findAll(BrokerImpl.java:1139)
~[openjpa-kernel-3.2.2.jar:3.2.2]
   at
org.apache.openjpa.kernel.AbstractPCData.toRelationFields(AbstractPCData.java:222)
~[openjpa-kernel-3.2.2.jar:3.2.2]
   at
org.apache.openjpa.kernel.AbstractPCData.toNestedFields(AbstractPCData.java:189)
~[openjpa-kernel-3.2.2.jar:3.2.2]
org.apache.openjpa.kernel.AbstractPCData.toField(AbstractPCData.java:79)
~[openjpa-kernel-3.2.2.jar:3.2.2]
   at org.apache.openjpa.kernel.PCDataImpl.loadField(PCDataImpl.java:220)
~[openjpa-kernel-3.2.2.jar:3.2.2]
   at org.apache.openjpa.kernel.PCDataImpl.load(PCDataImpl.java:165)
~[openjpa-kernel-3.2.2.jar:3.2.2]
   at
org.apache.openjpa.datacache.DataCacheStoreManager.initialize(DataCacheStoreManager.java:384)
~[openjpa-kernel-3.2.2.jar:3.2.2]
   at
org.apache.openjpa.kernel.DelegatingStoreManager.initialize(DelegatingStoreManager.java:123)
~[openjpa-kernel-3.2.2.jar:3.2.2]
   at
org.apache.openjpa.kernel.ROPStoreManager.initialize(ROPStoreManager.java:59)
~[openjpa-kernel-3.2.2.jar:3.2.2]
   at
org.apache.openjpa.kernel.BrokerImpl.initialize(BrokerImpl.java:1118)
~[openjpa-kernel-3.2.2.jar:3.2.2]
   at org.apache.openjpa.kernel.BrokerImpl.find(BrokerImpl.java:1076)
~[openjpa-kernel-3.2.2.jar:3.2.2]
   at org.apache.openjpa.kernel.BrokerImpl.find(BrokerImpl.java:998)
~[openjpa-kernel-3.2.2.jar:3.2.2]
   at
org.apache.openjpa.jdbc.kernel.JDBCStoreManager.load(JDBCStoreManager.java:1077)
~[openjpa-jdbc-3.2.2.jar:3.2.2]
   at
org.apache.openjpa.jdbc.sql.AbstractResult.load(AbstractResult.java:305)
~[openjpa-jdbc-3.2.2.jar:3.2.2]
   at
org.apache.openjpa.jdbc.sql.SelectImpl$SelectResult.load(SelectImpl.java:2537)
~[openjpa-jdbc-3.2.2.jar:3.2.2]
   at
org.apache.openjpa.jdbc.meta.strats.RelationFieldStrategy.loadEagerJoin(RelationFieldStrategy.java:743)
~[openjpa-jdbc-3.2.2.jar:3.2.2]
   at

org.apache.openjpa.jdbc.meta.FieldMapping.loadEagerJoin(FieldMapping.java:954)
~[openjpa-jdbc-3.2.2.jar:3.2.2]
   at
org.apache.openjpa.jdbc.kernel.JDBCStoreManager.load(JDBCStoreManager.java:1147)
~[openjpa-jdbc-3.2.2.jar:3.2.2]
   at
org.apache.openjpa.jdbc.kernel.JDBCStoreManager.load(JDBCStoreManager.java:1103)
~[openjpa-jdbc-3.2.2.jar:3.2.2]
   at
org.apache.openjpa.jdbc.kernel.JDBCStoreManager.initializeState(JDBCStoreManager.java:430)
~[openjpa-jdbc-3.2.2.jar:3.2.2]
   at
org.apache.openjpa.jdbc.kernel.JDBCStoreManager.initialize(JDBCStoreManager.java:325)
~[openjpa-jdbc-3.2.2.jar:3.2.2]
   at
org.apache.openjpa.kernel.DelegatingStoreManager.initialize(DelegatingStoreManager.java:123)
~[openjpa-kernel-3.2.2.jar:3.2.2]
   at
org.apache.openjpa.datacache.DataCacheStoreManager.initialize(DataCacheStoreManager.java:392)
~[openjpa-kernel-3.2.2.jar:3.2.2]

 
org.apache.openjpa.kernel.DelegatingStoreManager.initialize(DelegatingStoreManager.java:123)
~[openjpa-kernel-3.2.2.jar:3.2.2]
   at
org.apache.openjpa.kernel.ROPStoreManager.initialize(ROPStoreManager.java:59)
~[openjpa-kernel-3.2.2.jar:3.2.2]
   at
org.apache.openjpa.kernel.BrokerImpl.initialize(BrokerImpl.java:1118)
~[openjpa-kernel-3.2.2.jar:3.2.2]
   at org.apache.openjpa.kernel.BrokerImpl.find(BrokerImpl.java:1076)
~[openjpa-kernel-3.2.2.jar:3.2.2]
   at org.apache.openjpa.kernel.BrokerImpl.find(BrokerImpl.java:992)
~[openjpa-kernel-3.2.2.jar:3.2.2]
   at
org.apache.openjpa.kernel.DelegatingBroker.find(DelegatingBroker.java:246)
~[openjpa-kernel-3.2.2.jar:3.2.2]
   at
org.apache.openjpa.persistence.EntityManagerImpl.find(EntityManagerImpl.java:582)
~[openjpa-persistence-3.2.2.jar:3.2.2]
   at
org.apache.syncope.core.persistence.jpa.dao.JPAPlainSchemaDAO.find(JPAPlainSchemaDAO.java:61)
~[syncope-core-persistence-jpa-3.0.12.jar:3.0.12]
   at
org.apache.syncope.core.persistence.jpa.dao.JPAPlainSchemaDAO.find(JPAPlainSchemaDAO.java:41)
~[syncope-core-persistence-jpa-3.0.12.jar:3.0.12]
   at
org.apache.syncope.core.persistence.jpa.entity.user.JPAJSONUPlainAttr.getSchema(JPAJSONUPlainAttr.java:96)
~[syncope-core-persistence-jpa-json-3.0.12.jar:3.0.12]
   at
org.apache.syncope.core.persistence.jpa.entity.user.JPAJSONUPlainAttr.getSchema(JPAJSONUPlainAttr.java:44)
~[syncope-core-persistence-jpa-json-3.0.12.jar:3.0.12]
   at
org.apache.syncope.core.persistence.jpa.entity.JPAJSONEntityListener.lambda$json2list$0(JPAJSONEntityListener.java:39)
~[syncope-core-persistence-jpa-json-3.0.12.jar:3.0.12]
   at
java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:178)
~[?:?]
   at
java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1625)
~[?:?]
   at
java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)
~[?:?]
   at
java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
~[?:?]
   at
java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150)
~[?:?]
   at
java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173)
~[?:?]
   at
java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
~[?:?]
   at
java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:596)
~[?:?]
   at
org.apache.syncope.core.persistence.jpa.entity.JPAJSONEntityListener.json2list(JPAJSONEntityListener.java:51)
~[syncope-core-persistence-jpa-json-3.0.12.jar:3.0.12]
   at
org.apache.syncope.core.persistence.jpa.entity.user.JPAJSONUserListener.read(JPAJSONUserListener.java:46)
~[syncope-core-persistence-jpa-json-3.0.12.jar:3.0.12]
   at jdk.internal.reflect.GeneratedMethodAccessor349.invoke(Unknown
Source) ~[?:?]
   at
java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
~[?:?]
   at java.base/java.lang.reflect.Method.invoke(Method.java:569) ~[?:?]
   at
org.apache.openjpa.event.BeanLifecycleCallbacks.makeCallback(BeanLifecycleCallbacks.java:86)
~[openjpa-kernel-3.2.2.jar:3.2.2]
   at
org.apache.openjpa.event.LifecycleEventManager.makeCallbacks(LifecycleEventManager.java:351)
~[openjpa-kernel-3.2.2.jar:3.2.2]
   at
org.apache.openjpa.event.LifecycleEventManager.fireEvent(LifecycleEventManager.java:311)
~[openjpa-kernel-3.2.2.jar:3.2.2]
   at
org.apache.openjpa.kernel.BrokerImpl.fireLifecycleEvent(BrokerImpl.java:877)
~[openjpa-kernel-3.2.2.jar:3.2.2]
   at
org.apache.openjpa.kernel.StateManagerImpl.postLoad(StateManagerImpl.java:3483)
~[openjpa-kernel-3.2.2.jar:3.2.2]
   at
org.apache.openjpa.kernel.StateManagerImpl.postLoad(StateManagerImpl.java:3461)
~[openjpa-kernel-3.2.2.jar:3.2.2]
   at
org.apache.openjpa.kernel.StateManagerImpl.loadFields(StateManagerImpl.java:3304)
~[openjpa-kernel-3.2.2.jar:3.2.2]
   at
org.apache.openjpa.kernel.StateManagerImpl.load(StateManagerImpl.java:452)
~[openjpa-kernel-3.2.2.jar:3.2.2]
   at org.apache.openjpa.kernel.BrokerImpl.find(BrokerImpl.java:1086)
~[openjpa-kernel-3.2.2.jar:3.2.2]
   at org.apache.openjpa.kernel.BrokerImpl.find(BrokerImpl.java:998)
~[openjpa-kernel-3.2.2.jar:3.2.2]
   at
org.apache.openjpa.jdbc.kernel.JDBCStoreManager.load(JDBCStoreManager.java:1077)
~[openjpa-jdbc-3.2.2.jar:3.2.2]
   at
org.apache.openjpa.jdbc.kernel.JDBCStoreManager.load(JDBCStoreManager.java:1077)
~[openjpa-jdbc-3.2.2.jar:3.2.2]
   at
org.apache.openjpa.jdbc.sql.AbstractResult.load(AbstractResult.java:305)
~[openjpa-jdbc-3.2.2.jar:3.2.2]
   at
org.apache.openjpa.jdbc.sql.SelectImpl$SelectResult.load(SelectImpl.java:2537)
~[openjpa-jdbc-3.2.2.jar:3.2.2]
   at
org.apache.openjpa.jdbc.sql.AbstractResult.load(AbstractResult.java:298)
~[openjpa-jdbc-3.2.2.jar:3.2.2]
   at
org.apache.openjpa.jdbc.kernel.InstanceResultObjectProvider.getResultObject(InstanceResultObjectProvider.java:60)
~[openjpa-jdbc-3.2.2.jar:3.2.2]
   at
org.apache.openjpa.datacache.QueryCacheStoreQuery$CachingResultObjectProvider.getResultObject(QueryCacheStoreQuery.java:717)
~[openjpa-kernel-3.2.2.jar:3.2.2]
   at
org.apache.openjpa.kernel.QueryImpl$PackingResultObjectProvider.getResultObject(QueryImpl.java:2193)
~[openjpa-kernel-3.2.2.jar:3.2.2]
   at
org.apache.openjpa.lib.rop.EagerResultList.<init>(EagerResultList.java:38)
~[openjpa-lib-3.2.2.jar:3.2.2]
   at org.apache.openjpa.kernel.QueryImpl.toResult(QueryImpl.java:1314)
~[openjpa-kernel-3.2.2.jar:3.2.2]
   at org.apache.openjpa.kernel.QueryImpl.execute(QueryImpl.java:1061)
~[openjpa-kernel-3.2.2.jar:3.2.2]
   at org.apache.openjpa.kernel.QueryImpl.execute(QueryImpl.java:911)
~[openjpa-kernel-3.2.2.jar:3.2.2]
   at org.apache.openjpa.kernel.QueryImpl.execute(QueryImpl.java:842)
~[openjpa-kernel-3.2.2.jar:3.2.2]
   at
org.apache.openjpa.kernel.DelegatingQuery.execute(DelegatingQuery.java:601)
~[openjpa-kernel-3.2.2.jar:3.2.2]
   at org.apache.openjpa.persistence.QueryImpl.execute(QueryImpl.java:297)
~[openjpa-persistence-3.2.2.jar:3.2.2]
   at
org.apache.openjpa.persistence.QueryImpl.getResultList(QueryImpl.java:314)
~[openjpa-persistence-3.2.2.jar:3.2.2]
   at
org.apache.syncope.core.persistence.jpa.dao.JPAUserDAO.findAll(JPAUserDAO.java:277)
~[syncope-core-persistence-jpa-3.0.12.jar:3.0.12]
...


As far as Syncope is concerned, the step that ultimately fails is
JPAPlainSchemaDAO.find(). As this method only has a string argument I do
not see what I could have done to make that call fail.

Second problem:

org.apache.syncope.core.persistence.api.attrvalue.validation.ParsingValidationException:
While trying to parse '4589  at
org.apache.syncope.core.persistence.jpa.entity.AbstractPlainAttrValue.parseValue(AbstractPlainAttrValue.java:19
at
org.apache.syncope.core.persistence.jpa.attrvalue.validation.AbstractValidator.validate(AbstractValidator.java:
at
org.apache.syncope.core.persistence.jpa.attrvalue.validation.DefaultPlainAttrValidationManager.validate(Default
at
org.apache.syncope.core.persistence.jpa.entity.AbstractPlainAttr.add(AbstractPlainAttr.java:73)
~[syncope-core-  at
org.apache.syncope.core.persistence.jpa.entity.AbstractPlainAttr.add(AbstractPlainAttr.java:97)
~[syncope-core-  at
org.apache.syncope.core.provisioning.java.data.AbstractAnyDataBinder.lambda$fillAttr$3(AbstractAnyDataBinder.ja
at java.base/java.lang.Iterable.forEach(Iterable.java:75) ~[?:?]
   at
org.apache.syncope.core.provisioning.java.data.AbstractAnyDataBinder.fillAttr(AbstractAnyDataBinder.java:264)
~  at
org.apache.syncope.core.provisioning.java.data.AbstractAnyDataBinder.lambda$fill$18(AbstractAnyDataBinder.java:
at
java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183)
~[?:?]
   at
java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:179)
~[?:?]
   at
java.base/java.util.HashMap$KeySpliterator.forEachRemaining(HashMap.java:1707)
~[?:?]
   at
java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)
~[?:?]
   at
java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
~[?:?]
   at
java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150)
~[?:?]
   at
java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173)
~[?:?]
   at
java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
~[?:?]
   at
java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:596)
~[?:?]
   at
org.apache.syncope.core.provisioning.java.data.AbstractAnyDataBinder.fill(AbstractAnyDataBinder.java:553)
~[syn  at
org.apache.syncope.core.provisioning.java.data.UserDataBinderImpl.create(UserDataBinderImpl.java:433)
~[syncope  at
jdk.internal.reflect.GeneratedMethodAccessor298.invoke(Unknown Source)
~[?:?]
   at
java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
~[?:?]  at java.base/java.lang.reflect.Method.invoke(Method.java:569) ~[?:?]
   at
org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:344)
~[spring-aop-5.3.39.  at
org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:19
at
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
~[spr  at
org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionIntercept
at
org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectS
at
org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119)
~[sp  at
org.apache.syncope.core.persistence.jpa.spring.DomainTransactionInterceptor.invoke(DomainTransactionInterceptor
at
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
~[spr  at
org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:241)
~[spring-aop-5.3.39.ja  at jdk.proxy3/jdk.proxy3.$Proxy171.create(Unknown
Source) ~[?:?]
   at
org.apache.syncope.core.flowable.task.Create.doExecute(Create.java:45)
~[syncope-ext-flowable-bpmn-3.0.12.jar:3  at
org.apache.syncope.core.flowable.task.FlowableServiceTask.execute(FlowableServiceTask.java:37)
~[syncope-ext-fl...
Caused by: java.time.format.DateTimeParseException: Text '524831332' could
not be parsed at index 0
   at
java.base/java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:2052)
~[?:?]
   at
java.base/java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1954)
~[?:?]
   at java.base/java.time.LocalDate.parse(LocalDate.java:430) ~[?:?]
   at
org.apache.syncope.core.provisioning.api.utils.FormatUtils.parseDate(FormatUtils.java:135)
~[syncope-core-provi  at
org.apache.syncope.core.persistence.jpa.entity.AbstractPlainAttrValue.parseValue(AbstractPlainAttrValue.java:17

The funny thing is that of course, uidNumber is NOT defined to be a date.
The schema definition that is used to parse the value seems to not match
the schema of the value. After some research we found that
PlainSchemaDAO.find() is used to get the schema definition, so this could
be related to the first problem.

Are there known issues with PlainSchemaDAO.find()? Did anyone experience
anything similar?

Kind regards

Stephan



--
Francesco Chicchiriccò

Tirasa - Open Source Excellence
http://www.tirasa.net/

Member at The Apache Software Foundation
Syncope, Cocoon, Olingo, CXF, OpenJPA
https://about.me/ilgrosso <http://home.apache.org/~ilgrosso/>

Reply via email to