gpt4 book ai didi

java - MySQL max_allowed_pa​​cket 随机更改为 1024 字节

转载 作者:可可西里 更新时间:2023-11-01 08:05:31 25 4
gpt4 key购买 nike

我一直遇到一个奇怪的问题,即 MySQL (5.5.41-0ubuntu0.14.04.1) 会随机且意外地将 max_allowed_pa​​cket 更改为 1024(在 mysql 客户端中查询 max_allowed_pa​​cket 变量时)。

MySQL 配置文件 (/etc/mysql/my.cnf) 在安装后保持原样,除了绑定(bind)地址被注释掉以允许远程连接。 mysqld 和 mysql 的 max_allowed_pa​​cket 的值都设置为 16M,并且在 mysql 服务器启动时(service mysql start),该值为预期的 16777216。

我查看了 mysql 错误日志和系统日志,没有发现与数据库崩溃或重启有关的任何内容。

数据库运行在具有 4GB 内存和 Ubuntu 14.04 的 VPS 上,并由 Java Spring 应用程序使用。

目前应用还在开发中,使用的是mysql root账号,待找到问题根源后会更改。

Spring中的Datasource和EntityManager配置如下:

@Bean
public DataSource dataSource() {
BasicDataSource dataSource = new BasicDataSource();
dataSource.setTestOnBorrow(true);
dataSource.setValidationQuery("SELECT 1");
dataSource.setUrl("jdbc:mysql://localhost:3306/testdb");
dataSource.setUsername("root");
dataSource.setPassword("...");
return dataSource;
}

@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory(
DataSource dataSource) {
LocalContainerEntityManagerFactoryBean emf = new LocalContainerEntityManagerFactoryBean();
emf.setPackagesToScan("com.app.entity");
emf.setPersistenceProvider(new HibernatePersistenceProvider());
Properties jpaProperties = new Properties();
jpaProperties.setProperty("hibernate.hbm2ddl.auto", "update");
jpaProperties.setProperty("hibernate.show_sql", "true");
emf.setJpaProperties(jpaProperties);
emf.setDataSource(dataSource);
return emf;
}

@Bean
public JpaTransactionManager transactionManager(EntityManagerFactory emf) {
JpaTransactionManager transactionManager = new JpaTransactionManager();
transactionManager.setEntityManagerFactory(emf);
return transactionManager;
}

mysql-connector-java 和 commons-dbcp 库用于数据库交互。

经过多次搜索,我发现在较新版本的 mysql 中,无法更改 max_allowed_pa​​cket 的 session 变量,因为它是一个只读变量。这就是为什么我绞尽脑汁想弄清楚如果 my.cnf 中的值设置为 16M,这个变量会如何以及为什么会发生变化。

任何帮助将不胜感激,因为自从我们的数据包大小增加到 1024 以上以来,这个问题一直在重复出现。

最佳答案

您说“在 mysql 客户端中查询 max_allowed_pa​​cket 变量时”。我们认为这意味着您正在运行如下查询:

SELECT @@global.max_allowed_packet, @@session.max_allowed_packet;

这会返回类似这样的结果:

@@global.max_allowed_packet  @@session.max_allowed_packet  
--------------------------- ----------------------------
16777216 16777216

可以动态修改 max_allowed_pa​​cket 值(如果用户有足够的权限)。

SET GLOBAL max_allowed_packet = 33554432 ;

我们可以验证全局变量的值是否被修改:

SELECT @@global.max_allowed_packet, @@session.max_allowed_packet;

@@global.max_allowed_packet @@session.max_allowed_packet
--------------------------- ----------------------------
33554432 16777216

session 变量的值在 session 开始时(据我所知)从服务器(global)变量的当前值初始化。


my.cnf 文件中有几个“部分”。要为服务器设置 global max_allowed_pa​​cket 值,该设置应出现在 my.cnf< 的 [mysqld] 部分下。 (这也可以作为启动 mysql 的命令行上的参数提供。但我们不这样做,我们只是在 my.cnf 文件中设置它。)

my.cnf

[mysqld]
...
max_allowed_packet = 16M

[mysqldump]
...
max_allowed_packet = 16M

max_allowed_pa​​cket 的设置也可以出现在my.cnf 的其他部分下。其他部分下的设置不会影响服务器。例如,同一行可能出现在 [mysqldump][mysql][client] 部分下。 (当 max_allowed_pa​​cket 出现在那些值与 [mysqld] 部分下的设置不同的其他部分下时,我对行为没有很好的理解。)


我从未观察到您描述的那种行为;你的描述在你正在执行的exact语句和返回的exact输出方面有点欠缺。

关于java - MySQL max_allowed_pa​​cket 随机更改为 1024 字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29987985/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com