“插入Blob字段特殊情况说明”的版本间的差异

来自姬鸿昌的知识库
跳到导航 跳到搜索
 
第1行: 第1行:
 
https://www.bilibili.com/video/BV1eJ411c7rf/?p=31
 
https://www.bilibili.com/video/BV1eJ411c7rf/?p=31
  
当插入的blob 大于 1M 时:
+
当插入的blob 大于 4M 时抛异常:<syntaxhighlight lang="console">
 +
com.mysql.cj.jdbc.exceptions.PacketTooBigException: Packet for query is too large (5,094,852 > 4,194,304). You can change this value on the server by setting the 'max_allowed_packet' variable.
 +
 
 +
at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:107)
 +
at com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:916)
 +
at com.mysql.cj.jdbc.ClientPreparedStatement.execute(ClientPreparedStatement.java:354)
 +
at io.github.jihch.blob.BlobTest.testInsertBlobLargerThan1M(BlobTest.java:40)
 +
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 +
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
 +
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
 +
at java.lang.reflect.Method.invoke(Method.java:498)
 +
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:59)
 +
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
 +
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:56)
 +
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
 +
at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306)
 +
at org.junit.runners.BlockJUnit4ClassRunner$1.evaluate(BlockJUnit4ClassRunner.java:100)
 +
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:366)
 +
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:103)
 +
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:63)
 +
at org.junit.runners.ParentRunner$4.run(ParentRunner.java:331)
 +
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:79)
 +
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:329)
 +
at org.junit.runners.ParentRunner.access$100(ParentRunner.java:66)
 +
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:293)
 +
at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306)
 +
at org.junit.runners.ParentRunner.run(ParentRunner.java:413)
 +
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
 +
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:69)
 +
at com.intellij.rt.junit.IdeaTestRunner$Repeater$1.execute(IdeaTestRunner.java:38)
 +
at com.intellij.rt.execution.junit.TestsRepeater.repeat(TestsRepeater.java:11)
 +
at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35)
 +
at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:235)
 +
at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:54)
 +
</syntaxhighlight>这是因为在MySQL 的配置文件中:<syntaxhighlight lang="properties">
 +
# The maximum size of one packet or any generated or intermediate string, or any parameter sent by the
 +
# mysql_stmt_send_long_data() C API function.
 +
max_allowed_packet=4M
 +
</syntaxhighlight>默认配置参数 MySQL 5.7 的C语言API发送的最大包大小是4M,大于4M就会抛异常,要想存储更大的 Blob 数据,就修改这个配置参数后重启 MySQL 服务。
 +
 
 +
https://github.com/jihch/jdbc/blob/main/src/main/java/io/github/jihch/blob/BlobTest.java

2023年1月2日 (一) 12:34的最新版本

https://www.bilibili.com/video/BV1eJ411c7rf/?p=31

当插入的blob 大于 4M 时抛异常:

com.mysql.cj.jdbc.exceptions.PacketTooBigException: Packet for query is too large (5,094,852 > 4,194,304). You can change this value on the server by setting the 'max_allowed_packet' variable.

	at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:107)
	at com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:916)
	at com.mysql.cj.jdbc.ClientPreparedStatement.execute(ClientPreparedStatement.java:354)
	at io.github.jihch.blob.BlobTest.testInsertBlobLargerThan1M(BlobTest.java:40)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:59)
	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:56)
	at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
	at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306)
	at org.junit.runners.BlockJUnit4ClassRunner$1.evaluate(BlockJUnit4ClassRunner.java:100)
	at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:366)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:103)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:63)
	at org.junit.runners.ParentRunner$4.run(ParentRunner.java:331)
	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:79)
	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:329)
	at org.junit.runners.ParentRunner.access$100(ParentRunner.java:66)
	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:293)
	at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306)
	at org.junit.runners.ParentRunner.run(ParentRunner.java:413)
	at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
	at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:69)
	at com.intellij.rt.junit.IdeaTestRunner$Repeater$1.execute(IdeaTestRunner.java:38)
	at com.intellij.rt.execution.junit.TestsRepeater.repeat(TestsRepeater.java:11)
	at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35)
	at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:235)
	at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:54)

这是因为在MySQL 的配置文件中:

# The maximum size of one packet or any generated or intermediate string, or any parameter sent by the
# mysql_stmt_send_long_data() C API function.
max_allowed_packet=4M

默认配置参数 MySQL 5.7 的C语言API发送的最大包大小是4M,大于4M就会抛异常,要想存储更大的 Blob 数据,就修改这个配置参数后重启 MySQL 服务。

https://github.com/jihch/jdbc/blob/main/src/main/java/io/github/jihch/blob/BlobTest.java