- - PR -
JDBCでコネクションが勝手にClose?
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 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) | ||||
|
投稿日時: 2005-07-08 17:33
マルチスレッドでのバグが原因だったなどの話はよくみかけます。 そのあたりは問題ないですか? | ||||
|
投稿日時: 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の 規約に反すると思いますので、 必ず発行はしなければならないと思います。 いじょ | ||||
|
投稿日時: 2005-07-26 21:21
タイムアウトなどで切断されます。そしてisClose()では
切断されたかどうか判断できません。実際にsqlを投げるまでは わからないのです。 だからコネクションプールユーティリティなんかでは "select 1 from dual"を投げて失敗した場合は再接続してから コネクション返す、みたいな実装になってるでしょ。 |
1