我安装了MySQL,它分配的内存比我预期的多得多.我想了解修复根本原因的地方.
要估计RAM使用率,我使用以下公式:
key_buffer_size + query_cache_size + innodb_buffer_pool_size + innodb_additional_mem_pool_size + innodb_log_buffer_size + Max_used_connections * (read_buffer_size + read_rnd_buffer_size + sort_buffer_size+ join_buffer_size+ binlog_cache_size + thread_stack + tmp_table_size)
Run Code Online (Sandbox Code Playgroud)
该公式产生约5.3 GB的估计分配.相反,MySQL使用的RAM继续增长,经过几天的活动后,它远远超过9 GB(大量写入交换).
我忘记了什么?我如何理解谁在吃剩余的RAM?
还有一些信息.
我在RHEL6.3 64位上运行MySQL CE 5.6.17.我的服务器有6 GB RAM和8GB交换空间.我一直有大约150个与MySQL有关的活动连接,但是我将max_connections保持在更高的值以适应峰值,并预见到这台机器上会有更多的流量.我只使用InnoDB.我的应用程序使用池连接到池.生成器打开连接并在完成后将它们释放到池中.我已经测量过我总是有几个并行请求,并且池化可以加快一点连接创建速度(因此查询速度更快).池(DBCP)自动调整合理数量的活动连接,通常约为100-150.我已经尝试过了:
- 杀死连接不会释放RAM
- FLUSH TABLES不释放RAM
按照我的配置:
---- my.cnf -----
[client]
port = 3306
socket = /var/lib/mysql/mysql.sock
default-character-set=utf8
[mysqld]
port = 3306
socket = /var/lib/mysql/mysql.sock
skip-external-locking
key_buffer_size = 64M
max_allowed_packet = 1M
table_open_cache = 256
key_buffer_size = 128M
sort_buffer_size = 524288
read_buffer_size = 131072
read_rnd_buffer_size = 524288 …Run Code Online (Sandbox Code Playgroud) 场景:我有一些触发器可以跟踪一个表的记录数以及其他有用信息.这些触发器在此表上添加/删除/更新时触发,并负责在另一个补充表中写入此信息.
现在,这些触发器将在多线程环境中运行,我可能可以同时访问表.我希望我可以做这样的事情,但它被禁止(错误:错误代码:1314.存储过程中不允许LOCK):
DELIMITER $$
DROP TRIGGER IF EXISTS del_alarmCount$$
CREATE TRIGGER del_alarmCount AFTER DELETE ON Alarm
FOR EACH ROW
BEGIN
SET autocommit=0;
LOCK TABLES AlarmCount WRITE, AlarmMembership READ;
UPDATE AlarmCount SET num = num - 1
WHERE RuleId = OLD.RuleId AND
MemberId = 0 AND
IsResolved = OLD.IsResolved;
UPDATE AlarmCount SET num = num - 1
WHERE RuleId = OLD.RuleId AND
IsResolved = OLD.IsResolved AND
MemberId IN (SELECT MemberId FROM AlarmMembership WHERE AlarmId=OLD.Id);
COMMIT;
UNLOCK TABLES;
END $$ …Run Code Online (Sandbox Code Playgroud) 在我的项目中,我有下面报告的类,具有双向关系映射.当我尝试通过JPA读取DataProviderImpl类型的对象时,我得到以下异常:
org.apache.openjpa.persistence.ArgumentException:字段"persistence.entity.DataProviderImpl.methods"无法声明它由另一个字段映射.其映射策略(org.apache.openjpa.jdbc.meta.strats.HandlerCollectionTableFieldStrategy)不支持另一个字段的映射.
我已经检查了其他问题,但似乎没有什么适用于我的情况.任何提示?先感谢您!
<persistence
xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
version="2.0">
<persistence-unit name="DataProvider" transaction-type="JTA"> <!-- transaction-type="RESOURCE_LOCAL" info at: http://tomee.apache.org/jpa-concepts.html -->
<jta-data-source>
osgi:service/jdbc/mysqlPoolXAds
</jta-data-source>
<non-jta-data-source>
osgi:service/jdbc/mysqlds
</non-jta-data-source>
<class>persistence.entity.DataProviderImpl</class>
<exclude-unlisted-classes>true</exclude-unlisted-classes>
<properties>
</properties>
</persistence-unit>
<persistence-unit name="RestMethod" transaction-type="JTA"> <!-- transaction-type="RESOURCE_LOCAL" info at: http://tomee.apache.org/jpa-concepts.html -->
<jta-data-source>
osgi:service/jdbc/mysqlPoolXAds
</jta-data-source>
<non-jta-data-source>
osgi:service/jdbc/mysqlds
</non-jta-data-source>
<class>persistence.entity.RestMethodImpl</class>
<exclude-unlisted-classes>true</exclude-unlisted-classes>
<properties>
</properties>
</persistence-unit>
Run Code Online (Sandbox Code Playgroud)
@Entity(name = "DataProvider")
public class DataProviderImpl implements DataProvider {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
private String name;
// ...
@OneToMany(fetch = FetchType.LAZY, mappedBy="dataProvider")
private List<RestMethod> methods;
public DataProviderImpl() { …Run Code Online (Sandbox Code Playgroud)