我们在我的一个应用程序中实现了Spring OAuth 2.0,当我们对sam进行了性能测试时,应用程序开始抛出异常
DuplicateKeyException
并且我们假设发生这种情况是因为同一用户尝试多次创建令牌。我们将通过确保不同时为同一用户调用create token来避免此问题。
我们正在申请中使用密码授予流程。
我们注意到的一个观察是,当并发性低时,令牌创建和验证完全正常,一旦负载增加,服务的响应时间也会增加。从日志中我们可以看到有很多sql事务超时,间歇性地出现了死锁。我们使用的是MySQL,用于创建表的SQL脚本如下所示。
create table oauth_access_token (
token_id VARCHAR(256),
token LONGVARBINARY,
authentication_id VARCHAR(256) PRIMARY KEY,
user_name VARCHAR(256),
client_id VARCHAR(256),
authentication LONGVARBINARY,
refresh_token VARCHAR(256)
);
create table oauth_refresh_token (
token_id VARCHAR(256),
token LONGVARBINARY,
authentication LONGVARBINARY
);
可以在此java class中找到所使用的查询。
有没有办法通过优化表结构或向列添加索引来解决此问题。
发现的一个相关问题是Spring OAuth2 JDBCTokenStore performance and database schema。