[seasar-dotnet:477] Re: S2DAO.NET1.0.2でのCommandTimeoutのコントロール方法

koyak [E-MAIL ADDRESS DELETED]
2007年 3月 7日 (水) 03:25:34 JST


中川様

小谷と申します。

タイムアウトの設定についてですが、
どこかで何らかのクラスの拡張が必要になるかと思います。

〜HandlerはSeasar管理ではないため、インジェクション等で
タイムアウトは設定できません。
〜Handlerを使用している〜AutoStaticCommand,〜DynamicCommandも
Seasar管理ではないため、継承してTimeOutプロパティを追加して
使うことはできません。

私が現在所属しているプロジェクトでは
(DBFluteでは、と言った方がいいかもしれませんが)
Seasar.Dao.Impl.DaoMetaDataImplを継承してその中で
タイムアウト時間をIDBCommandに対して設定しています。

同じくS2DaoInterceptorを継承したクラスの中に
IDaoMetaDataFactoryを持たせ、
IDaoMetaDataFactoryを実装したクラスで拡張したDaoMetaDataを
作成して使用しています。

中川様が挙げられたやり方に近い形で実装する場合、
IDataSouceを実装した以下のようなクラスを作成し、

<component name="DataSource" class="hoge.hogeImpl.DataSourceExtension">
  <property name="DataProvider">SqlClient</property>
  <property name="ConnectionString">hoge</property>
  <property name="CommandTimeOut">180</property>
</component>

とすれば、タイムアウト時間を設定できないでしょうか。
(実際に試したわけではないのでこのままだとうまく
いかない可能性もあります。。。)

public class DataSourceExtension : IDataSource
    {
        private DataSourceImpl _dataSouce;
        private int _commandTimeOut;

        public DataSourceExtension()
        {
            _dataSouce = new DataSourceImpl();
        }

        public DataSourceExtension(DataProvider provider, string
connectionString)
        {
            _dataSouce = new DataSourceImpl(provider, connectionString);
        }

        public int CommandTimeOut
        {
            set { _commandTimeOut = value; }
            get { return _commandTimeOut; }
        }

        public DataProvider DataProvider
        {
            set { _dataSouce.DataProvider = value; }
            get { return _dataSouce.DataProvider; }
        }

        public string ConnectionString
        {
            set { _dataSouce.ConnectionString = value; }
            get { return _dataSouce.ConnectionString; }
        }

        #region IDataSource メンバ

        public System.Data.IDbConnection GetConnection()
        {
            return _dataSouce.GetConnection();
        }

        public System.Data.IDbCommand GetCommand()
        {
            IDbCommand cmd = _dataSouce.GetCommand();
            cmd.CommandTimeout = this.CommandTimeout;
            return cmd;
        }

        public System.Data.IDbCommand GetCommand(string cmdText)
        {
            IDbCommand cmd = _dataSouce.GetCommand(cmdText);
            cmd.CommandTimeout = this.CommandTimeout;
            return cmd;
        }

        public System.Data.IDbCommand GetCommand(string cmdText,
System.Data.IDbConnection connection)
        {
            IDbCommand cmd = _dataSouce.GetCommand(cmdText, connection);
            cmd.CommandTimeout = this.CommandTimeout;
            return cmd;
        }

        public System.Data.IDbCommand GetCommand(string cmdText,
            System.Data.IDbConnection connection,
System.Data.IDbTransaction transaction)
        {
            IDbCommand cmd = _dataSouce.GetCommand(cmdText, connection,
transaction);
            cmd.CommandTimeout = this.CommandTimeout;
            return cmd;
        }

        public System.Data.IDataParameter GetParameter()
        {
            return _dataSouce.GetParameter();
        }

        public System.Data.IDataParameter GetParameter(string name,
System.Data.DbType dataType)
        {
            return _dataSouce.GetParameter(name, dataType);
        }

        public System.Data.IDataParameter GetParameter(string name,
object value)
        {
            return _dataSouce.GetParameter(name, value);
        }

        public System.Data.IDataParameter GetParameter(string name,
System.Data.DbType dataType, int size)
        {
            return _dataSouce.GetParameter(name, dataType, size);
        }

        public System.Data.IDataParameter GetParameter(string name,
System.Data.DbType dataType, int size, string srcColumn)
        {
            return _dataSouce.GetParameter(name, dataType, size, srcColumn);
        }

        public IDataAdapter GetDataAdapter()
        {
            return _dataSouce.GetDataAdapter();
        }

        public IDataAdapter GetDataAdapter(IDbCommand selectCommand)
        {
            return _dataSouce.GetDataAdapter(selectCommand);
        }

        public IDataAdapter GetDataAdapter(string selectCommandText,
string selectConnectionString)
        {
            return _dataSouce.GetDataAdapter(selectCommandText,
selectConnectionString);
        }

        public IDataAdapter GetDataAdapter(string selectCommandText,
IDbConnection selectConnection)
        {
            return _dataSouce.GetDataAdapter(selectCommandText,
selectConnection);
        }

        public virtual IDbTransaction GetTransaction()
        {
            return _dataSouce.GetTransaction();
        }

        #endregion
    }


seasar-dotnet メーリングリストの案内