ServiceStack と OrmLite.Oracle を使用しています。Windows Server 2012 x64 で ODBC Driver for Oracle を使用して、古い Oracle 7.3 インスタンスに接続しています。ODBC は ODBC32 としてセットアップされます。
次のように、レポからデータベースに接続してクエリを実行します。
using (IDbConnection db = _context.DbFactory.OpenDbConnection())
{
return db.Select<T>();
}
_context は、次のように作成された OrmLiteConnectionFactory を保持します。
DbFactory= new OrmLiteConnectionFactory(conInfo.ConnectionString,false, ServiceStack.OrmLite.Oracle.OracleDialect.Provider);
私のサービスは問題なく動作しており、データベースにアクセスしてクエリを実行できます。問題ありません。しかし、一定時間 (30 分程度) が経過すると接続が失われ、Open the connection を呼び出すと次のエラーが表示されるため、(Windows サービスでホストされている) サービスを再起動する必要があります: 環境を割り当てられません扱う。
しばらくして接続へのハンドルを解放するのは正常なことかもしれませんが、なぜ再接続しないのでしょうか? OrmLite コードから、AutoDisposeConnection が True に設定されている場合、または内部 ormLiteConnection が null の場合、OpenDbConnection はその接続の新しいインスタンスを返す必要があることがわかります。私の接続はnullではないと思いますが、完全には機能していません...
private OrmLiteConnection ormLiteConnection;
private OrmLiteConnection OrmLiteConnection
{
get
{
if (ormLiteConnection == null)
{
ormLiteConnection = new OrmLiteConnection(this);
}
return ormLiteConnection;
}
}
public IDbConnection OpenDbConnection()
{
var connection = CreateDbConnection();
connection.Open();
return connection;
}
public IDbConnection CreateDbConnection()
{
if (this.ConnectionString == null)
throw new ArgumentNullException("ConnectionString", "ConnectionString must be set");
var connection = AutoDisposeConnection
? new OrmLiteConnection(this)
: OrmLiteConnection;
return connection;
}
AutoDisposeConnection を True に設定しようとしましたが、そうすると、「保護されたメモリを読み書きしようとしました。これは多くの場合、他のメモリが破損していることを示しています。」という AccessViolationException が発生します。どういう意味ですか?これは OS、ODBC、または OrmLite のエラーですか? なぜこれが起こっているのですか?
Oracle 7.3 を使用しているため、ServiceStack.OrmLite.Oracle.dll を再コンパイルして、System.Data.OracleClient ではなく System.Data.Odbc を使用する必要がありました (v8+ とのみ互換性があります)。
呼び出しごとに接続が有効かどうかをテストすることを本当に避けたいので、この作業を行うための助けをいただければ幸いです。ありがとう