Memcached and Redis extensions error when attempting to cache a MySQL query

Description

When you attempt to cache a query from MySQL using cacheput() and Memcached with extension version 4.0.0.10-SNAPSHOT you get the following error:

java.lang.RuntimeException:java.io.NotSerializableException: com.mysql.cj.jdbc.result.ResultSetMetaData

However, if you do the same with a query from QueryNew() function, then cachePut() works fine.

This is a regression as this was not a problem in the 3.x version of the extension.

Also If we pass the query through filter, e.g.:

testQry = queryExecute( sql = "SELECT 1 AS result FROM users LIMIT 1", options = { datasource = 'users'} ).filter( (q) => { return true })

Then it is possible to cache the query using cachePut()

Tested on Lucee 6.0.1.83 with Memcached 1.6.27 and Memcached extension 4.0.0.10-SNAPSHOT

The Redis Extension, version 3.0.0.51 and 3.0.0.56-SNAPSHOT, will also not store a MySQL query, but instead of erroring fail silently to store the query and when attempting to retrieve it using cacheGet() return null as the query is not in the Redis cache (confirmed using Redis Insight desktop tool)

Here is the full Stacktrace for the error:

lucee.runtime.exp.NativeException: java.lang.RuntimeException:java.io.NotSerializableException: com.mysql.cj.jdbc.result.ResultSetMetaData at lucee.commons.lang.ExceptionUtil.toIOException(ExceptionUtil.java:194) at lucee.runtime.op.ExceptonImpl.toIOException(ExceptonImpl.java:259) at org.lucee.extension.cache.mc.MemcachedCache.put(MemcachedCache.java:324) at lucee.runtime.functions.cache.CachePut._call(CachePut.java:66) at lucee.runtime.functions.cache.CachePut.call(CachePut.java:43) at index_cfm$cf.call(/index.cfm:22) at lucee.runtime.PageContextImpl._doInclude(PageContextImpl.java:1059) at lucee.runtime.PageContextImpl._doInclude(PageContextImpl.java:951) at lucee.runtime.listener.ClassicAppListener._onRequest(ClassicAppListener.java:65) at lucee.runtime.listener.MixedAppListener.onRequest(MixedAppListener.java:45) at lucee.runtime.PageContextImpl.execute(PageContextImpl.java:2715) at lucee.runtime.PageContextImpl._execute(PageContextImpl.java:2701) at lucee.runtime.PageContextImpl.executeCFML(PageContextImpl.java:2672) at lucee.runtime.engine.Request.exe(Request.java:45) at lucee.runtime.engine.CFMLEngineImpl._service(CFMLEngineImpl.java:1259) at lucee.runtime.engine.CFMLEngineImpl.serviceCFML(CFMLEngineImpl.java:1205) at lucee.loader.engine.CFMLEngineWrapper.serviceCFML(CFMLEngineWrapper.java:97) at lucee.loader.servlet.CFMLServlet.service(CFMLServlet.java:51) at javax.servlet.http.HttpServlet.service(HttpServlet.java:590) at io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:74) at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:129) at org.cfmlprojects.regexpathinfofilter.RegexPathInfoFilter.doFilter(RegexPathInfoFilter.java:54) at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67) at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131) at io.undertow.servlet.handlers.FilterHandler.handleRequest(FilterHandler.java:84) at io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62) at io.undertow.servlet.handlers.ServletChain$1.handleRequest(ServletChain.java:68) at io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36) at runwar.undertow.SSLCertHeaderHandler.handleRequest(SSLCertHeaderHandler.java:161) at io.undertow.servlet.handlers.RedirectDirHandler.handleRequest(RedirectDirHandler.java:68) at io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:117) at io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57) at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) at io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46) at io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64) at io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:60) at io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:77) at io.undertow.security.handlers.AbstractSecurityContextAssociationHandler.handleRequest(AbstractSecurityContextAssociationHandler.java:43) at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) at io.undertow.servlet.handlers.SendErrorPageHandler.handleRequest(SendErrorPageHandler.java:52) at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) at io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:275) at io.undertow.servlet.handlers.ServletInitialHandler.access$100(ServletInitialHandler.java:79) at io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:134) at io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:131) at io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1.call(ServletRequestContextThreadSetupAction.java:48) at io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43) at io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:255) at io.undertow.servlet.handlers.ServletInitialHandler.handleRequest(ServletInitialHandler.java:175) at io.undertow.server.handlers.HttpContinueReadHandler.handleRequest(HttpContinueReadHandler.java:69) at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) at runwar.undertow.WelcomeFileHandler.handleRequest(WelcomeFileHandler.java:39) at io.undertow.server.handlers.PathHandler.handleRequest(PathHandler.java:104) at runwar.undertow.SiteDeployment$1.handleRequest(SiteDeployment.java:162) at io.undertow.predicate.PredicatesHandler.handleRequest(PredicatesHandler.java:141) at io.undertow.server.handlers.DisallowedMethodsHandler.handleRequest(DisallowedMethodsHandler.java:62) at io.undertow.predicate.PredicatesHandler.handleRequest(PredicatesHandler.java:113) at io.undertow.server.handlers.encoding.EncodingHandler.handleRequest(EncodingHandler.java:72) at runwar.undertow.LifecyleHandler.handleRequest(LifecyleHandler.java:143) at runwar.undertow.SiteDeployment$4.handleRequest(SiteDeployment.java:345) at io.undertow.server.Connectors.executeRootHandler(Connectors.java:393) at io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:852) at org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35) at org.jboss.threads.EnhancedQueueExecutor.safeRun(EnhancedQueueExecutor.java:2019) at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1558) at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1449) at org.xnio.XnioWorker$WorkerThreadFactory$1$1.run(XnioWorker.java:1282) at java.base/java.lang.Thread.run(Unknown Source) Caused by: java.io.IOException: java.lang.RuntimeException:java.io.NotSerializableException: com.mysql.cj.jdbc.result.ResultSetMetaData ... 68 more Caused by: java.lang.RuntimeException: java.io.NotSerializableException: com.mysql.cj.jdbc.result.ResultSetMetaData at org.lucee.extension.cache.mc.TranscoderImpl.encode(TranscoderImpl.java:75) at net.spy.memcached.MemcachedClient.asyncStore(MemcachedClient.java:304) at net.spy.memcached.MemcachedClient.set(MemcachedClient.java:928) at org.lucee.extension.cache.mc.MemcachedCache.put(MemcachedCache.java:322) ... 65 more Caused by: java.io.NotSerializableException: com.mysql.cj.jdbc.result.ResultSetMetaData at java.base/java.io.ObjectOutputStream.writeObject0(Unknown Source) at java.base/java.io.ObjectOutputStream.defaultWriteFields(Unknown Source) at java.base/java.io.ObjectOutputStream.writeSerialData(Unknown Source) at java.base/java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source) at java.base/java.io.ObjectOutputStream.writeObject0(Unknown Source) at java.base/java.io.ObjectOutputStream.defaultWriteFields(Unknown Source) at java.base/java.io.ObjectOutputStream.writeSerialData(Unknown Source) at java.base/java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source) at java.base/java.io.ObjectOutputStream.writeObject0(Unknown Source) at java.base/java.io.ObjectOutputStream.writeObject(Unknown Source) at org.lucee.extension.cache.mc.TranscoderImpl.toBytes(TranscoderImpl.java:122) at org.lucee.extension.cache.mc.TranscoderImpl.encode(TranscoderImpl.java:57) ... 68 more

Environment

None

Attachments

8
  • 28 May 2024, 02:51 pm
  • 28 May 2024, 02:51 pm
  • 28 May 2024, 02:47 pm
  • 28 May 2024, 02:47 pm
  • 28 May 2024, 02:47 pm
  • 28 May 2024, 02:47 pm
  • 24 May 2024, 02:27 pm
  • 24 May 2024, 02:27 pm

Activity

Show:

Pothys - MitrahSoft 8 July 2024 at 07:52

I've checked this ticket with Lucee version 6.1.0.233. Now the issue seems to be fixed, and it works as expected.

Michael Offner 5 July 2024 at 09:58

i can reproduce the issue with this

function test() { query datasource="mysql" name="local.q" { ``` show tables ``` } dump(objectSave(q)); } test();

i will add test cases to lucee for all base types, not only queries

Michael Offner 5 July 2024 at 09:50

Problem is the metadata loaded into the query, i think they could be transident

Fixed

Details

Assignee

Reporter

Priority

Fix versions

New Issue warning screen

Before you create a new Issue, please post to the mailing list first https://dev.lucee.org

Once the issue has been verified, one of the Lucee team will ask you to file an issue

Sprint

Affects versions

Created 24 May 2024 at 14:10
Updated 8 July 2024 at 07:53
Resolved 8 July 2024 at 07:53

Flag notifications