- PR -

postgresSQLからのエラーについて

1
投稿者投稿内容
オオサカ
常連さん
会議室デビュー日: 2003/07/02
投稿数: 49
投稿日時: 2007-01-05 19:24
お世話になっております。
いろいろWEBで調べたのですが検討がつかず困っております。

postgreSQLデータベースにPHPよりデータをinsertを実行した際に
could not send data to server: No buffer space available (0x00002747/10055)
というエラーが発生してinsertを実行することができません。

$rs = @pg_query( $this->conn, $this->sql );
//クエリー実行
if ( $rs === false ) {
print(pg_last_error($this->conn));
return false;
}
でprint文で上記エラーが発生します。

おそらくInsertしようとしているbyteaの列に50MBほどのデータをインサートしようと
しているのでSQL文が長くて、バッファーが足りないといっているのではないかと
推測しまして、
postgresql.confの中で
shared_buffers を 800MBにしても状況は変わりませんでした。

OSはWindows2003です。
LinuxSquareなのですがpostgreSQL,PHP関係でしたので
ここに書かせていただきました。

ご助言よろしくおねがいします。

99ri
大ベテラン
会議室デビュー日: 2006/09/09
投稿数: 129
投稿日時: 2007-01-05 22:46
could not send data to server: No buffer space available (0x00002747/10055)
上記 WindowsのTCP/IP関係エラーコードです 

通常はエラーが発生せず、このデータだけエラーなのでしょうか?

5000 を超える番号の TCP ポートから接続しようとすると
'WSAENOBUFS (10055)' エラーが表示される
http://support.microsoft.com/kb/196271/ja
上記とwinsockバッファ関係を指摘
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=31975&forum=11&6

http://archives.postgresql.org/pgsql-bugs/2006-07/msg00051.php

[ メッセージ編集済み 編集者: 99ri 編集日時 2007-01-06 10:04 ]
オオサカ
常連さん
会議室デビュー日: 2003/07/02
投稿数: 49
投稿日時: 2007-01-09 10:39
ご回答ありがとうございます。

いただきました内容で
DWORD値をレジストリに追加しました
値の名前:MaxUserPort
値のデータ:65534
がエラーは回避できませんでした。

10MBまでは正常にインサートできるのですが
20MBになるとNo buffer space availableのエラーが発生します。

他になにか考慮する点などありますでしょうか?
またbyteaではなくlargeobjectを使用するべきなのでしょうか?

よろしくお願いします。
あしゅ
ぬし
会議室デビュー日: 2005/08/05
投稿数: 613
投稿日時: 2007-01-09 10:53
引用:

オオタさんの書き込み (2007-01-09 10:39) より:
10MBまでは正常にインサートできるのですが
20MBになるとNo buffer space availableのエラーが発生します。

他になにか考慮する点などありますでしょうか?
またbyteaではなくlargeobjectを使用するべきなのでしょうか?



byteaはその名の通りbyte arrayです。
メモリ上に確保されるため容量制限が非常に厳しいです。
サーバー/クライアント共に多量のメモリを必要とします。

パフォーマンスの点からも64KB〜1MB程度を上限とすべきでしょう。

#結構前に比較的大きめな結果セットの取得にメモリ不足で失敗したため、
#libpqのソースを眺めて見たのですが、二次元配列的に扱っていて驚きました。
#現在の実装は知りませんが、PostgreSQLはこの辺りは弱そうに思います。
オオサカ
常連さん
会議室デビュー日: 2003/07/02
投稿数: 49
投稿日時: 2007-01-09 11:14
ご回答ありがとうございます。

今回の仕組みはWEBからアップロードしたエクセルファイルを
PostgreSQLのbyteaの列にインサートするものです。

やはり、エクセルファイルはディスク上に保存しておき、
postgreSQLへはそのファイルへのパスを登録しておいたほうが
よいということでしょうか。

よろしくお願いします。
99ri
大ベテラン
会議室デビュー日: 2006/09/09
投稿数: 129
投稿日時: 2007-01-09 12:07
ポート番号に由来するエラーではないため
OSのリソース(メモリ)でエラーとなっていると思われます

ご自身で書かれていますが直接DBに登録しない方式がよいと思います
オオサカ
常連さん
会議室デビュー日: 2003/07/02
投稿数: 49
投稿日時: 2007-01-09 13:05
ありがとうございました。

頂きました方法で対処したいと思います。

よろしくお願いします。
1

スキルアップ/キャリアアップ(JOB@IT)