我目前正在开发一个使用 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 用户连接被持久化到数据库。我的问题是:做这样的事情是一个有效的解决方案吗?还有哪些其他需要重复数据源的场景?另一方面 - 使用这种配置可能会产生什么影响?