Sql server WSO2 API管理器身份验证违反唯一密钥约束错误

Sql server WSO2 API管理器身份验证违反唯一密钥约束错误,sql-server,wso2,wso2-am,Sql Server,Wso2,Wso2 Am,我们已经在一个分布式体系结构中实现了WSO2 API管理器(v1.10.0),如在线文档中所述 这包括以下内容(在5个单独的服务器上): 网关(x2) 发布服务器和存储(在单个服务器上) 钥匙经理(x2) 这些数据库连接到SQL Server 2014实例上的3个普通API Manager数据库(注册表、用户管理器和API管理器) 我们使用密钥管理器对网站用户进行身份验证(登录、忘记密码等),并对API调用进行身份验证 但是,在尝试登录站点时,我在密钥管理器上看到以下错误(违反唯一密钥约束)

我们已经在一个分布式体系结构中实现了WSO2 API管理器(v1.10.0),如在线文档中所述

这包括以下内容(在5个单独的服务器上):

  • 网关(x2)
  • 发布服务器和存储(在单个服务器上)
  • 钥匙经理(x2)
这些数据库连接到SQL Server 2014实例上的3个普通API Manager数据库(注册表、用户管理器和API管理器)

我们使用密钥管理器对网站用户进行身份验证(登录、忘记密码等),并对API调用进行身份验证

但是,在尝试登录站点时,我在密钥管理器上看到以下错误(违反唯一密钥约束):

TID:[-1][[2016-10-06 00:36:47842]错误 {org.wso2.carbon.identity.oauth2.dao.TokenPersistenceTask}-错误 在持久化访问令牌时发生 :c5a0a11e63388dCHANGEDea34b0533445 {org.wso2.carbon.identity.oauth2.dao.TokenPersistenceTask} org.wso2.carbon.identity.oauth2.IdentityOAuth2Exception:发生错误时 存储使用者密钥的访问令牌: fpA6AhOfbVCHANGEDgH0WzBDOga位于 org.wso2.carbon.identity.oauth2.dao.TokenMgtDAO.storeAccessToken(TokenMgtDAO.java:246) 在 org.wso2.carbon.identity.oauth2.dao.TokenMgtDAO.persistAccessToken(TokenMgtDAO.java:284) 在 org.wso2.carbon.identity.oauth2.dao.TokenPersistenceTask.run(TokenPersistenceTask.java:52) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 在java.lang.Thread.run(Thread.java:745)处,由以下原因引起: com.microsoft.sqlserver.jdbc.SQLServerException:违反唯一性规则 密钥约束“CON_APP_KEY”。无法在对象中插入重复的键 “dbo.IDN\u OAUTH2\u访问\u令牌”。重复的键值为(15, 威廉姆斯。j2@CHANGED.org.uk, -1234, 应用程序(用户,369db21a386ae4CHANGED0ff34d35708d,激活,无)。在 com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(SQLServerException.java:216) 在 com.microsoft.sqlserver.jdbc.SQLServerStatement.getNextResult(SQLServerStatement.java:1515) 在 com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.doExecutePreparedStatement(SQLServerPreparedStatement.java:404) 在 com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement$PrepStmtExecCmd.doExecute(SQLServerPreparedStatement.java:350) 在 com.microsoft.sqlserver.jdbc.TDSCommand.execute(IOBuffer.java:5696) 在 com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(SQLServerConnection.java:1715) 在 com.microsoft.sqlserver.jdbc.SQLServerStatement.executeCommand(SQLServerStatement.java:180) 在 com.microsoft.sqlserver.jdbc.SQLServerStatement.executeStatement(SQLServerStatement.java:155) 在 com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.execute(SQLServerPreparedStatement.java:332) 在 org.wso2.carbon.identity.oauth2.dao.TokenMgtDAO.storeAccessToken(TokenMgtDAO.java:224) ... 还有5个

这导致网站上出现以下.NET错误:

我试过用谷歌搜索这个,但找不到最新的答案

我没有将密钥管理器配置为具有主节点和工作节点(如所述),因为文档似乎表明不需要这样做


任何帮助都将不胜感激

在一些调试发现问题后,您能否更改

中的以下配置(
0
)!在我们设置这个配置之前

<JDBCPersistenceManager>
    <SessionDataPersist>
        <PoolSize>0</PoolSize>
    </SessionDataPersist>
</JDBCPersistenceManager>

然后,旧的故障令牌将被删除,服务器将开始正常工作

我使用mysql,也面临同样的问题。更改池大小也不是一个完整的解决方案。然后我注意到idn_oauth2_access_令牌表有些奇怪。有一列time_已创建,但内容不是创建的时间。这是最后一次更新时间戳。我在某个地方读到了time_created(创建时间)列中几个列上的系统顺序。我检查了我的sql脚本,发现数据库在启动更新时更新了此列。我删除了这个规则,我没有更多的错误

嗨,巴西亚。谢谢你的回答。我确实看到了你链接到的页面。但是,我认为这是因为我正在使用的版本(v1.10.0-而不是v1.9.0)没有
/repository/conf/identity.xml
文件,并且它所拥有的
/repository/conf/indentity/identity.xml
文件中没有
PoolSize
元素。但是,它确实有一个
true…
元素(当前已注释掉)。我应该取消注释吗?如果是这样,它的值应该是
true
还是
false
?我刚刚取消了
元素的注释,尝试设置
true
,然后设置
false
。然而,在这两种情况下,我仍然有同样的问题。我将首先尝试运行清理(通过将其值设置为1),然后使用
true
再次尝试。是的,请尝试启用它并设置
0
。我已经实现了此功能,但仍然看到相同的问题。我正试图准确地确定新行是何时第一次添加到API Manager数据库中的
IDN\u OAUTH2\u ACCESS\u TOKEN
表中的,以及在什么条件下。在我们的设置中,我在这个版本中也遇到了同样的错误!嗨,安徒生。谢谢你的回答。何时运行
update
SQL命令?这只是一次性的任务吗?如果是,如何防止此问题再次发生?此问题的原因是初始运行时未添加0。当它为0时,这不会发生。不幸的是,我仍然看到
CON_APP_KEY
唯一键问题-即使在设置
0
之后。这仅在我离开一段时间后刷新应用程序网页时发生。我的identity.xml中有以下内容:
0 true false
<JDBCPersistenceManager>
    <SessionDataPersist>
        <PoolSize>0</PoolSize>
    </SessionDataPersist>
</JDBCPersistenceManager>
update IDN_OAUTH2_ACCESS_TOKEN set TOKEN_STATE="INACTIVE" where TOKEN_STATE="ACTIVE"