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,我仍然能够连接数据库并与之交互,所以看起来这个问题只会影响我的代码。
以前有人经历过这个问题吗?
SAP/Sybase AseClient
存在一个持久的潜在问题,当启用连接池时,它将尝试从池中获取连接。如果没有可用的连接,它将尝试创建一个新连接,除非池中已经有Max Pool Size
连接。
在这种情况下,它不会等待,而是会尝试创建一个超出连接池界限的连接,从而覆盖受保护的内存,并产生您在上面遇到的错误。
这个问题甚至在今天也存在。
尽管本例中的根本原因是权限问题,但AccessViolationException
是由连接池引起的——从堆栈跟踪中可以看出。
在某些情况下,我们通过禁用连接池(这会降低性能)来解决它,在其他情况下,通过设置Max Pool Size=1000
来隐藏它,除非ASE服务器的性能下降到足以连接1000个连接。这两种方法都不是特别令人满意。
这种不稳定是我们编写的另一个开源AseClient背后的动机之一,它也支持.NET Core。
原来是与组成员身份有关的数据库权限问题。。。我被排除在问题组之外,一切又恢复了生机。