AseConnection.Open() throws AccessViolationException

本文关键字:throws AccessViolationException Open AseConnection | 更新日期: 2023-09-27 18:22:17

从我记事起就一直在工作的一行代码突然停止工作,现在它抛出了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,我仍然能够连接数据库并与之交互,所以看起来这个问题只会影响我的代码。

以前有人经历过这个问题吗?

AseConnection.Open() throws AccessViolationException

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

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

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

这个问题甚至在今天也存在。

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

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

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

原来是与组成员身份有关的数据库权限问题。。。我被排除在问题组之外,一切又恢复了生机。