- PR -

JDBCでコネクションが勝手にClose?

1
投稿者投稿内容
荒井
会議室デビュー日: 2005/06/21
投稿数: 8
投稿日時: 2005-07-08 17:17
JDBCのthinドライバを使用しOracle8.1.7と接続しています。
たまにJDBCのエラーが発生しどうやらconnectionやstatementがcloseされてしまう
ようです、プログラム内で明示的にCloseしているわけではありません
勝手にCloseされる原因としてどんなものがあげられますか?
教えてください。お願いします。

<エラー>
SQLException: SQLState(null) vendor code(17009)
java.sql.SQLException: ネ??ォ、ホハク、ヌ、ケ。」
at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:168)
at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:210)
at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:273)
at oracle.jdbc.driver.OracleStatement.ensureOpen(OracleStatement.java:4768)
at oracle.jdbc.driver.OracleStatement.execute(OracleStatement.java:726)
at common.DBManager.getRows(DBManager.java:402)
at _00039_00030._0002f_00039_00030_0002fOJJ_00039_00030_00030_00030_00031_0002ejspOJJ90001_jsp_0._jspService(_0002f_00039_00030_0002fOJJ_00039_00030_00030_00030_00031_0002ejspOJJ90001_jsp_0.java:957)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:119)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
at org.apache.jasper.servlet.JspServlet$JspCountedServlet.service(JspServlet.java:130)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
at org.apache.jasper.servlet.JspServlet$JspServletWrapper.service(JspServlet.java:282)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:429)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:500)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
at org.apache.tomcat.core.ServletWrapper.doService(ServletWrapper.java:405)
at org.apache.tomcat.core.Handler.service(Handler.java:287)
at org.apache.tomcat.core.ServletWrapper.service(ServletWrapper.java:372)
at org.apache.tomcat.core.ContextManager.internalService(ContextManager.java:812)
at org.apache.tomcat.core.ContextManager.service(ContextManager.java:758)
at org.apache.tomcat.service.connector.Ajp13ConnectionHandler.processConnection(Ajp13ConnectionHandler.java:160)
at org.apache.tomcat.service.TcpWorkerThread.runIt(PoolTcpEndpoint.java:416)
at org.apache.tomcat.util.ThreadPool$ControlRunnable.run(ThreadPool.java:501)
at java.lang.Thread.run(Thread.java:536)




SQLException: SQLState(null) vendor code(17008)
java.sql.SQLException: ネ??ォ、ホタワツウ、ヌ、ケ。」: next
at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:168)
at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:210)
at oracle.jdbc.dbaccess.DBError.check_error(DBError.java:829)
at oracle.jdbc.driver.OracleResultSetImpl.next(OracleResultSetImpl.java:185)
at _00039_00030._0002f_00039_00030_0002fOJJ_00039_00030_00030_00030_00031_0002ejspOJJ90001_jsp_0._jspService(_0002f_00039_00030_0002fOJJ_00039_00030_00030_00030_00031_0002ejspOJJ90001_jsp_0.java:919)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:119)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
at org.apache.jasper.servlet.JspServlet$JspCountedServlet.service(JspServlet.java:130)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
at org.apache.jasper.servlet.JspServlet$JspServletWrapper.service(JspServlet.java:282)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:429)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:500)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
at org.apache.tomcat.core.ServletWrapper.doService(ServletWrapper.java:405)
at org.apache.tomcat.core.Handler.service(Handler.java:287)
at org.apache.tomcat.core.ServletWrapper.service(ServletWrapper.java:372)
at org.apache.tomcat.core.ContextManager.internalService(ContextManager.java:812)
at org.apache.tomcat.core.ContextManager.service(ContextManager.java:758)
at org.apache.tomcat.service.connector.Ajp13ConnectionHandler.processConnection(Ajp13ConnectionHandler.java:160)
at org.apache.tomcat.service.TcpWorkerThread.runIt(PoolTcpEndpoint.java:416)
at org.apache.tomcat.util.ThreadPool$ControlRunnable.run(ThreadPool.java:501)
at java.lang.Thread.run(Thread.java:536)





masa
大ベテラン
会議室デビュー日: 2005/05/11
投稿数: 108
投稿日時: 2005-07-08 17:33
引用:

荒井さんの書き込み (2005-07-08 17:17) より:
勝手にCloseされる原因としてどんなものがあげられますか?



マルチスレッドでのバグが原因だったなどの話はよくみかけます。
そのあたりは問題ないですか?

rockman
会議室デビュー日: 2004/11/12
投稿数: 7
投稿日時: 2005-07-23 01:16
初めて書き込みします。

別のものを調べていてぶつかったもので…
ついでに回答します。(ずいぶん昔のようですが…)

Javaも他の言語にもれず、オブジェクト(Java的にはインスタンス)は、
参照回しを行います。その為、以下のようにお互いを参照しあっている、
オブジェクトのうち、大元がクローズされた場合、参照元も、
クローズされてしまっているのではないでしょうか?

Socket→Connection→Statement→X→ResultSet
(ResultSetは参照関係にないかもしれませんが…)

このとき、Connectionクラスでは意図していないでしょうが、
Socketが単にクローズしてしまっていても、
同様のことが起きるかもしれません。
(どこでThrowされているかもわからないのであくまで仮定ですが)

内部的に、Connectionがnullになったので、
それに依存するクラス内部でも、try{}catch{}finally{socket.close();}
とでも発行されているのかもしれません。

Socketエラーから順にたどってみてはいかがでしょうか?

ちなみに明示的にCloseしないのは、確かJDBCの
規約に反すると思いますので、
必ず発行はしなければならないと思います。

いじょ
yuk@lavans
会議室デビュー日: 2005/07/26
投稿数: 5
投稿日時: 2005-07-26 21:21
タイムアウトなどで切断されます。そしてisClose()では
切断されたかどうか判断できません。実際にsqlを投げるまでは
わからないのです。

だからコネクションプールユーティリティなんかでは
"select 1 from dual"を投げて失敗した場合は再接続してから
コネクション返す、みたいな実装になってるでしょ。
1

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