- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我一直遇到一个奇怪的问题,即 MySQL (5.5.41-0ubuntu0.14.04.1) 会随机且意外地将 max_allowed_packet 更改为 1024(在 mysql 客户端中查询 max_allowed_packet 变量时)。
MySQL 配置文件 (/etc/mysql/my.cnf) 在安装后保持原样,除了绑定(bind)地址被注释掉以允许远程连接。 mysqld 和 mysql 的 max_allowed_packet 的值都设置为 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_packet 的 session 变量,因为它是一个只读变量。这就是为什么我绞尽脑汁想弄清楚如果 my.cnf 中的值设置为 16M,这个变量会如何以及为什么会发生变化。
任何帮助将不胜感激,因为自从我们的数据包大小增加到 1024 以上以来,这个问题一直在重复出现。
最佳答案
您说“在 mysql 客户端中查询 max_allowed_packet 变量时”。我们认为这意味着您正在运行如下查询:
SELECT @@global.max_allowed_packet, @@session.max_allowed_packet;
这会返回类似这样的结果:
@@global.max_allowed_packet @@session.max_allowed_packet
--------------------------- ----------------------------
16777216 16777216
可以动态修改 max_allowed_packet
值(如果用户有足够的权限)。
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_packet
值,该设置应出现在 my.cnf< 的
。 (这也可以作为启动 mysql 的命令行上的参数提供。但我们不这样做,我们只是在 my.cnf 文件中设置它。)[mysqld]
部分下
my.cnf
[mysqld]
...
max_allowed_packet = 16M
[mysqldump]
...
max_allowed_packet = 16M
max_allowed_packet
的设置也可以出现在my.cnf
的其他部分下。其他部分下的设置不会影响服务器。例如,同一行可能出现在 [mysqldump]
、[mysql]
和 [client]
部分下。 (当 max_allowed_packet
出现在那些值与 [mysqld]
部分下的设置不同的其他部分下时,我对行为没有很好的理解。)
我从未观察到您描述的那种行为;你的描述在你正在执行的exact语句和返回的exact输出方面有点欠缺。
关于java - MySQL max_allowed_packet 随机更改为 1024 字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29987985/
我是一名优秀的程序员,十分优秀!