我记得的一段代码已经突然停止工作,它现在抛出一个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,我仍然可以连接数据库并与之交互,所以看起来这个问题只影响我的代码。
之前有没有人遇到过这个问题?
答案 0 :(得分:2)
意识到这是一个古老的问题,但是我想我会分享一些我在这一领域的见识。
SAP / Sybase AseClient
存在一个持久的潜在问题,即在启用连接池时,它将尝试从池中获取连接。如果没有可用的连接,除非池中已经有Max Pool Size
个连接,否则它将尝试创建新的连接。
在这种情况下,它会尝试创建一个超出连接池范围的连接,而不是等待连接,覆盖受保护的内存并产生您在上面遇到的错误。
这个问题甚至在今天仍然存在。
尽管您遇到的根本原因是权限问题,但是AccessViolationException
是由连接池引起的-从堆栈跟踪中可以看出。
在某些情况下,我们通过禁用连接池来解决此问题-这会降低性能,而在其他情况下,通过设置Max Pool Size=1000
来隐藏它,除非ASE服务器经历的降级足以占用1000个连接。两种方法都不是特别令人满意。
这种不稳定性是我们编写并开放源代码的an alternative AseClient背后的动机之一,也支持.NET Core。
答案 1 :(得分:0)
原来是与群组成员身份相关的数据库权限问题...我被删除了问题组,一切都恢复了生机。