2

我目前正在开发一个使用 Spring Social 与 Twitter 通信的 Java 应用程序。该应用程序使用 Spring Data (JPA) 在本地管理用户。

当我在 Twitter 上授权访问并且 Twitter 向 OAuth1 回调 URL 发出请求时,我的应用程序阻塞,我在日志文件中看到以下内容(我缩短了堆栈跟踪):

ERROR 2013-08-18 16:05:09,511 http-bio-8080-exec-44]  org.springframework.transaction.interceptor.TransactionInterceptor  [TransactionAspectSupport.completeTransactionAfterThrowing
(): "Application exception overridden by rollback exception"]
org.springframework.jdbc.UncategorizedSQLException: PreparedStatementCallback; uncategorized SQLException for SQL [insert into UserConnection (userId, providerId, providerUserId, ra
nk, displayName, profileUrl, imageUrl, accessToken, secret, refreshToken, expireTime) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)]; SQL state [null]; error code [0]; You can't operate 
on a closed Connection!!!; nested exception is java.sql.SQLException: You can't operate on a closed Connection!!!
        at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:83)
        at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:80)
        at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:80)
        at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:603)
...
Caused by: java.sql.SQLException: You can't operate on a closed Connection!!!
        at com.mchange.v2.sql.SqlUtils.toSQLException(SqlUtils.java:118)
        at com.mchange.v2.sql.SqlUtils.toSQLException(SqlUtils.java:77)
        at com.mchange.v2.c3p0.impl.NewProxyConnection.prepareStatement(NewProxyConnection.java:171)
        at org.springframework.jdbc.core.JdbcTemplate$SimplePreparedStatementCreator.createPreparedStatement(JdbcTemplate.java:1438)
        at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:581)
        ... 94 more
Caused by: java.lang.NullPointerException
        at com.mchange.v2.c3p0.impl.NewProxyConnection.prepareStatement(NewProxyConnection.java:135)
        ... 96 more
[WARN 2013-08-18 16:05:09,513 http-bio-8080-exec-44]  org.springframework.social.connect.web.ConnectController  [ConnectController.oauth1Callback(): "Exception while handling OAuth1 callback (Could not roll back JPA transaction; nested exception is javax.persistence.PersistenceException: unexpected error when rollbacking). Redirecting to twitter connection status page."]

经过一些研究,我相信我基本上看到了这里描述的问题: https ://jira.springsource.org/browse/SOCIAL-384

出于某种原因,Spring Social 核心使用 JdbcUsersConnectionRepository 的事实与我的 JPA 设置并不匹配。我知道有一个插件可用;但是我决定尝试数据源配置并创建两个基本相同的数据源 bean 配置(具有不同的名称),并将一个绑定到 Spring Social,另一个绑定到我的实体管理器配置。

通过此设置,上述错误消失了,我可以看到我的 Twitter 用户连接被持久化到数据库。我的问题是:做这样的事情是一个有效的解决方案吗?还有哪些其他需要重复数据源的场景?另一方面 - 使用这种配置可能会产生什么影响?

4

1 回答 1

0

此解决方案的缺点是您需要减少连接池的最大容量。

示例:假设您有一个连接池,其中最多包含 30 个连接。现在您想为 Spring Social 添加另一个数据源。我想您的每个用户将同时使用 2 个数据源。因此,您需要 2 个连接池,每个连接池最多 15 个连接。现在达到极限会容易得多。

于 2013-08-20T08:40:34.977 回答