AseConnection.Open()抛出AccessViolationException

时间:2013-07-15 13:00:39

标签: c# sybase access-violation sybase-ase

我记得的一段代码已经突然停止工作,它现在抛出一个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,我仍然可以连接数据库并与之交互,所以看起来这个问题只影响我的代码。

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

2 个答案:

答案 0 :(得分:2)

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

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

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

这个问题甚至在今天仍然存在。

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

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

这种不稳定性是我们编写并开放源代码的an alternative AseClient背后的动机之一,也支持.NET Core。

答案 1 :(得分:0)

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

相关问题