1

从我记事起就一直在工作的一行代码突然停止工作,现在抛出了 AccessViolationException:

例外:

System.AccessViolationException was unhandled
Message=Attempted to read or write protected memory. This is often an indication that
other memory is corrupt.
Source=Sybase.Data.AseClient
StackTrace:
    at Sybase.Data.AseClient.AseConnectionPool.ᜀ(AseConnection A_0)
    at Sybase.Data.AseClient.AseConnectionPoolManager.ᜀ(String A_0, AseConnection A_1)
    at Sybase.Data.AseClient.AseConnection.Open()
InnerException:

代码:

using (var connection = new AseConnection(this.ConnectionString))
{
    using (var command = connection.CreateCommand())
    {
        command.CommandText = "select * from TABLE_NAME";
        command.Connection.Open();
        ...

我重新启动了我的机器,检查了最近的 Windows 更新,运行了 CHKDSK,卸载并重新安装了 Sybase,但似乎没有任何效果!

我的目标是使用 64 位 Sybase 12.5.4 客户端的 Sybase 12.5.4 数据库,其中在我的代码中引用了 Sybase.Data.AseClient.dll(与生产代码相同的版本 - 可以正常工作)并且 sybdrvado11.dll 在以下情况下可用应用程序正在运行。自上次工作以来,从字面上看没有任何改变。

使用 Toad,我仍然能够连接数据库并与之交互,所以看起来这个问题只会影响我的代码。

有没有人遇到过这个问题?

4

2 回答 2

2

意识到这是一个古老的问题,但我想我会分享一些我在这方面的见解。

SAP/Sybase 存在一个持久的潜在问题AseClient,当启用连接池时,它将尝试从池中获取连接。如果没有可用的连接,它将尝试创建一个新连接,除非Max Pool Size池中已经存在连接。

在这种情况下,它不会等待,而是尝试创建一个超出连接池边界的连接,覆盖受保护的内存并产生您在上面遇到的错误。

这个问题即使在今天也存在。

尽管您的情况的根本原因是权限问题,AccessViolationException但这是由连接池引起的 - 从您的堆栈跟踪中可以看出。

在某些情况下,我们通过禁用连接池来解决它 - 这会削弱性能,而在其他情况下,我们通过设置Max Pool Size=1000隐藏它来解决它,除非 ASE 服务器正在经历足以占用 1000 个连接的降级。这两种方法都不是特别令人满意。

这种不稳定性是我们编写和开源的替代 AseClient背后的动机之一,它也支持 .NET Core。

于 2019-06-18T13:07:28.407 回答
0

原来是与组成员身份相关的数据库权限问题......我被删除了问题组,一切都恢复了活力。

于 2013-07-18T13:46:32.967 回答