3

AWS でホストされている CentOS 6.5 ボックスで発生する、Windows マシンでは発生しない奇妙な問題に遭遇しました。

大きな dbSendQuery (15,000 バイト/文字以上の文字列) を送信すると、エラー メッセージが表示されます。より小さなクエリでは、問題なく実行されます。

最初は、Postgres のインストールに問題があると思ったので、9.4 に更新しましたが、RPostgreSQL でも同じエラーが発生しました。次に考えたのは、これは SSL の問題であるということでした。そのため、sslmode=disable フラグを指定して RJDBC を試しましたが、これもうまくいきませんでした。

これは、RPostgreSQL のエラー メッセージです。

> library(RPostgreSQL)
Loading required package: DBI
> rsdrv <- dbDriver("PostgreSQL")
> rscon <- dbConnect(rsdrv, dbname="dbname",host="redshift.connection.string",port=5439,user="username",password="password")
> dbSendQuery(rscon,query)
Error in postgresqlExecStatement(conn, statement, ...) : RS-DBI driver: (SSL SYSCALL error: Connection timed out)

これは RJDBC のエラーです。

> library(RJDBC)
> pgsql <- JDBC("org.postgresql.Driver", "/postgresql-9.3-1102.jdbc41.jar", "`")
> con <- dbConnect(pgsql, "jdbc:postgresql://redshift.connection.string:5439/dev?sslmode=disable", "username", "password")
> dbSendQuery(con,query)
Error in .jcall(s, "Ljava/sql/ResultSet;", "executeQuery", as.character(statement)[1],  :  ignoring SIGPIPE signal

ここに私の CentOS 6.5 の sessioninfo() があります

> sessionInfo()
R version 3.1.2 (2014-10-31)
Platform: x86_64-redhat-linux-gnu (64-bit)

locale:
[1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C
[3] LC_TIME=en_US.UTF-8        LC_COLLATE=en_US.UTF-8
[5] LC_MONETARY=en_US.UTF-8    LC_MESSAGES=en_US.UTF-8
[7] LC_PAPER=en_US.UTF-8       LC_NAME=C
[9] LC_ADDRESS=C               LC_TELEPHONE=C
[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base

other attached packages:
[1] RPostgreSQL_0.4 DBI_0.3.1

Windows 7 での sessionInfo() は次のとおりです。

> sessionInfo()
R version 3.1.2 (2014-10-31)
Platform: x86_64-w64-mingw32/x64 (64-bit)

locale:
[1] LC_COLLATE=English_United States.1252  LC_CTYPE=English_United States.1252    LC_MONETARY=English_United States.1252
[4] LC_NUMERIC=C                           LC_TIME=English_United States.1252    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] RPostgreSQL_0.4 DBI_0.3.1      

loaded via a namespace (and not attached):
[1] tools_3.1.2

これらのエラーの原因となるサンプル dbSendQuery() クエリを添付しますが、15,000 文字であるため、これが良いアイデアかどうかはわかりません。これの使用例は、私の場合は 500++ 列の CREATE TABLE ステートメントを自動生成することです。私の Windows マシンでは、クエリが 0.5 秒で送信され、Redshift 側ではほぼ瞬時にテーブルが作成されるため、クエリに時間がかかりすぎる (そしてタイムアウトになる..?) という問題はありません。

ありがとう!

4

1 に答える 1