应用程序必须以这样一种方式设计,即它必须在提交到 SVN 存储库时支持多个用户。我已经完成了应用程序和相关的东西,但是,我被这个多用户的东西所困扰。我怎样才能做到这一点?我在某处看到,对于每个线程,您必须实例化一个单独的 SVNRepository 驱动程序。这说明它不是线程安全的..或者可能是我弄错了整个事情。对此问题的任何帮助表示赞赏。谢谢。
我从Here获得上述信息(斜体字)。
应用程序必须以这样一种方式设计,即它必须在提交到 SVN 存储库时支持多个用户。我已经完成了应用程序和相关的东西,但是,我被这个多用户的东西所困扰。我怎样才能做到这一点?我在某处看到,对于每个线程,您必须实例化一个单独的 SVNRepository 驱动程序。这说明它不是线程安全的..或者可能是我弄错了整个事情。对此问题的任何帮助表示赞赏。谢谢。
我从Here获得上述信息(斜体字)。
我是 SVNKit 开发人员,让我解释一下这些东西是如何工作的。
SVNRepository 类代表一个带有自己凭据的 SVN 连接。它是线程不安全的,这意味着您只能对其执行顺序操作。有关更多详细信息,请参阅这篇文章:
http://vcs.atspace.co.uk/2012/09/21/are-svnkit-methods-reenterable/
因此,如果您的应用程序尝试同时创建多个提交,您应该使用多个独立的 SVNRepository 实例。好消息是不需要特殊的同步代码,所有同步都在服务器端执行。另一个好消息是,当某个 SVNRepository 对象的提交完成或取消时,您可以重用连接来启动另一个提交。但请注意,如果您使用 http 协议,即使您更改了连接的凭据 (SVNRepository#setAuthenticationManager),您也不能重复使用相同的连接来代表另一个用户提交。
要创建没有工作副本的提交,请使用启动提交事务的 SVNRepository#getCommitEditor。要停止事务,请使用 ISVNCommitEditor#closeEdit 或 ISVNCommitEditor#abortEdit;您可以对 SVNRepository 实例执行其他操作,直到提交事务完成。
ISVNCommitEditor 实例应该描述您的虚拟工作副本:它告诉 SVNKit 您当前对最新工作副本状态的了解。如果描述与真正的最新更改不对应,您会收到“文件或目录已过期;尝试更新”错误。
http://vcs.atspace.co.uk/2012/07/20/subversion-remote-api-committing-without-working-copy/
您可以在 ISVNEditor#openFile/openDir 中使用 -1 而不是真正的修订版来禁用检查,但这可能会导致另一个问题:您可能会在不知道更改的情况下覆盖更改。
另一种选择是使用真实的工作副本和文件系统上的真实更改来提交(使用 SvnOperationFactory#createCommit)。但即使在这种情况下,请查看第一个链接以了解哪些对象可以/不能跨线程重用。
希望这会有所帮助,如果您有其他问题,请随时在 SVNKit 邮件列表中提问。