You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@logging.apache.org by "minseo300 (via GitHub)" <gi...@apache.org> on 2024/10/28 00:50:19 UTC
[I] JdbcAppender using buffersize property, mysql jdbc driver and ColumnConfig's clob property with true occurs java.io.IOException : Stream closed (logging-log4j2)
minseo300 opened a new issue, #3127:
URL: https://github.com/apache/logging-log4j2/issues/3127
## Description
JdbcAppender using buffersize property, mysql jdbc driver and ColumnConfig's isClob property with true occurs java.io.IOException : Stream closed.
It doesn't occure when I configure JdbcAppender using bufferSize property, mysql jdbc driver and ColumnConfig's isClob property with false.
And it doesn't occure when I configure JdbcAppender using mysql jdbc driver and ColumnConfig's isClob property with true.
Also it doesn't occure when I configure JdbcAppender using the other jdbc driver(oracle, postgresql), bufferSize property and ColumnConfig's isClob property with true.
As I analyzed it, when I configure JdbcAppender using buffer size property and ColumnConfig's isClob property with true, then JdbcDatabaseManager.writeInternal() set StringReader instance to PreparedStatement using setClob() api.
Then, If current buffer size doesn't reach limit, call statement.addBatch() and if current buffer size reach to limit of buffer then call statement.executeUpdate().
Close the StringReader object at the end, whether the buffer is full or not in "finally" block.
I think there's a problem.
ClientPreparedStatement(from mysql driver) uses StringReader instance passed by argument(The other driver like oracle makes new StringReader instance and use it, so they doesn't share instance).
So, If JdbcDatabaseAppender close StringReader in finally block, StringReader is closed before statement.executeUpdate() then IOException : Stream is close exception is ocurred.
I wondering is there any reason that Log4j2 JdbcDatabaseManager close StringReader in finally block, or this is just bug.
log4j2.xml
```
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="error">
<Appenders>
<JDBC name="databaseAppender" tableName="logging_event">
<bufferSize>10</bufferSize>
<DriverManager userName="root" password="1234" connectionString = "jdbc:mysql://localhost:3306/logging_test" driverClassName="com.mysql.jdbc.Driver" />
<Column name="log_event_date" pattern="%d" />
<Column name="logger_name" pattern="%c" />
<Column name="log_level" pattern="%p"/>
<Column name="thread_name" pattern="%t"/>
<Column name="message" pattern="%message" isClob="true"/>
</JDBC>
</Appenders>
<Loggers>
<Root level="info">
<AppenderRef ref="databaseAppender"/>
</Root>
</Loggers>
</Configuration>
```
## Configuration
**Version: 2.17.1
**Operating system: any
**JDK: 1.8
## Logs
```
"C:\Program Files\Java\java-1.8.0-openjdk-1.8\bin\java.exe" -Dvisualvm.id=1582776983231300 -XX:TieredStopAtLevel=1 -noverify -Dspring.output.ansi.enabled=always -Dcom.sun.management.jmxremote -Dspring.jmx.enabled=true -Dspring.liveBeansView.mbeanDomain -Dspring.application.admin.enabled=true "-Dmanagement.endpoints.jmx.exposure.include=*" "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2023.1\lib\idea_rt.jar=59652:C:\Program Files\JetBrains\IntelliJ IDEA 2023.1\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\java-1.8.0-openjdk-1.8\jre\lib\charsets.jar;C:\Program Files\Java\java-1.8.0-openjdk-1.8\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\java-1.8.0-openjdk-1.8\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\java-1.8.0-openjdk-1.8\jre\lib\ext\dnsns.jar;C:\Program Files\Java\java-1.8.0-openjdk-1.8\jre\lib\ext\jaccess.jar;C:\Program Files\Java\java-1.8.0-openjdk-1.8\jre\lib\ext\localedata.jar;C:\Program Files\Java\java-1.8.0-openjdk-1.8\jre\lib\ext\nashor
n.jar;C:\Program Files\Java\java-1.8.0-openjdk-1.8\jre\lib\ext\sunec.jar;C:\Program Files\Java\java-1.8.0-openjdk-1.8\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\java-1.8.0-openjdk-1.8\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\java-1.8.0-openjdk-1.8\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\java-1.8.0-openjdk-1.8\jre\lib\ext\zipfs.jar;C:\Program Files\Java\java-1.8.0-openjdk-1.8\jre\lib\jce.jar;C:\Program Files\Java\java-1.8.0-openjdk-1.8\jre\lib\jfr.jar;C:\Program Files\Java\java-1.8.0-openjdk-1.8\jre\lib\jsse.jar;C:\Program Files\Java\java-1.8.0-openjdk-1.8\jre\lib\management-agent.jar;C:\Program Files\Java\java-1.8.0-openjdk-1.8\jre\lib\resources.jar;C:\Program Files\Java\java-1.8.0-openjdk-1.8\jre\lib\rt.jar;C:\Users\Tmax\Desktop\tttttttttt\target\classes;C:\Users\Tmax\.m2\repository\org\springframework\boot\spring-boot-starter\2.4.5\spring-boot-starter-2.4.5.jar;C:\Users\Tmax\.m2\repository\org\springframework\boot\spring-boot\2.4.5\spring-boot-2.4.5.jar;C
:\Users\Tmax\.m2\repository\org\springframework\spring-context\5.3.6\spring-context-5.3.6.jar;C:\Users\Tmax\.m2\repository\org\springframework\boot\spring-boot-autoconfigure\2.4.5\spring-boot-autoconfigure-2.4.5.jar;C:\Users\Tmax\.m2\repository\jakarta\annotation\jakarta.annotation-api\1.3.5\jakarta.annotation-api-1.3.5.jar;C:\Users\Tmax\.m2\repository\org\springframework\spring-core\5.3.6\spring-core-5.3.6.jar;C:\Users\Tmax\.m2\repository\org\springframework\spring-jcl\5.3.6\spring-jcl-5.3.6.jar;C:\Users\Tmax\.m2\repository\org\yaml\snakeyaml\1.27\snakeyaml-1.27.jar;C:\Users\Tmax\.m2\repository\org\projectlombok\lombok\1.18.30\lombok-1.18.30.jar;C:\Users\Tmax\.m2\repository\org\springframework\boot\spring-boot-starter-web\2.4.5\spring-boot-starter-web-2.4.5.jar;C:\Users\Tmax\.m2\repository\org\springframework\boot\spring-boot-starter-json\2.4.5\spring-boot-starter-json-2.4.5.jar;C:\Users\Tmax\.m2\repository\com\fasterxml\jackson\core\jackson-databind\2.11.4\jackson-databind-2.11.4.
jar;C:\Users\Tmax\.m2\repository\com\fasterxml\jackson\core\jackson-annotations\2.11.4\jackson-annotations-2.11.4.jar;C:\Users\Tmax\.m2\repository\com\fasterxml\jackson\core\jackson-core\2.11.4\jackson-core-2.11.4.jar;C:\Users\Tmax\.m2\repository\com\fasterxml\jackson\datatype\jackson-datatype-jdk8\2.11.4\jackson-datatype-jdk8-2.11.4.jar;C:\Users\Tmax\.m2\repository\com\fasterxml\jackson\datatype\jackson-datatype-jsr310\2.11.4\jackson-datatype-jsr310-2.11.4.jar;C:\Users\Tmax\.m2\repository\com\fasterxml\jackson\module\jackson-module-parameter-names\2.11.4\jackson-module-parameter-names-2.11.4.jar;C:\Users\Tmax\.m2\repository\org\springframework\boot\spring-boot-starter-tomcat\2.4.5\spring-boot-starter-tomcat-2.4.5.jar;C:\Users\Tmax\.m2\repository\org\apache\tomcat\embed\tomcat-embed-core\9.0.45\tomcat-embed-core-9.0.45.jar;C:\Users\Tmax\.m2\repository\org\glassfish\jakarta.el\3.0.3\jakarta.el-3.0.3.jar;C:\Users\Tmax\.m2\repository\org\apache\tomcat\embed\tomcat-embed-websocket\9.0.4
5\tomcat-embed-websocket-9.0.45.jar;C:\Users\Tmax\.m2\repository\org\springframework\spring-web\5.3.6\spring-web-5.3.6.jar;C:\Users\Tmax\.m2\repository\org\springframework\spring-beans\5.3.6\spring-beans-5.3.6.jar;C:\Users\Tmax\.m2\repository\org\springframework\spring-webmvc\5.3.6\spring-webmvc-5.3.6.jar;C:\Users\Tmax\.m2\repository\org\springframework\spring-aop\5.3.6\spring-aop-5.3.6.jar;C:\Users\Tmax\.m2\repository\org\springframework\spring-expression\5.3.6\spring-expression-5.3.6.jar;C:\Users\Tmax\.m2\repository\org\springframework\boot\spring-boot-starter-log4j2\2.4.5\spring-boot-starter-log4j2-2.4.5.jar;C:\Users\Tmax\.m2\repository\org\apache\logging\log4j\log4j-slf4j-impl\2.13.3\log4j-slf4j-impl-2.13.3.jar;C:\Users\Tmax\.m2\repository\org\slf4j\slf4j-api\1.7.30\slf4j-api-1.7.30.jar;C:\Users\Tmax\.m2\repository\org\apache\logging\log4j\log4j-api\2.13.3\log4j-api-2.13.3.jar;C:\Users\Tmax\.m2\repository\org\apache\logging\log4j\log4j-core\2.13.3\log4j-core-2.13.3.jar;C:\Users\
Tmax\.m2\repository\org\apache\logging\log4j\log4j-jul\2.13.3\log4j-jul-2.13.3.jar;C:\Users\Tmax\.m2\repository\org\slf4j\jul-to-slf4j\1.7.30\jul-to-slf4j-1.7.30.jar;C:\Users\Tmax\.m2\repository\mysql\mysql-connector-java\8.0.30\mysql-connector-java-8.0.30.jar;C:\Users\Tmax\.m2\repository\com\oracle\database\jdbc\ojdbc6\11.2.0.4\ojdbc6-11.2.0.4.jar;C:\Users\Tmax\.m2\repository\com\oracle\database\jdbc\ucp\19.8.0.0\ucp-19.8.0.0.jar;C:\Users\Tmax\.m2\repository\com\oracle\database\security\oraclepki\19.8.0.0\oraclepki-19.8.0.0.jar;C:\Users\Tmax\.m2\repository\com\oracle\database\security\osdt_cert\19.8.0.0\osdt_cert-19.8.0.0.jar;C:\Users\Tmax\.m2\repository\com\oracle\database\security\osdt_core\19.8.0.0\osdt_core-19.8.0.0.jar;C:\Users\Tmax\.m2\repository\com\oracle\database\ha\simplefan\19.8.0.0\simplefan-19.8.0.0.jar;C:\Users\Tmax\.m2\repository\com\oracle\database\ha\ons\19.8.0.0\ons-19.8.0.0.jar;C:\Users\Tmax\.m2\repository\org\postgresql\postgresql\42.7.4\postgresql-42.7.4.jar;C:
\Users\Tmax\.m2\repository\org\checkerframework\checker-qual\3.42.0\checker-qual-3.42.0.jar" org.example.MainApplication
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.4.5)
Loading class `com.mysql.jdbc.Driver'. This is deprecated. The new driver class is `com.mysql.cj.jdbc.Driver'. The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary.
2024-10-28 09:25:14,975 main ERROR Unable to write to database [JdbcManager{name=databaseAppender, bufferSize=10, tableName=logging_event, columnConfigs=[{ name=log_event_date, layout=%d, literal=null, timestamp=false }, { name=logger_name, layout=%c, literal=null, timestamp=false }, { name=log_level, layout=%p, literal=null, timestamp=false }, { name=thread_name, layout=%t, literal=null, timestamp=false }, { name=message, layout=%message, literal=null, timestamp=false }], columnMappings=[]}] for appender [databaseAppender]. org.apache.logging.log4j.core.appender.db.DbAppenderLoggingException: Failed to commit transaction logging event or flushing buffer [columnConfigs=[{ name=log_event_date, layout=%d, literal=null, timestamp=false }, { name=logger_name, layout=%c, literal=null, timestamp=false }, { name=log_level, layout=%p, literal=null, timestamp=false }, { name=thread_name, layout=%t, literal=null, timestamp=false }, { name=message, layout=%message, literal=null, timestamp=fa
lse }], sqlStatement=insert into logging_event (log_event_date,logger_name,log_level,thread_name,message) values (?,?,?,?,?), factoryData=FactoryData [connectionSource=jdbc:mysql://192.168.15.233:3306/logging_test, tableName=logging_event, columnConfigs=[{ name=log_event_date, layout=%d, literal=null, timestamp=false }, { name=logger_name, layout=%c, literal=null, timestamp=false }, { name=log_level, layout=%p, literal=null, timestamp=false }, { name=thread_name, layout=%t, literal=null, timestamp=false }, { name=message, layout=%message, literal=null, timestamp=false }], columnMappings=[], immediateFail=false, retry=true, reconnectIntervalMillis=5000, truncateStrings=true], connection=com.mysql.cj.jdbc.ConnectionImpl@5176d279, statement=com.mysql.cj.jdbc.ClientPreparedStatement: insert into logging_event (log_event_date,logger_name,log_level,thread_name,message) values (** NOT SPECIFIED **,** NOT SPECIFIED **,** NOT SPECIFIED **,** NOT SPECIFIED **,** NOT SPECIFIED **), reconnector
=null, isBatchSupported=true, columnMetaData={MESSAGE=ColumnMetaData [schemaName=, catalogName=logging_test, tableName=logging_event, name=message, nameKey=MESSAGE, label=message, displaySize=536870911, type=-1, typeName=LONGTEXT, className=java.lang.String, precision=536870911, scale=0, isStringType=true], THREAD_NAME=ColumnMetaData [schemaName=, catalogName=logging_test, tableName=logging_event, name=thread_name, nameKey=THREAD_NAME, label=thread_name, displaySize=254, type=12, typeName=VARCHAR, className=java.lang.String, precision=254, scale=0, isStringType=true], LOG_EVENT_DATE=ColumnMetaData [schemaName=, catalogName=logging_test, tableName=logging_event, name=log_event_date, nameKey=LOG_EVENT_DATE, label=log_event_date, displaySize=254, type=12, typeName=VARCHAR, className=java.lang.String, precision=254, scale=0, isStringType=true], LOGGER_NAME=ColumnMetaData [schemaName=, catalogName=logging_test, tableName=logging_event, name=logger_name, nameKey=LOGGER_NAME, label=logger_
name, displaySize=254, type=12, typeName=VARCHAR, className=java.lang.String, precision=254, scale=0, isStringType=true], LOG_LEVEL=ColumnMetaData [schemaName=, catalogName=logging_test, tableName=logging_event, name=log_level, nameKey=LOG_LEVEL, label=log_level, displaySize=254, type=12, typeName=VARCHAR, className=java.lang.String, precision=254, scale=0, isStringType=true]}]
at org.apache.logging.log4j.core.appender.db.jdbc.JdbcDatabaseManager.commitAndClose(JdbcDatabaseManager.java:565)
at org.apache.logging.log4j.core.appender.db.AbstractDatabaseManager.flush(AbstractDatabaseManager.java:158)
at org.apache.logging.log4j.core.appender.db.AbstractDatabaseManager.buffer(AbstractDatabaseManager.java:125)
at org.apache.logging.log4j.core.appender.db.AbstractDatabaseManager.write(AbstractDatabaseManager.java:262)
at org.apache.logging.log4j.core.appender.db.AbstractDatabaseAppender.append(AbstractDatabaseAppender.java:110)
at org.apache.logging.log4j.core.config.AppenderControl.tryCallAppender(AppenderControl.java:156)
at org.apache.logging.log4j.core.config.AppenderControl.callAppender0(AppenderControl.java:129)
at org.apache.logging.log4j.core.config.AppenderControl.callAppenderPreventRecursion(AppenderControl.java:120)
at org.apache.logging.log4j.core.config.AppenderControl.callAppender(AppenderControl.java:84)
at org.apache.logging.log4j.core.config.LoggerConfig.callAppenders(LoggerConfig.java:543)
at org.apache.logging.log4j.core.config.LoggerConfig.processLogEvent(LoggerConfig.java:502)
at org.apache.logging.log4j.core.config.LoggerConfig.log(LoggerConfig.java:485)
at org.apache.logging.log4j.core.config.LoggerConfig.log(LoggerConfig.java:412)
at org.apache.logging.log4j.core.config.AwaitCompletionReliabilityStrategy.log(AwaitCompletionReliabilityStrategy.java:63)
at org.apache.logging.log4j.core.Logger.logMessage(Logger.java:153)
at org.apache.logging.slf4j.Log4jLogger.log(Log4jLogger.java:376)
at org.slf4j.bridge.SLF4JBridgeHandler.callLocationAwareLogger(SLF4JBridgeHandler.java:221)
at org.slf4j.bridge.SLF4JBridgeHandler.publish(SLF4JBridgeHandler.java:303)
at java.util.logging.Logger.log(Logger.java:738)
at java.util.logging.Logger.doLog(Logger.java:765)
at java.util.logging.Logger.logp(Logger.java:931)
at org.apache.juli.logging.DirectJDKLog.log(DirectJDKLog.java:173)
at org.apache.juli.logging.DirectJDKLog.info(DirectJDKLog.java:116)
at org.apache.coyote.AbstractProtocol.start(AbstractProtocol.java:610)
at org.apache.catalina.connector.Connector.startInternal(Connector.java:1071)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
at org.apache.catalina.core.StandardService.addConnector(StandardService.java:239)
at org.springframework.boot.web.embedded.tomcat.TomcatWebServer.addPreviouslyRemovedConnectors(TomcatWebServer.java:282)
at org.springframework.boot.web.embedded.tomcat.TomcatWebServer.start(TomcatWebServer.java:213)
at org.springframework.boot.web.servlet.context.WebServerStartStopLifecycle.start(WebServerStartStopLifecycle.java:43)
at org.springframework.context.support.DefaultLifecycleProcessor.doStart(DefaultLifecycleProcessor.java:178)
at org.springframework.context.support.DefaultLifecycleProcessor.access$200(DefaultLifecycleProcessor.java:54)
at org.springframework.context.support.DefaultLifecycleProcessor$LifecycleGroup.start(DefaultLifecycleProcessor.java:356)
at java.lang.Iterable.forEach(Iterable.java:75)
at org.springframework.context.support.DefaultLifecycleProcessor.startBeans(DefaultLifecycleProcessor.java:155)
at org.springframework.context.support.DefaultLifecycleProcessor.onRefresh(DefaultLifecycleProcessor.java:123)
at org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:935)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:586)
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:144)
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:782)
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:774)
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:439)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:339)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1340)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1329)
at org.example.MainApplication.main(MainApplication.java:9)
Caused by: java.sql.BatchUpdateException: java.io.IOException: Stream closed
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at com.mysql.cj.util.Util.handleNewInstance(Util.java:192)
at com.mysql.cj.util.Util.getInstance(Util.java:167)
at com.mysql.cj.util.Util.getInstance(Util.java:174)
at com.mysql.cj.jdbc.exceptions.SQLError.createBatchUpdateException(SQLError.java:224)
at com.mysql.cj.jdbc.ClientPreparedStatement.executeBatchSerially(ClientPreparedStatement.java:816)
at com.mysql.cj.jdbc.ClientPreparedStatement.executeBatchInternal(ClientPreparedStatement.java:418)
at com.mysql.cj.jdbc.StatementImpl.executeBatch(StatementImpl.java:795)
at org.apache.logging.log4j.core.appender.db.jdbc.JdbcDatabaseManager.commitAndClose(JdbcDatabaseManager.java:553)
... 45 more
Caused by: java.sql.SQLException: java.io.IOException: Stream closed
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:129)
at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122)
at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdateInternal(ClientPreparedStatement.java:1084)
at com.mysql.cj.jdbc.ClientPreparedStatement.executeBatchSerially(ClientPreparedStatement.java:795)
... 48 more
Caused by: java.io.IOException: Stream closed
at java.io.StringReader.ensureOpen(StringReader.java:56)
at java.io.StringReader.read(StringReader.java:90)
at java.io.Reader.read(Reader.java:140)
at com.mysql.cj.protocol.a.ReaderValueEncoder.readBytes(ReaderValueEncoder.java:79)
at com.mysql.cj.protocol.a.ReaderValueEncoder.getBytes(ReaderValueEncoder.java:49)
at com.mysql.cj.protocol.a.AbstractValueEncoder.encodeAsText(AbstractValueEncoder.java:92)
at com.mysql.cj.NativeQueryBindValue.writeAsText(NativeQueryBindValue.java:383)
at com.mysql.cj.protocol.a.NativeMessageBuilder.buildComQuery(NativeMessageBuilder.java:175)
at com.mysql.cj.protocol.a.NativeMessageBuilder.buildComQuery(NativeMessageBuilder.java:51)
at com.mysql.cj.ClientPreparedQuery.fillSendPacket(ClientPreparedQuery.java:222)
at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdateInternal(ClientPreparedStatement.java:1047)
... 49 more
2024-10-28 09:25:14,977 main ERROR An exception occurred processing Appender databaseAppender org.apache.logging.log4j.core.appender.db.DbAppenderLoggingException: Failed to commit transaction logging event or flushing buffer [columnConfigs=[{ name=log_event_date, layout=%d, literal=null, timestamp=false }, { name=logger_name, layout=%c, literal=null, timestamp=false }, { name=log_level, layout=%p, literal=null, timestamp=false }, { name=thread_name, layout=%t, literal=null, timestamp=false }, { name=message, layout=%message, literal=null, timestamp=false }], sqlStatement=insert into logging_event (log_event_date,logger_name,log_level,thread_name,message) values (?,?,?,?,?), factoryData=FactoryData [connectionSource=jdbc:mysql://192.168.15.233:3306/logging_test, tableName=logging_event, columnConfigs=[{ name=log_event_date, layout=%d, literal=null, timestamp=false }, { name=logger_name, layout=%c, literal=null, timestamp=false }, { name=log_level, layout=%p, literal=null, timestam
p=false }, { name=thread_name, layout=%t, literal=null, timestamp=false }, { name=message, layout=%message, literal=null, timestamp=false }], columnMappings=[], immediateFail=false, retry=true, reconnectIntervalMillis=5000, truncateStrings=true], connection=com.mysql.cj.jdbc.ConnectionImpl@5176d279, statement=com.mysql.cj.jdbc.ClientPreparedStatement: insert into logging_event (log_event_date,logger_name,log_level,thread_name,message) values (** NOT SPECIFIED **,** NOT SPECIFIED **,** NOT SPECIFIED **,** NOT SPECIFIED **,** NOT SPECIFIED **), reconnector=null, isBatchSupported=true, columnMetaData={MESSAGE=ColumnMetaData [schemaName=, catalogName=logging_test, tableName=logging_event, name=message, nameKey=MESSAGE, label=message, displaySize=536870911, type=-1, typeName=LONGTEXT, className=java.lang.String, precision=536870911, scale=0, isStringType=true], THREAD_NAME=ColumnMetaData [schemaName=, catalogName=logging_test, tableName=logging_event, name=thread_name, nameKey=THREAD_NAM
E, label=thread_name, displaySize=254, type=12, typeName=VARCHAR, className=java.lang.String, precision=254, scale=0, isStringType=true], LOG_EVENT_DATE=ColumnMetaData [schemaName=, catalogName=logging_test, tableName=logging_event, name=log_event_date, nameKey=LOG_EVENT_DATE, label=log_event_date, displaySize=254, type=12, typeName=VARCHAR, className=java.lang.String, precision=254, scale=0, isStringType=true], LOGGER_NAME=ColumnMetaData [schemaName=, catalogName=logging_test, tableName=logging_event, name=logger_name, nameKey=LOGGER_NAME, label=logger_name, displaySize=254, type=12, typeName=VARCHAR, className=java.lang.String, precision=254, scale=0, isStringType=true], LOG_LEVEL=ColumnMetaData [schemaName=, catalogName=logging_test, tableName=logging_event, name=log_level, nameKey=LOG_LEVEL, label=log_level, displaySize=254, type=12, typeName=VARCHAR, className=java.lang.String, precision=254, scale=0, isStringType=true]}]
at org.apache.logging.log4j.core.appender.db.jdbc.JdbcDatabaseManager.commitAndClose(JdbcDatabaseManager.java:565)
at org.apache.logging.log4j.core.appender.db.AbstractDatabaseManager.flush(AbstractDatabaseManager.java:158)
at org.apache.logging.log4j.core.appender.db.AbstractDatabaseManager.buffer(AbstractDatabaseManager.java:125)
at org.apache.logging.log4j.core.appender.db.AbstractDatabaseManager.write(AbstractDatabaseManager.java:262)
at org.apache.logging.log4j.core.appender.db.AbstractDatabaseAppender.append(AbstractDatabaseAppender.java:110)
at org.apache.logging.log4j.core.config.AppenderControl.tryCallAppender(AppenderControl.java:156)
at org.apache.logging.log4j.core.config.AppenderControl.callAppender0(AppenderControl.java:129)
at org.apache.logging.log4j.core.config.AppenderControl.callAppenderPreventRecursion(AppenderControl.java:120)
at org.apache.logging.log4j.core.config.AppenderControl.callAppender(AppenderControl.java:84)
at org.apache.logging.log4j.core.config.LoggerConfig.callAppenders(LoggerConfig.java:543)
at org.apache.logging.log4j.core.config.LoggerConfig.processLogEvent(LoggerConfig.java:502)
at org.apache.logging.log4j.core.config.LoggerConfig.log(LoggerConfig.java:485)
at org.apache.logging.log4j.core.config.LoggerConfig.log(LoggerConfig.java:412)
at org.apache.logging.log4j.core.config.AwaitCompletionReliabilityStrategy.log(AwaitCompletionReliabilityStrategy.java:63)
at org.apache.logging.log4j.core.Logger.logMessage(Logger.java:153)
at org.apache.logging.slf4j.Log4jLogger.log(Log4jLogger.java:376)
at org.slf4j.bridge.SLF4JBridgeHandler.callLocationAwareLogger(SLF4JBridgeHandler.java:221)
at org.slf4j.bridge.SLF4JBridgeHandler.publish(SLF4JBridgeHandler.java:303)
at java.util.logging.Logger.log(Logger.java:738)
at java.util.logging.Logger.doLog(Logger.java:765)
at java.util.logging.Logger.logp(Logger.java:931)
at org.apache.juli.logging.DirectJDKLog.log(DirectJDKLog.java:173)
at org.apache.juli.logging.DirectJDKLog.info(DirectJDKLog.java:116)
at org.apache.coyote.AbstractProtocol.start(AbstractProtocol.java:610)
at org.apache.catalina.connector.Connector.startInternal(Connector.java:1071)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
at org.apache.catalina.core.StandardService.addConnector(StandardService.java:239)
at org.springframework.boot.web.embedded.tomcat.TomcatWebServer.addPreviouslyRemovedConnectors(TomcatWebServer.java:282)
at org.springframework.boot.web.embedded.tomcat.TomcatWebServer.start(TomcatWebServer.java:213)
at org.springframework.boot.web.servlet.context.WebServerStartStopLifecycle.start(WebServerStartStopLifecycle.java:43)
at org.springframework.context.support.DefaultLifecycleProcessor.doStart(DefaultLifecycleProcessor.java:178)
at org.springframework.context.support.DefaultLifecycleProcessor.access$200(DefaultLifecycleProcessor.java:54)
at org.springframework.context.support.DefaultLifecycleProcessor$LifecycleGroup.start(DefaultLifecycleProcessor.java:356)
at java.lang.Iterable.forEach(Iterable.java:75)
at org.springframework.context.support.DefaultLifecycleProcessor.startBeans(DefaultLifecycleProcessor.java:155)
at org.springframework.context.support.DefaultLifecycleProcessor.onRefresh(DefaultLifecycleProcessor.java:123)
at org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:935)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:586)
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:144)
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:782)
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:774)
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:439)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:339)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1340)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1329)
at org.example.MainApplication.main(MainApplication.java:9)
Caused by: java.sql.BatchUpdateException: java.io.IOException: Stream closed
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at com.mysql.cj.util.Util.handleNewInstance(Util.java:192)
at com.mysql.cj.util.Util.getInstance(Util.java:167)
at com.mysql.cj.util.Util.getInstance(Util.java:174)
at com.mysql.cj.jdbc.exceptions.SQLError.createBatchUpdateException(SQLError.java:224)
at com.mysql.cj.jdbc.ClientPreparedStatement.executeBatchSerially(ClientPreparedStatement.java:816)
at com.mysql.cj.jdbc.ClientPreparedStatement.executeBatchInternal(ClientPreparedStatement.java:418)
at com.mysql.cj.jdbc.StatementImpl.executeBatch(StatementImpl.java:795)
at org.apache.logging.log4j.core.appender.db.jdbc.JdbcDatabaseManager.commitAndClose(JdbcDatabaseManager.java:553)
... 45 more
Caused by: java.sql.SQLException: java.io.IOException: Stream closed
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:129)
at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122)
at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdateInternal(ClientPreparedStatement.java:1084)
at com.mysql.cj.jdbc.ClientPreparedStatement.executeBatchSerially(ClientPreparedStatement.java:795)
... 48 more
Caused by: java.io.IOException: Stream closed
at java.io.StringReader.ensureOpen(StringReader.java:56)
at java.io.StringReader.read(StringReader.java:90)
at java.io.Reader.read(Reader.java:140)
at com.mysql.cj.protocol.a.ReaderValueEncoder.readBytes(ReaderValueEncoder.java:79)
at com.mysql.cj.protocol.a.ReaderValueEncoder.getBytes(ReaderValueEncoder.java:49)
at com.mysql.cj.protocol.a.AbstractValueEncoder.encodeAsText(AbstractValueEncoder.java:92)
at com.mysql.cj.NativeQueryBindValue.writeAsText(NativeQueryBindValue.java:383)
at com.mysql.cj.protocol.a.NativeMessageBuilder.buildComQuery(NativeMessageBuilder.java:175)
at com.mysql.cj.protocol.a.NativeMessageBuilder.buildComQuery(NativeMessageBuilder.java:51)
at com.mysql.cj.ClientPreparedQuery.fillSendPacket(ClientPreparedQuery.java:222)
at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdateInternal(ClientPreparedStatement.java:1047)
... 49 more
2024-10-28 09:25:15,007 main ERROR Unable to write to database [JdbcManager{name=databaseAppender, bufferSize=10, tableName=logging_event, columnConfigs=[{ name=log_event_date, layout=%d, literal=null, timestamp=false }, { name=logger_name, layout=%c, literal=null, timestamp=false }, { name=log_level, layout=%p, literal=null, timestamp=false }, { name=thread_name, layout=%t, literal=null, timestamp=false }, { name=message, layout=%message, literal=null, timestamp=false }], columnMappings=[]}] for appender [databaseAppender]. org.apache.logging.log4j.core.appender.db.DbAppenderLoggingException: Failed to commit transaction logging event or flushing buffer [columnConfigs=[{ name=log_event_date, layout=%d, literal=null, timestamp=false }, { name=logger_name, layout=%c, literal=null, timestamp=false }, { name=log_level, layout=%p, literal=null, timestamp=false }, { name=thread_name, layout=%t, literal=null, timestamp=false }, { name=message, layout=%message, literal=null, timestamp=fa
lse }], sqlStatement=insert into logging_event (log_event_date,logger_name,log_level,thread_name,message) values (?,?,?,?,?), factoryData=FactoryData [connectionSource=jdbc:mysql://192.168.15.233:3306/logging_test, tableName=logging_event, columnConfigs=[{ name=log_event_date, layout=%d, literal=null, timestamp=false }, { name=logger_name, layout=%c, literal=null, timestamp=false }, { name=log_level, layout=%p, literal=null, timestamp=false }, { name=thread_name, layout=%t, literal=null, timestamp=false }, { name=message, layout=%message, literal=null, timestamp=false }], columnMappings=[], immediateFail=false, retry=true, reconnectIntervalMillis=5000, truncateStrings=true], connection=com.mysql.cj.jdbc.ConnectionImpl@61d34b4, statement=com.mysql.cj.jdbc.ClientPreparedStatement: insert into logging_event (log_event_date,logger_name,log_level,thread_name,message) values (** NOT SPECIFIED **,** NOT SPECIFIED **,** NOT SPECIFIED **,** NOT SPECIFIED **,** NOT SPECIFIED **), reconnector=
null, isBatchSupported=true, columnMetaData={MESSAGE=ColumnMetaData [schemaName=, catalogName=logging_test, tableName=logging_event, name=message, nameKey=MESSAGE, label=message, displaySize=536870911, type=-1, typeName=LONGTEXT, className=java.lang.String, precision=536870911, scale=0, isStringType=true], THREAD_NAME=ColumnMetaData [schemaName=, catalogName=logging_test, tableName=logging_event, name=thread_name, nameKey=THREAD_NAME, label=thread_name, displaySize=254, type=12, typeName=VARCHAR, className=java.lang.String, precision=254, scale=0, isStringType=true], LOG_EVENT_DATE=ColumnMetaData [schemaName=, catalogName=logging_test, tableName=logging_event, name=log_event_date, nameKey=LOG_EVENT_DATE, label=log_event_date, displaySize=254, type=12, typeName=VARCHAR, className=java.lang.String, precision=254, scale=0, isStringType=true], LOGGER_NAME=ColumnMetaData [schemaName=, catalogName=logging_test, tableName=logging_event, name=logger_name, nameKey=LOGGER_NAME, label=logger_n
ame, displaySize=254, type=12, typeName=VARCHAR, className=java.lang.String, precision=254, scale=0, isStringType=true], LOG_LEVEL=ColumnMetaData [schemaName=, catalogName=logging_test, tableName=logging_event, name=log_level, nameKey=LOG_LEVEL, label=log_level, displaySize=254, type=12, typeName=VARCHAR, className=java.lang.String, precision=254, scale=0, isStringType=true]}]
at org.apache.logging.log4j.core.appender.db.jdbc.JdbcDatabaseManager.commitAndClose(JdbcDatabaseManager.java:565)
at org.apache.logging.log4j.core.appender.db.AbstractDatabaseManager.flush(AbstractDatabaseManager.java:158)
at org.apache.logging.log4j.core.appender.db.AbstractDatabaseManager.buffer(AbstractDatabaseManager.java:125)
at org.apache.logging.log4j.core.appender.db.AbstractDatabaseManager.write(AbstractDatabaseManager.java:262)
at org.apache.logging.log4j.core.appender.db.AbstractDatabaseAppender.append(AbstractDatabaseAppender.java:110)
at org.apache.logging.log4j.core.config.AppenderControl.tryCallAppender(AppenderControl.java:156)
at org.apache.logging.log4j.core.config.AppenderControl.callAppender0(AppenderControl.java:129)
at org.apache.logging.log4j.core.config.AppenderControl.callAppenderPreventRecursion(AppenderControl.java:120)
at org.apache.logging.log4j.core.config.AppenderControl.callAppender(AppenderControl.java:84)
at org.apache.logging.log4j.core.config.LoggerConfig.callAppenders(LoggerConfig.java:543)
at org.apache.logging.log4j.core.config.LoggerConfig.processLogEvent(LoggerConfig.java:502)
at org.apache.logging.log4j.core.config.LoggerConfig.log(LoggerConfig.java:485)
at org.apache.logging.log4j.core.config.LoggerConfig.log(LoggerConfig.java:460)
at org.apache.logging.log4j.core.config.AwaitCompletionReliabilityStrategy.log(AwaitCompletionReliabilityStrategy.java:82)
at org.apache.logging.log4j.core.Logger.log(Logger.java:161)
at org.apache.logging.log4j.spi.AbstractLogger.tryLogMessage(AbstractLogger.java:2198)
at org.apache.logging.log4j.spi.AbstractLogger.logMessageTrackRecursion(AbstractLogger.java:2152)
at org.apache.logging.log4j.spi.AbstractLogger.logMessageSafely(AbstractLogger.java:2135)
at org.apache.logging.log4j.spi.AbstractLogger.logMessage(AbstractLogger.java:2016)
at org.apache.logging.log4j.spi.AbstractLogger.logIfEnabled(AbstractLogger.java:1875)
at org.apache.commons.logging.LogAdapter$Log4jLog.log(LogAdapter.java:266)
at org.apache.commons.logging.LogAdapter$Log4jLog.info(LogAdapter.java:230)
at org.springframework.boot.web.embedded.tomcat.TomcatWebServer.start(TomcatWebServer.java:220)
at org.springframework.boot.web.servlet.context.WebServerStartStopLifecycle.start(WebServerStartStopLifecycle.java:43)
at org.springframework.context.support.DefaultLifecycleProcessor.doStart(DefaultLifecycleProcessor.java:178)
at org.springframework.context.support.DefaultLifecycleProcessor.access$200(DefaultLifecycleProcessor.java:54)
at org.springframework.context.support.DefaultLifecycleProcessor$LifecycleGroup.start(DefaultLifecycleProcessor.java:356)
at java.lang.Iterable.forEach(Iterable.java:75)
at org.springframework.context.support.DefaultLifecycleProcessor.startBeans(DefaultLifecycleProcessor.java:155)
at org.springframework.context.support.DefaultLifecycleProcessor.onRefresh(DefaultLifecycleProcessor.java:123)
at org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:935)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:586)
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:144)
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:782)
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:774)
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:439)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:339)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1340)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1329)
at org.example.MainApplication.main(MainApplication.java:9)
Caused by: java.sql.BatchUpdateException: java.io.IOException: Stream closed
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at com.mysql.cj.util.Util.handleNewInstance(Util.java:192)
at com.mysql.cj.util.Util.getInstance(Util.java:167)
at com.mysql.cj.util.Util.getInstance(Util.java:174)
at com.mysql.cj.jdbc.exceptions.SQLError.createBatchUpdateException(SQLError.java:224)
at com.mysql.cj.jdbc.ClientPreparedStatement.executeBatchSerially(ClientPreparedStatement.java:816)
at com.mysql.cj.jdbc.ClientPreparedStatement.executeBatchInternal(ClientPreparedStatement.java:418)
at com.mysql.cj.jdbc.StatementImpl.executeBatch(StatementImpl.java:795)
at org.apache.logging.log4j.core.appender.db.jdbc.JdbcDatabaseManager.commitAndClose(JdbcDatabaseManager.java:553)
... 39 more
Caused by: java.sql.SQLException: java.io.IOException: Stream closed
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:129)
at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122)
at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdateInternal(ClientPreparedStatement.java:1084)
at com.mysql.cj.jdbc.ClientPreparedStatement.executeBatchSerially(ClientPreparedStatement.java:795)
... 42 more
Caused by: java.io.IOException: Stream closed
at java.io.StringReader.ensureOpen(StringReader.java:56)
at java.io.StringReader.read(StringReader.java:90)
at java.io.Reader.read(Reader.java:140)
at com.mysql.cj.protocol.a.ReaderValueEncoder.readBytes(ReaderValueEncoder.java:79)
at com.mysql.cj.protocol.a.ReaderValueEncoder.getBytes(ReaderValueEncoder.java:49)
at com.mysql.cj.protocol.a.AbstractValueEncoder.encodeAsText(AbstractValueEncoder.java:92)
at com.mysql.cj.NativeQueryBindValue.writeAsText(NativeQueryBindValue.java:383)
at com.mysql.cj.protocol.a.NativeMessageBuilder.buildComQuery(NativeMessageBuilder.java:175)
at com.mysql.cj.protocol.a.NativeMessageBuilder.buildComQuery(NativeMessageBuilder.java:51)
at com.mysql.cj.ClientPreparedQuery.fillSendPacket(ClientPreparedQuery.java:222)
at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdateInternal(ClientPreparedStatement.java:1047)
... 43 more
2024-10-28 09:25:15,007 main ERROR An exception occurred processing Appender databaseAppender org.apache.logging.log4j.core.appender.db.DbAppenderLoggingException: Failed to commit transaction logging event or flushing buffer [columnConfigs=[{ name=log_event_date, layout=%d, literal=null, timestamp=false }, { name=logger_name, layout=%c, literal=null, timestamp=false }, { name=log_level, layout=%p, literal=null, timestamp=false }, { name=thread_name, layout=%t, literal=null, timestamp=false }, { name=message, layout=%message, literal=null, timestamp=false }], sqlStatement=insert into logging_event (log_event_date,logger_name,log_level,thread_name,message) values (?,?,?,?,?), factoryData=FactoryData [connectionSource=jdbc:mysql://192.168.15.233:3306/logging_test, tableName=logging_event, columnConfigs=[{ name=log_event_date, layout=%d, literal=null, timestamp=false }, { name=logger_name, layout=%c, literal=null, timestamp=false }, { name=log_level, layout=%p, literal=null, timestam
p=false }, { name=thread_name, layout=%t, literal=null, timestamp=false }, { name=message, layout=%message, literal=null, timestamp=false }], columnMappings=[], immediateFail=false, retry=true, reconnectIntervalMillis=5000, truncateStrings=true], connection=com.mysql.cj.jdbc.ConnectionImpl@61d34b4, statement=com.mysql.cj.jdbc.ClientPreparedStatement: insert into logging_event (log_event_date,logger_name,log_level,thread_name,message) values (** NOT SPECIFIED **,** NOT SPECIFIED **,** NOT SPECIFIED **,** NOT SPECIFIED **,** NOT SPECIFIED **), reconnector=null, isBatchSupported=true, columnMetaData={MESSAGE=ColumnMetaData [schemaName=, catalogName=logging_test, tableName=logging_event, name=message, nameKey=MESSAGE, label=message, displaySize=536870911, type=-1, typeName=LONGTEXT, className=java.lang.String, precision=536870911, scale=0, isStringType=true], THREAD_NAME=ColumnMetaData [schemaName=, catalogName=logging_test, tableName=logging_event, name=thread_name, nameKey=THREAD_NAME
, label=thread_name, displaySize=254, type=12, typeName=VARCHAR, className=java.lang.String, precision=254, scale=0, isStringType=true], LOG_EVENT_DATE=ColumnMetaData [schemaName=, catalogName=logging_test, tableName=logging_event, name=log_event_date, nameKey=LOG_EVENT_DATE, label=log_event_date, displaySize=254, type=12, typeName=VARCHAR, className=java.lang.String, precision=254, scale=0, isStringType=true], LOGGER_NAME=ColumnMetaData [schemaName=, catalogName=logging_test, tableName=logging_event, name=logger_name, nameKey=LOGGER_NAME, label=logger_name, displaySize=254, type=12, typeName=VARCHAR, className=java.lang.String, precision=254, scale=0, isStringType=true], LOG_LEVEL=ColumnMetaData [schemaName=, catalogName=logging_test, tableName=logging_event, name=log_level, nameKey=LOG_LEVEL, label=log_level, displaySize=254, type=12, typeName=VARCHAR, className=java.lang.String, precision=254, scale=0, isStringType=true]}]
at org.apache.logging.log4j.core.appender.db.jdbc.JdbcDatabaseManager.commitAndClose(JdbcDatabaseManager.java:565)
at org.apache.logging.log4j.core.appender.db.AbstractDatabaseManager.flush(AbstractDatabaseManager.java:158)
at org.apache.logging.log4j.core.appender.db.AbstractDatabaseManager.buffer(AbstractDatabaseManager.java:125)
at org.apache.logging.log4j.core.appender.db.AbstractDatabaseManager.write(AbstractDatabaseManager.java:262)
at org.apache.logging.log4j.core.appender.db.AbstractDatabaseAppender.append(AbstractDatabaseAppender.java:110)
at org.apache.logging.log4j.core.config.AppenderControl.tryCallAppender(AppenderControl.java:156)
at org.apache.logging.log4j.core.config.AppenderControl.callAppender0(AppenderControl.java:129)
at org.apache.logging.log4j.core.config.AppenderControl.callAppenderPreventRecursion(AppenderControl.java:120)
at org.apache.logging.log4j.core.config.AppenderControl.callAppender(AppenderControl.java:84)
at org.apache.logging.log4j.core.config.LoggerConfig.callAppenders(LoggerConfig.java:543)
at org.apache.logging.log4j.core.config.LoggerConfig.processLogEvent(LoggerConfig.java:502)
at org.apache.logging.log4j.core.config.LoggerConfig.log(LoggerConfig.java:485)
at org.apache.logging.log4j.core.config.LoggerConfig.log(LoggerConfig.java:460)
at org.apache.logging.log4j.core.config.AwaitCompletionReliabilityStrategy.log(AwaitCompletionReliabilityStrategy.java:82)
at org.apache.logging.log4j.core.Logger.log(Logger.java:161)
at org.apache.logging.log4j.spi.AbstractLogger.tryLogMessage(AbstractLogger.java:2198)
at org.apache.logging.log4j.spi.AbstractLogger.logMessageTrackRecursion(AbstractLogger.java:2152)
at org.apache.logging.log4j.spi.AbstractLogger.logMessageSafely(AbstractLogger.java:2135)
at org.apache.logging.log4j.spi.AbstractLogger.logMessage(AbstractLogger.java:2016)
at org.apache.logging.log4j.spi.AbstractLogger.logIfEnabled(AbstractLogger.java:1875)
at org.apache.commons.logging.LogAdapter$Log4jLog.log(LogAdapter.java:266)
at org.apache.commons.logging.LogAdapter$Log4jLog.info(LogAdapter.java:230)
at org.springframework.boot.web.embedded.tomcat.TomcatWebServer.start(TomcatWebServer.java:220)
at org.springframework.boot.web.servlet.context.WebServerStartStopLifecycle.start(WebServerStartStopLifecycle.java:43)
at org.springframework.context.support.DefaultLifecycleProcessor.doStart(DefaultLifecycleProcessor.java:178)
at org.springframework.context.support.DefaultLifecycleProcessor.access$200(DefaultLifecycleProcessor.java:54)
at org.springframework.context.support.DefaultLifecycleProcessor$LifecycleGroup.start(DefaultLifecycleProcessor.java:356)
at java.lang.Iterable.forEach(Iterable.java:75)
at org.springframework.context.support.DefaultLifecycleProcessor.startBeans(DefaultLifecycleProcessor.java:155)
at org.springframework.context.support.DefaultLifecycleProcessor.onRefresh(DefaultLifecycleProcessor.java:123)
at org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:935)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:586)
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:144)
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:782)
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:774)
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:439)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:339)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1340)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1329)
at org.example.MainApplication.main(MainApplication.java:9)
Caused by: java.sql.BatchUpdateException: java.io.IOException: Stream closed
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at com.mysql.cj.util.Util.handleNewInstance(Util.java:192)
at com.mysql.cj.util.Util.getInstance(Util.java:167)
at com.mysql.cj.util.Util.getInstance(Util.java:174)
at com.mysql.cj.jdbc.exceptions.SQLError.createBatchUpdateException(SQLError.java:224)
at com.mysql.cj.jdbc.ClientPreparedStatement.executeBatchSerially(ClientPreparedStatement.java:816)
at com.mysql.cj.jdbc.ClientPreparedStatement.executeBatchInternal(ClientPreparedStatement.java:418)
at com.mysql.cj.jdbc.StatementImpl.executeBatch(StatementImpl.java:795)
at org.apache.logging.log4j.core.appender.db.jdbc.JdbcDatabaseManager.commitAndClose(JdbcDatabaseManager.java:553)
... 39 more
Caused by: java.sql.SQLException: java.io.IOException: Stream closed
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:129)
at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122)
at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdateInternal(ClientPreparedStatement.java:1084)
at com.mysql.cj.jdbc.ClientPreparedStatement.executeBatchSerially(ClientPreparedStatement.java:795)
... 42 more
Caused by: java.io.IOException: Stream closed
at java.io.StringReader.ensureOpen(StringReader.java:56)
at java.io.StringReader.read(StringReader.java:90)
at java.io.Reader.read(Reader.java:140)
at com.mysql.cj.protocol.a.ReaderValueEncoder.readBytes(ReaderValueEncoder.java:79)
at com.mysql.cj.protocol.a.ReaderValueEncoder.getBytes(ReaderValueEncoder.java:49)
at com.mysql.cj.protocol.a.AbstractValueEncoder.encodeAsText(AbstractValueEncoder.java:92)
at com.mysql.cj.NativeQueryBindValue.writeAsText(NativeQueryBindValue.java:383)
at com.mysql.cj.protocol.a.NativeMessageBuilder.buildComQuery(NativeMessageBuilder.java:175)
at com.mysql.cj.protocol.a.NativeMessageBuilder.buildComQuery(NativeMessageBuilder.java:51)
at com.mysql.cj.ClientPreparedQuery.fillSendPacket(ClientPreparedQuery.java:222)
at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdateInternal(ClientPreparedStatement.java:1047)
... 43 more
2024-10-28 09:25:15,031 main ERROR Unable to write to database [JdbcManager{name=databaseAppender, bufferSize=10, tableName=logging_event, columnConfigs=[{ name=log_event_date, layout=%d, literal=null, timestamp=false }, { name=logger_name, layout=%c, literal=null, timestamp=false }, { name=log_level, layout=%p, literal=null, timestamp=false }, { name=thread_name, layout=%t, literal=null, timestamp=false }, { name=message, layout=%message, literal=null, timestamp=false }], columnMappings=[]}] for appender [databaseAppender]. org.apache.logging.log4j.core.appender.db.DbAppenderLoggingException: Failed to commit transaction logging event or flushing buffer [columnConfigs=[{ name=log_event_date, layout=%d, literal=null, timestamp=false }, { name=logger_name, layout=%c, literal=null, timestamp=false }, { name=log_level, layout=%p, literal=null, timestamp=false }, { name=thread_name, layout=%t, literal=null, timestamp=false }, { name=message, layout=%message, literal=null, timestamp=fa
lse }], sqlStatement=insert into logging_event (log_event_date,logger_name,log_level,thread_name,message) values (?,?,?,?,?), factoryData=FactoryData [connectionSource=jdbc:mysql://192.168.15.233:3306/logging_test, tableName=logging_event, columnConfigs=[{ name=log_event_date, layout=%d, literal=null, timestamp=false }, { name=logger_name, layout=%c, literal=null, timestamp=false }, { name=log_level, layout=%p, literal=null, timestamp=false }, { name=thread_name, layout=%t, literal=null, timestamp=false }, { name=message, layout=%message, literal=null, timestamp=false }], columnMappings=[], immediateFail=false, retry=true, reconnectIntervalMillis=5000, truncateStrings=true], connection=com.mysql.cj.jdbc.ConnectionImpl@5fb65013, statement=com.mysql.cj.jdbc.ClientPreparedStatement: insert into logging_event (log_event_date,logger_name,log_level,thread_name,message) values (** NOT SPECIFIED **,** NOT SPECIFIED **,** NOT SPECIFIED **,** NOT SPECIFIED **,** NOT SPECIFIED **), reconnector
=null, isBatchSupported=true, columnMetaData={MESSAGE=ColumnMetaData [schemaName=, catalogName=logging_test, tableName=logging_event, name=message, nameKey=MESSAGE, label=message, displaySize=536870911, type=-1, typeName=LONGTEXT, className=java.lang.String, precision=536870911, scale=0, isStringType=true], THREAD_NAME=ColumnMetaData [schemaName=, catalogName=logging_test, tableName=logging_event, name=thread_name, nameKey=THREAD_NAME, label=thread_name, displaySize=254, type=12, typeName=VARCHAR, className=java.lang.String, precision=254, scale=0, isStringType=true], LOG_EVENT_DATE=ColumnMetaData [schemaName=, catalogName=logging_test, tableName=logging_event, name=log_event_date, nameKey=LOG_EVENT_DATE, label=log_event_date, displaySize=254, type=12, typeName=VARCHAR, className=java.lang.String, precision=254, scale=0, isStringType=true], LOGGER_NAME=ColumnMetaData [schemaName=, catalogName=logging_test, tableName=logging_event, name=logger_name, nameKey=LOGGER_NAME, label=logger_
name, displaySize=254, type=12, typeName=VARCHAR, className=java.lang.String, precision=254, scale=0, isStringType=true], LOG_LEVEL=ColumnMetaData [schemaName=, catalogName=logging_test, tableName=logging_event, name=log_level, nameKey=LOG_LEVEL, label=log_level, displaySize=254, type=12, typeName=VARCHAR, className=java.lang.String, precision=254, scale=0, isStringType=true]}]
at org.apache.logging.log4j.core.appender.db.jdbc.JdbcDatabaseManager.commitAndClose(JdbcDatabaseManager.java:565)
at org.apache.logging.log4j.core.appender.db.AbstractDatabaseManager.flush(AbstractDatabaseManager.java:158)
at org.apache.logging.log4j.core.appender.db.AbstractDatabaseManager.buffer(AbstractDatabaseManager.java:125)
at org.apache.logging.log4j.core.appender.db.AbstractDatabaseManager.write(AbstractDatabaseManager.java:262)
at org.apache.logging.log4j.core.appender.db.AbstractDatabaseAppender.append(AbstractDatabaseAppender.java:110)
at org.apache.logging.log4j.core.config.AppenderControl.tryCallAppender(AppenderControl.java:156)
at org.apache.logging.log4j.core.config.AppenderControl.callAppender0(AppenderControl.java:129)
at org.apache.logging.log4j.core.config.AppenderControl.callAppenderPreventRecursion(AppenderControl.java:120)
at org.apache.logging.log4j.core.config.AppenderControl.callAppender(AppenderControl.java:84)
at org.apache.logging.log4j.core.config.LoggerConfig.callAppenders(LoggerConfig.java:543)
at org.apache.logging.log4j.core.config.LoggerConfig.processLogEvent(LoggerConfig.java:502)
at org.apache.logging.log4j.core.config.LoggerConfig.log(LoggerConfig.java:485)
at org.apache.logging.log4j.core.config.LoggerConfig.log(LoggerConfig.java:460)
at org.apache.logging.log4j.core.config.AwaitCompletionReliabilityStrategy.log(AwaitCompletionReliabilityStrategy.java:82)
at org.apache.logging.log4j.core.Logger.log(Logger.java:161)
at org.apache.logging.log4j.spi.AbstractLogger.tryLogMessage(AbstractLogger.java:2198)
at org.apache.logging.log4j.spi.AbstractLogger.logMessageTrackRecursion(AbstractLogger.java:2152)
at org.apache.logging.log4j.spi.AbstractLogger.logMessageSafely(AbstractLogger.java:2135)
at org.apache.logging.log4j.spi.AbstractLogger.logMessage(AbstractLogger.java:1994)
at org.apache.logging.log4j.spi.AbstractLogger.logIfEnabled(AbstractLogger.java:1852)
at org.apache.commons.logging.LogAdapter$Log4jLog.log(LogAdapter.java:270)
at org.apache.commons.logging.LogAdapter$Log4jLog.info(LogAdapter.java:230)
at org.springframework.boot.StartupInfoLogger.logStarted(StartupInfoLogger.java:61)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:343)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1340)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1329)
at org.example.MainApplication.main(MainApplication.java:9)
Caused by: java.sql.BatchUpdateException: java.io.IOException: Stream closed
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at com.mysql.cj.util.Util.handleNewInstance(Util.java:192)
at com.mysql.cj.util.Util.getInstance(Util.java:167)
at com.mysql.cj.util.Util.getInstance(Util.java:174)
at com.mysql.cj.jdbc.exceptions.SQLError.createBatchUpdateException(SQLError.java:224)
at com.mysql.cj.jdbc.ClientPreparedStatement.executeBatchSerially(ClientPreparedStatement.java:816)
at com.mysql.cj.jdbc.ClientPreparedStatement.executeBatchInternal(ClientPreparedStatement.java:418)
at com.mysql.cj.jdbc.StatementImpl.executeBatch(StatementImpl.java:795)
at org.apache.logging.log4j.core.appender.db.jdbc.JdbcDatabaseManager.commitAndClose(JdbcDatabaseManager.java:553)
... 26 more
Caused by: java.sql.SQLException: java.io.IOException: Stream closed
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:129)
at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122)
at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdateInternal(ClientPreparedStatement.java:1084)
at com.mysql.cj.jdbc.ClientPreparedStatement.executeBatchSerially(ClientPreparedStatement.java:795)
... 29 more
Caused by: java.io.IOException: Stream closed
at java.io.StringReader.ensureOpen(StringReader.java:56)
at java.io.StringReader.read(StringReader.java:90)
at java.io.Reader.read(Reader.java:140)
at com.mysql.cj.protocol.a.ReaderValueEncoder.readBytes(ReaderValueEncoder.java:79)
at com.mysql.cj.protocol.a.ReaderValueEncoder.getBytes(ReaderValueEncoder.java:49)
at com.mysql.cj.protocol.a.AbstractValueEncoder.encodeAsText(AbstractValueEncoder.java:92)
at com.mysql.cj.NativeQueryBindValue.writeAsText(NativeQueryBindValue.java:383)
at com.mysql.cj.protocol.a.NativeMessageBuilder.buildComQuery(NativeMessageBuilder.java:175)
at com.mysql.cj.protocol.a.NativeMessageBuilder.buildComQuery(NativeMessageBuilder.java:51)
at com.mysql.cj.ClientPreparedQuery.fillSendPacket(ClientPreparedQuery.java:222)
at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdateInternal(ClientPreparedStatement.java:1047)
... 30 more
2024-10-28 09:25:15,031 main ERROR An exception occurred processing Appender databaseAppender org.apache.logging.log4j.core.appender.db.DbAppenderLoggingException: Failed to commit transaction logging event or flushing buffer [columnConfigs=[{ name=log_event_date, layout=%d, literal=null, timestamp=false }, { name=logger_name, layout=%c, literal=null, timestamp=false }, { name=log_level, layout=%p, literal=null, timestamp=false }, { name=thread_name, layout=%t, literal=null, timestamp=false }, { name=message, layout=%message, literal=null, timestamp=false }], sqlStatement=insert into logging_event (log_event_date,logger_name,log_level,thread_name,message) values (?,?,?,?,?), factoryData=FactoryData [connectionSource=jdbc:mysql://192.168.15.233:3306/logging_test, tableName=logging_event, columnConfigs=[{ name=log_event_date, layout=%d, literal=null, timestamp=false }, { name=logger_name, layout=%c, literal=null, timestamp=false }, { name=log_level, layout=%p, literal=null, timestam
p=false }, { name=thread_name, layout=%t, literal=null, timestamp=false }, { name=message, layout=%message, literal=null, timestamp=false }], columnMappings=[], immediateFail=false, retry=true, reconnectIntervalMillis=5000, truncateStrings=true], connection=com.mysql.cj.jdbc.ConnectionImpl@5fb65013, statement=com.mysql.cj.jdbc.ClientPreparedStatement: insert into logging_event (log_event_date,logger_name,log_level,thread_name,message) values (** NOT SPECIFIED **,** NOT SPECIFIED **,** NOT SPECIFIED **,** NOT SPECIFIED **,** NOT SPECIFIED **), reconnector=null, isBatchSupported=true, columnMetaData={MESSAGE=ColumnMetaData [schemaName=, catalogName=logging_test, tableName=logging_event, name=message, nameKey=MESSAGE, label=message, displaySize=536870911, type=-1, typeName=LONGTEXT, className=java.lang.String, precision=536870911, scale=0, isStringType=true], THREAD_NAME=ColumnMetaData [schemaName=, catalogName=logging_test, tableName=logging_event, name=thread_name, nameKey=THREAD_NAM
E, label=thread_name, displaySize=254, type=12, typeName=VARCHAR, className=java.lang.String, precision=254, scale=0, isStringType=true], LOG_EVENT_DATE=ColumnMetaData [schemaName=, catalogName=logging_test, tableName=logging_event, name=log_event_date, nameKey=LOG_EVENT_DATE, label=log_event_date, displaySize=254, type=12, typeName=VARCHAR, className=java.lang.String, precision=254, scale=0, isStringType=true], LOGGER_NAME=ColumnMetaData [schemaName=, catalogName=logging_test, tableName=logging_event, name=logger_name, nameKey=LOGGER_NAME, label=logger_name, displaySize=254, type=12, typeName=VARCHAR, className=java.lang.String, precision=254, scale=0, isStringType=true], LOG_LEVEL=ColumnMetaData [schemaName=, catalogName=logging_test, tableName=logging_event, name=log_level, nameKey=LOG_LEVEL, label=log_level, displaySize=254, type=12, typeName=VARCHAR, className=java.lang.String, precision=254, scale=0, isStringType=true]}]
at org.apache.logging.log4j.core.appender.db.jdbc.JdbcDatabaseManager.commitAndClose(JdbcDatabaseManager.java:565)
at org.apache.logging.log4j.core.appender.db.AbstractDatabaseManager.flush(AbstractDatabaseManager.java:158)
at org.apache.logging.log4j.core.appender.db.AbstractDatabaseManager.buffer(AbstractDatabaseManager.java:125)
at org.apache.logging.log4j.core.appender.db.AbstractDatabaseManager.write(AbstractDatabaseManager.java:262)
at org.apache.logging.log4j.core.appender.db.AbstractDatabaseAppender.append(AbstractDatabaseAppender.java:110)
at org.apache.logging.log4j.core.config.AppenderControl.tryCallAppender(AppenderControl.java:156)
at org.apache.logging.log4j.core.config.AppenderControl.callAppender0(AppenderControl.java:129)
at org.apache.logging.log4j.core.config.AppenderControl.callAppenderPreventRecursion(AppenderControl.java:120)
at org.apache.logging.log4j.core.config.AppenderControl.callAppender(AppenderControl.java:84)
at org.apache.logging.log4j.core.config.LoggerConfig.callAppenders(LoggerConfig.java:543)
at org.apache.logging.log4j.core.config.LoggerConfig.processLogEvent(LoggerConfig.java:502)
at org.apache.logging.log4j.core.config.LoggerConfig.log(LoggerConfig.java:485)
at org.apache.logging.log4j.core.config.LoggerConfig.log(LoggerConfig.java:460)
at org.apache.logging.log4j.core.config.AwaitCompletionReliabilityStrategy.log(AwaitCompletionReliabilityStrategy.java:82)
at org.apache.logging.log4j.core.Logger.log(Logger.java:161)
at org.apache.logging.log4j.spi.AbstractLogger.tryLogMessage(AbstractLogger.java:2198)
at org.apache.logging.log4j.spi.AbstractLogger.logMessageTrackRecursion(AbstractLogger.java:2152)
at org.apache.logging.log4j.spi.AbstractLogger.logMessageSafely(AbstractLogger.java:2135)
at org.apache.logging.log4j.spi.AbstractLogger.logMessage(AbstractLogger.java:1994)
at org.apache.logging.log4j.spi.AbstractLogger.logIfEnabled(AbstractLogger.java:1852)
at org.apache.commons.logging.LogAdapter$Log4jLog.log(LogAdapter.java:270)
at org.apache.commons.logging.LogAdapter$Log4jLog.info(LogAdapter.java:230)
at org.springframework.boot.StartupInfoLogger.logStarted(StartupInfoLogger.java:61)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:343)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1340)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1329)
at org.example.MainApplication.main(MainApplication.java:9)
Caused by: java.sql.BatchUpdateException: java.io.IOException: Stream closed
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at com.mysql.cj.util.Util.handleNewInstance(Util.java:192)
at com.mysql.cj.util.Util.getInstance(Util.java:167)
at com.mysql.cj.util.Util.getInstance(Util.java:174)
at com.mysql.cj.jdbc.exceptions.SQLError.createBatchUpdateException(SQLError.java:224)
at com.mysql.cj.jdbc.ClientPreparedStatement.executeBatchSerially(ClientPreparedStatement.java:816)
at com.mysql.cj.jdbc.ClientPreparedStatement.executeBatchInternal(ClientPreparedStatement.java:418)
at com.mysql.cj.jdbc.StatementImpl.executeBatch(StatementImpl.java:795)
at org.apache.logging.log4j.core.appender.db.jdbc.JdbcDatabaseManager.commitAndClose(JdbcDatabaseManager.java:553)
... 26 more
Caused by: java.sql.SQLException: java.io.IOException: Stream closed
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:129)
at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122)
at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdateInternal(ClientPreparedStatement.java:1084)
at com.mysql.cj.jdbc.ClientPreparedStatement.executeBatchSerially(ClientPreparedStatement.java:795)
... 29 more
Caused by: java.io.IOException: Stream closed
at java.io.StringReader.ensureOpen(StringReader.java:56)
at java.io.StringReader.read(StringReader.java:90)
at java.io.Reader.read(Reader.java:140)
at com.mysql.cj.protocol.a.ReaderValueEncoder.readBytes(ReaderValueEncoder.java:79)
at com.mysql.cj.protocol.a.ReaderValueEncoder.getBytes(ReaderValueEncoder.java:49)
at com.mysql.cj.protocol.a.AbstractValueEncoder.encodeAsText(AbstractValueEncoder.java:92)
at com.mysql.cj.NativeQueryBindValue.writeAsText(NativeQueryBindValue.java:383)
at com.mysql.cj.protocol.a.NativeMessageBuilder.buildComQuery(NativeMessageBuilder.java:175)
at com.mysql.cj.protocol.a.NativeMessageBuilder.buildComQuery(NativeMessageBuilder.java:51)
at com.mysql.cj.ClientPreparedQuery.fillSendPacket(ClientPreparedQuery.java:222)
at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdateInternal(ClientPreparedStatement.java:1047)
... 30 more
```
## Reproduction
[An isolated test reproducing the test.
JUnit tests similar to the ones in the code base are extremely appreciated.]
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: notifications-unsubscribe@logging.apache.org.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
Re: [I] JdbcAppender using buffersize property, mysql JDBC driver and ColumnConfig's clob property with true occurs java.io.IOException : Stream closed (logging-log4j2)
Posted by "ppkarwasz (via GitHub)" <gi...@apache.org>.
ppkarwasz commented on issue #3127:
URL: https://github.com/apache/logging-log4j2/issues/3127#issuecomment-2457070176
> I'll implement the easy path...
That is great! Could you also take a look at the other issues tagged with https://github.com/apache/logging-log4j2/labels/appenders%3AJDBC and share your thoughts about them?
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: notifications-unsubscribe@logging.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
Re: [I] JdbcAppender using buffersize property, mysql jdbc driver and ColumnConfig's clob property with true occurs java.io.IOException : Stream closed (logging-log4j2)
Posted by "ppkarwasz (via GitHub)" <gi...@apache.org>.
ppkarwasz commented on issue #3127:
URL: https://github.com/apache/logging-log4j2/issues/3127#issuecomment-2456812926
@minseo300,
> I've analyzed MySQL and Oracle, and they don’t close the StringReader instance passed by the log4j2 JdbcDatabaseManager (with the setClob API).
Microsoft SQL does not close it either (see [`DDC.convertReaderToString`](https://github.com/microsoft/mssql-jdbc/blob/ffa5e1fa9cc1a490ed10d86b39a7c8b887488d89/src/main/java/com/microsoft/sqlserver/jdbc/DDC.java#L1399)) and Postgres SQL does not support `setClob()`, which should cover all major database types. :wink:
H2 also seems to only close streams if a `length` parameter is given (see [`ValueBlob.createTempBlob()`](https://github.com/h2database/h2database/blob/a5568b92000b1ee7e2eb91cddb020c00f9702bad/h2/src/main/org/h2/value/ValueBlob.java#L59), which uses `InputStream`, but the behavior with `Reader` is similar, although less evident).
IMHO this is a bug and you should report it against one of the drivers to see how JDBC developers interpret the `setClob()` method.
> Upon analysis, Oracle creates a new instance (I'm not sure exactly what it is) by reading from the StringReader and uses this instance when statement.executeBatch() is called. So there is no issue if log4j2 JdbcDatabaseManager closes the StringReader in the writeInternal() method (in the finally block).
>
> StringReader instances that are no longer referenced will be removed by the GC, so not closing the StringReader in JdbcDatabaseManager should not cause a memory leak. However, if StringReader instances remain active for a long time (or are created frequently), memory usage might temporarily increase. Could this impact application performance?
For `StringReader` the `close()` method is almost a no-op, since there are no external resources to release. Whether the drivers close it or not, is of no concern to us and there should be no impact whatsoever on the performance.
I believe that:
- it is better **not** to close the `Reader` instances ourselves,
- to use [`setClob(int, Reader, long)`](https://docs.oracle.com/javase/8/docs/api/java/sql/PreparedStatement.html#setClob-int-java.io.Reader-long-) method instead of the `setClob(int, Reader)`: this way **some** JDBC drivers will do the right thing and will close the `Reader`.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: notifications-unsubscribe@logging.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
Re: [I] JdbcAppender using buffersize property, mysql JDBC driver and ColumnConfig's clob property with true occurs java.io.IOException : Stream closed (logging-log4j2)
Posted by "minseo300 (via GitHub)" <gi...@apache.org>.
minseo300 commented on issue #3127:
URL: https://github.com/apache/logging-log4j2/issues/3127#issuecomment-2457076232
Thanks
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: notifications-unsubscribe@logging.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
Re: [I] JdbcAppender using buffersize property, mysql JDBC driver and ColumnConfig's clob property with true occurs java.io.IOException : Stream closed (logging-log4j2)
Posted by "minseo300 (via GitHub)" <gi...@apache.org>.
minseo300 closed issue #3127: JdbcAppender using buffersize property, mysql JDBC driver and ColumnConfig's clob property with true occurs java.io.IOException : Stream closed
URL: https://github.com/apache/logging-log4j2/issues/3127
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: notifications-unsubscribe@logging.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
Re: [I] JdbcAppender using buffersize property, mysql jdbc driver and ColumnConfig's clob property with true occurs java.io.IOException : Stream closed (logging-log4j2)
Posted by "garydgregory (via GitHub)" <gi...@apache.org>.
garydgregory commented on issue #3127:
URL: https://github.com/apache/logging-log4j2/issues/3127#issuecomment-2456762475
In general, I don't think a driver should close a reader or stream it is given based on the general principle that the call site that allocate a resource should close that resource. I don't think JDBC documents the expected driver behavior very well or at all IIRC.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: notifications-unsubscribe@logging.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
Re: [I] JdbcAppender using buffersize property, mysql JDBC driver and ColumnConfig's clob property with true occurs java.io.IOException : Stream closed (logging-log4j2)
Posted by "minseo300 (via GitHub)" <gi...@apache.org>.
minseo300 commented on issue #3127:
URL: https://github.com/apache/logging-log4j2/issues/3127#issuecomment-2457073774
@garydgregory @ppkarwasz
Then, do I have to provide PR still or @garydgregory will fix it?
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: notifications-unsubscribe@logging.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
Re: [I] JdbcAppender using buffersize property, mysql jdbc driver and ColumnConfig's clob property with true occurs java.io.IOException : Stream closed (logging-log4j2)
Posted by "minseo300 (via GitHub)" <gi...@apache.org>.
minseo300 commented on issue #3127:
URL: https://github.com/apache/logging-log4j2/issues/3127#issuecomment-2456921232
@ppkarwasz
Thanks for replying.
So you mean
- JdbcDatabaseManager doesn't have to close StringReader in writeInternal method(at "finally" block)
- It's better to use JDBC driver's api that close StringReader theirselves
- There is not impact StringReader is closed or not.
Is it okay to provide PR deleting Closer.closeSilently(reader) ?
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: notifications-unsubscribe@logging.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
Re: [I] JdbcAppender using buffersize property, mysql JDBC driver and ColumnConfig's clob property with true occurs java.io.IOException : Stream closed (logging-log4j2)
Posted by "garydgregory (via GitHub)" <gi...@apache.org>.
garydgregory commented on issue #3127:
URL: https://github.com/apache/logging-log4j2/issues/3127#issuecomment-2456954462
We could also use Connection.createClob() and [PreparedStatement.html#setClob](https://docs.oracle.com/en/java/javase/17/docs/api/java.sql/java/sql/PreparedStatement.html#setClob(int,java.sql.Clob)) ... looking...
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: notifications-unsubscribe@logging.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
Re: [I] JdbcAppender using buffersize property, mysql JDBC driver and ColumnConfig's clob property with true occurs java.io.IOException : Stream closed (logging-log4j2)
Posted by "garydgregory (via GitHub)" <gi...@apache.org>.
garydgregory commented on issue #3127:
URL: https://github.com/apache/logging-log4j2/issues/3127#issuecomment-2457170186
Let's close this ticket or wait for the user confirm the exception fix. Let's not reuse this ticket if solving _this_ issue reveals a _new_ problem.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: notifications-unsubscribe@logging.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
Re: [I] JdbcAppender using buffersize property, mysql jdbc driver and ColumnConfig's clob property with true occurs java.io.IOException : Stream closed (logging-log4j2)
Posted by "minseo300 (via GitHub)" <gi...@apache.org>.
minseo300 commented on issue #3127:
URL: https://github.com/apache/logging-log4j2/issues/3127#issuecomment-2456626470
@ppkarwasz
Before I provide a PR, I want to check one thing.
As far as I know, many JDBC drivers don't close a StringReader when we pass a StringReader instance using the setClob (or setCharacterStream, ...) API.
I've analyzed MySQL and Oracle, and they don’t close the StringReader instance passed by the log4j2 JdbcDatabaseManager (with the setClob API).
Upon analysis, Oracle creates a new instance (I'm not sure exactly what it is) by reading from the StringReader and uses this instance when statement.executeBatch() is called. So there is no issue if log4j2 JdbcDatabaseManager closes the StringReader in the writeInternal() method (in the finally block).
StringReader instances that are no longer referenced will be removed by the GC, so not closing the StringReader in JdbcDatabaseManager should not cause a memory leak. However, if StringReader instances remain active for a long time (or are created frequently), memory usage might temporarily increase. Could this impact application performance?
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: notifications-unsubscribe@logging.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
Re: [I] JdbcAppender using buffersize property, mysql JDBC driver and ColumnConfig's clob property with true occurs java.io.IOException : Stream closed (logging-log4j2)
Posted by "garydgregory (via GitHub)" <gi...@apache.org>.
garydgregory commented on issue #3127:
URL: https://github.com/apache/logging-log4j2/issues/3127#issuecomment-2457109355
> > I'll implement the easy path...
>
> That is great! Could you also take a look at the other issues tagged with [ appenders:JDBC](https://github.com/apache/logging-log4j2/labels/appenders%3AJDBC) Issue concerning the JDBC appender and share your thoughts about them?
I'll take a look over the next day or so...
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: notifications-unsubscribe@logging.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
Re: [I] JdbcAppender using buffersize property, mysql jdbc driver and ColumnConfig's clob property with true occurs java.io.IOException : Stream closed (logging-log4j2)
Posted by "ppkarwasz (via GitHub)" <gi...@apache.org>.
ppkarwasz commented on issue #3127:
URL: https://github.com/apache/logging-log4j2/issues/3127#issuecomment-2453329404
@minseo300,
Thank you for the in-depth analysis. You are right, the call to `StringReader.close()` on line 1043 seems problematic and I don't believe it is required (it is up to the driver to close the reader):
https://github.com/apache/logging-log4j2/blob/70f058daaa64379cb62e4bf473ed1fd3b66c31db/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/db/jdbc/JdbcDatabaseManager.java#L1043
Could you provide a PR that fixes this?
While looking at the [`PreparedStatement.setClob()`](https://docs.oracle.com/javase/8/docs/api/java/sql/PreparedStatement.html#setClob-int-java.io.Reader-) Javadoc I also notice a small optimization we could make. The Javadoc says:
> **Note**: Consult your JDBC driver documentation to determine if it might be more efficient to use a version of `setClob` which takes a `length` parameter.
Since we always know the length of the data (they are strings), would it be more useful to call [`setClob(int, Reader, long)`](https://docs.oracle.com/javase/8/docs/api/java/sql/PreparedStatement.html#setClob-int-java.io.Reader-long-) instead?
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: notifications-unsubscribe@logging.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
Re: [I] JdbcAppender using buffersize property, mysql JDBC driver and ColumnConfig's clob property with true occurs java.io.IOException : Stream closed (logging-log4j2)
Posted by "ppkarwasz (via GitHub)" <gi...@apache.org>.
ppkarwasz commented on issue #3127:
URL: https://github.com/apache/logging-log4j2/issues/3127#issuecomment-2457004645
> We could also use Connection.createClob() and [PreparedStatement.html#setClob](https://docs.oracle.com/en/java/javase/17/docs/api/java.sql/java/sql/PreparedStatement.html#setClob(int,java.sql.Clob)) ... looking...
Looks promising! :100:
Do we need to call [`Clob.free()`](https://docs.oracle.com/en/java/javase/17/docs/api/java.sql/java/sql/Clob.html#free()) ourselves or will the driver do it for us?
> But the simplest IMO is remove the call to `Closer.closeSilently(reader);` at the end of the method and add a comment when we allocate the StringReader saying we do not close it (1) because of batching, (2) it does not allocate a resource, and (3) it'll be GC'd away.
Yes, this is probably the easiest solution.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: notifications-unsubscribe@logging.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
Re: [I] JdbcAppender using buffersize property, mysql JDBC driver and ColumnConfig's clob property with true occurs java.io.IOException : Stream closed (logging-log4j2)
Posted by "garydgregory (via GitHub)" <gi...@apache.org>.
garydgregory commented on issue #3127:
URL: https://github.com/apache/logging-log4j2/issues/3127#issuecomment-2457075758
I fixed this in 2.x: commit 1a21ed8bc872b20df491414673cef8e5b1fd1821
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: notifications-unsubscribe@logging.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
Re: [I] JdbcAppender using buffersize property, mysql JDBC driver and ColumnConfig's clob property with true occurs java.io.IOException : Stream closed (logging-log4j2)
Posted by "garydgregory (via GitHub)" <gi...@apache.org>.
garydgregory commented on issue #3127:
URL: https://github.com/apache/logging-log4j2/issues/3127#issuecomment-2457043934
I'll implement the easy path...
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: notifications-unsubscribe@logging.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org