3

首先,我知道最佳实践是在您的 Web 应用程序中使用单个数据库用户帐户,以利用连接池来保持应用程序良好且响应迅速。但是,由于要求(在任何情况下都不会更改),我必须使用他或她的数据库帐户对每个用户进行身份验证。

上下文是一个在 Android 上运行的仓库管理应用程序,但它的数据来自我可能会在 Grails 中编写的 Web 服务,除非这里的建议向我展示了更适合我要求的技术。由于应用程序的性质,用户可能只需要每天进行一次或两次身份验证,所以我想我可以简单地将连接保存在一个 HashMap 中,该 HashMap 由用户名的哈希码与密码连接。这应该允许应用程序保持与最佳实践相同或相似的性能水平。

现在,我的问题是使用持久的 Connection 对象。我知道如果没有大量定制,我将无法将它们与 GORM 一起使用,所以我计划将它们与 groovy.sql.Sql 一起使用,因为大部分业务逻辑都在 PL/SQL 包中,所以效果很好反正。

我的问题是 groovy.sql.Sql 类如何处理它的 Connection 对象?我会遇到连接被它关闭的问题,还是我可以安全地使用我的 HashMap 来持久化连接?

4

2 回答 2

2

groovy.sql.Sql 不会关闭您的连接。在类规范中,您可以找到:

如果此 SQL 对象是使用 Connection 创建的,则此方法将关闭连接。

所以 SQL 类真的是如果你想自己做事,不完全信任 Hibernate。虽然,我认为您可以将 Spring 的 UserCredentialsDataSourceAdapter 用于您的解决方案。它使用 ThreadLocal 为每个线程设置凭据,因此调用:UserCredentialsDataSourceAdapter.setCredentialsForCurrentThread(String username, String password)

会解决的。您可以在这里尝试其他方法。

于 2012-08-17T16:18:34.263 回答
1

实际上,我只是发现了一些对这个问题的未来访问者可能有用的东西。在深入研究 Spring Framework 的文档时,我发现他们的 JDBC Extensions 实际上实现了代理身份验证(其中代理帐户用于建立连接,但为 SQL 执行的上下文提供了一个实际帐户)。不幸的是,截至 2012 年 8 月 17 日的实现不支持通过代理连接为用户使用密码,因此它目前对我不可用,但任何发现此问题的人都应该检查是否仍然如此。以下是链接:

JDBC 扩展文档 v1.0.0.RC1

JDBC 扩展文档库

于 2012-08-17T17:46:13.450 回答