我的应用程序( https://github.com/atulsm/config-service )是一个简单的配置服务,它从数据库存储/检索配置键/值,并包含以下内容。
- 水滴 Sprite
- hibernate
- hibernate EHCache
- MySQL
我启用了 Mysql 常规日志,当我在运行 load test 时查看它时简单的 get() 的,这是我在日志中看到的唯一填充整个日志的内容。
2019-08-28T11:36:12.003158Z 295 查询设置自动提交=0
2019-08-28T11:36:12.003318Z 295 查询提交
2019-08-28T11:36:12.003425Z 295 查询设置自动提交=1
2019-08-28T11:36:12.003834Z 295 查询设置自动提交=0
2019-08-28T11:36:12.004005Z 295 查询提交
2019-08-28T11:36:12.004105Z 295 查询设置自动提交=1
2019-08-28T11:36:12.004481Z 295 查询设置自动提交=0
2019-08-28T11:36:12.004646Z 295 查询提交
2019-08-28T11:36:12.004762Z 295 查询设置自动提交=1
问题:
- 由于没有执行任何查询,并且数据是从二级缓存提供的,所以我的预期是不会与Mysql进行交互
- 知道为什么会发生这种情况吗?有没有办法禁用它。
- 我的 QPS 目前约为 800。我希望如果我可以禁用这些提交调用,它会得到显着改善。
编辑
问题似乎出在@UnitOfWork 上。我删除了整个 DAO 调用并将其替换为虚拟对象,但我仍然看到数据库操作!
Bucket dummy = new Bucket();
@GET
@Produces(MediaType.APPLICATION_JSON)
@Timed
@UnitOfWork
public Bucket getBucket(@PathParam("bucketName") String bucketName){
//return BucketService.INSTANCE.getBucket(bucketName);
return dummy;
}
最佳答案
已通过使用 @UnitOfWork(transactional = false) 禁用 get 操作中的事务来解决此问题。
@GET
@Produces(MediaType.APPLICATION_JSON)
@Timed
@UnitOfWork(transactional = false)
public Bucket getBucket(@PathParam("bucketName") String bucketName){
return BucketService.INSTANCE.getBucket(bucketName);
}
关于mysql - Dropwizard @UnitOfWork : Large number of SET autocommit=1/0; commit calls where there is no transaction to run,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57691810/