ITは芸術だ このページをアンテナに追加 RSSフィード Twitter

2012-02-19

SQL Serverに.NETで接続しようとすると1.2秒でタイムアウトする場合がある

ちょっと前に発生していたトラブルの情報共有です。


検証用にリリースした社内アプリケーションが頻繁にタイムアウトエラーを起こすというトラブルが先日発生しました。

.NETから社内のSQL Serverに接続していたのですが、デフォルトのタイムアウト秒数は15秒なので、さすがに15秒も接続できないということはないだろうと首を傾げていました。

念のためクライアントマシンのスペックやエラー発生時のDBの負荷等を確認したものの、これといった要因は見つかりませんでした。


仕方が無いのでGoogleであれこれキーワードを変えながら検索していると、以下のトピックを見つけました。


You get ”Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding” error when connecting to a mirrored database


この記事によると、.NETのSqlClientからミラーリングされたSQL Serverに接続しようとすると、わずか1.2秒でタイムアウトする場合があるそうです。

原因はどうやら接続再試行アルゴリズムの不具合だそうです。

修正の予定はあるそうですが、今のところ修正プログラムは配布されていないようです。


MSのWebサイトには「DBやネットワークのパフォーマンスを上げろ」という解決策が載っていますが、コストをかけずにすぐ実現できる話ではありません。

なので、現実的な回避策はタイムアウト秒数を上げることになります。


実は1.2秒という数字は15秒×0.08で算出された秒数です。

そこでたとえばタイムアウト秒数を10倍の150秒にすると、タイムアウト秒数も12秒に伸びます。

こちらもあまりスマートな解決策ではありませんが、現状では仕方がないかもしれません。

ちなみに接続文字列でタイムアウト秒数を変更する方法はこちらに載っています。


SqlConnection.ConnectionTimeout プロパティ (System.Data.SqlClient)


この回避策を実施してからはタイムアウトエラーが発生しなくなったので、やはり原因と対策はこれで間違いなかったものと思われます。


.NETアプリケーションからミラーリングされたSQL Serverに接続する場合は、こうした問題に気をつけてください。

以上、ご参考までに。

2012-02-05

Vimと正規表現でRubyのハッシュを新しい構文に一括置換する

Rubyのサンプルコードをネットから拾ってきたりすると、ハッシュの構文が新旧入り乱れて一貫性がなくなったりします。


#古い構文
some_method :hoge => "abc"

#新しい構文
some_method hoge: "abc"

一貫性のないコードは美しくないので、正規表現を使って一括置換しちゃいましょう。

下はVim用の置換コマンドです。


:%s/:\(\w\+\) =>/\1:/g

正規表現なので基本的な考え方は他のエディタでも使えます。

また、対象のコードによっては上の正規表現がうまくマッチしない場合もあると思いますので、その際は自分でうまくアレンジしてみてください。


追伸、

テストでちゃんとコードを保護してから、一括置換を実行しましょう。


追伸2、

ついでにメソッド呼び出し時のカッコを外すVimコマンドも載せておきます。

ただし、外すとうまく動かない場合もあります、。

また、カッコがネストしているとうまく置換できないので、毎回置換するかどうか確認しながら進めた方がベターです。

#before
some_method("abc", "def")
#after
some_method "abc", "def"
:%s/(\([^)]\+\))/ \1/gc

追伸3、

こちらはシングルクオートの文字列をダブルクオートに置き換える場合です。

ただし、厳密なチェックはしていないので「"this is 'hoge'"」のような文字列も置換しようとします。

置換する際は確認しながら進めてください。

#before
some_method 'abc', 'def'
#after
some_method "abc", "def"
:%s/'\([^']\+\)'/"\1"/gc

2012-01-19

ソーシャルな評価とモチベーション

たとえばTwitterにおける、自分のツイートに対するリツイートやお気に入り登録(Favorites)。


たとえばはてなダイアリーにおける、はてなスターやはてなブックマーク。


たとえばStack Overflowにおける、評価ポイント(Reputation)。



人間ってやっぱり他人に評価されるとうれしいし、モチベーションも上がります。


一方、評価している側はそれほど深く考えなくても、ボタン一つで手軽にアクションを起こせます。



・・・あ、もしかして社内のモチベーション向上の鍵も実はこういうところにあるんじゃない?


と、ふと思いました。


巷でよく見かける、半年、ないしは一年ごとの目標設定とそれに対する上司の評価なんてモノは、冒頭に挙げたツールの対極にあるものです。


だから上司の評価とは別に、


  • 同僚や他部署の人でも評価できる
  • 評価する側はいつでも簡単なアクションで評価を通知できる
  • ネガティブな評価ではなく、ポジティブな評価として受け取りやすいコンセプトにする
  • いつでも手軽に数値化および視覚化された評価を確認できるようにする

こうした仕組みを会社の中に確立できれば、きっとモチベーションも上がって楽しく仕事ができるはずです。


じゃあどうやって?


・・・それは今後の宿題です。誰かいい事例を知っていたら教えてください!


あわせて読みたい

Stack Overflowをよく知らない方はこちらのエントリをどうぞ。

Stack Overflowで世界を相手に腕試し - ITは芸術だ