SQLException (connection reset) from JDBC PersistenceManager
terol Sep 7, 2004 7:43 AMHi,
I am using a JMS topic to notify subscribing clients of changes performed on data. I am using ObjectMessages that may contain potentially large collections of serializable transfer objects. After running the application for a while I get the following exception on the JBoss console:
13:33:43,051 INFO [STDOUT] Caused by: org.jboss.mq.SpyJMSException: Could not store message: 127 msg=66 hard NOT_STORED NON_PERSISTENT queue=TOPIC.projectChangeTopic.ID:87.-2147483648 priority=4 lateClone=false hashCode=31425461; - nested throwable: (java.sql.SQLException: Io exception: Connection reset)
13:33:43,051 INFO [STDOUT] at org.jboss.mq.pm.jdbc2.PersistenceManager.saveToStorage(PersistenceManager.java:1225)
13:33:43,052 INFO [STDOUT] at org.jboss.mq.server.MessageCache.saveToStorage(MessageCache.java:385)
13:33:43,052 INFO [STDOUT] at org.jboss.mq.server.MessageReference.makeSoft(MessageReference.java:311)
13:33:43,052 INFO [STDOUT] at org.jboss.mq.server.MessageCache.validateSoftReferenceDepth(MessageCache.java:332)
13:33:43,052 INFO [STDOUT] at org.jboss.mq.server.MessageCache.addInternal(MessageCache.java:142)
13:33:43,052 INFO [STDOUT] at org.jboss.mq.server.MessageCache.add(MessageCache.java:112)
13:33:43,052 INFO [STDOUT] at org.jboss.mq.server.JMSTopic.addMessage(JMSTopic.java:357)
13:33:43,052 INFO [STDOUT] at org.jboss.mq.server.JMSDestinationManager.addMessage(JMSDestinationManager.java:402)
13:33:43,052 INFO [STDOUT] at org.jboss.mq.server.JMSDestinationManager.addMessage(JMSDestinationManager.java:378)
13:33:43,053 INFO [STDOUT] at org.jboss.mq.server.JMSServerInterceptorSupport.addMessage(JMSServerInterceptorSupport.java:136)
13:33:43,053 INFO [STDOUT] at org.jboss.mq.security.ServerSecurityInterceptor.addMessage(ServerSecurityInterceptor.java:153)
13:33:43,053 INFO [STDOUT] at org.jboss.mq.server.TracingInterceptor.addMessage(TracingInterceptor.java:270)
13:33:43,053 INFO [STDOUT] at org.jboss.mq.server.JMSServerInvoker.addMessage(JMSServerInvoker.java:136)
13:33:43,053 INFO [STDOUT] at org.jboss.mq.il.uil2.ServerSocketManagerHandler.handleMsg(ServerSocketManagerHandler.java:86)
13:33:43,053 INFO [STDOUT] at org.jboss.mq.il.uil2.SocketManager$ReadTask.handleMsg(SocketManager.java:356)
13:33:43,054 INFO [STDOUT] at org.jboss.mq.il.uil2.msgs.BaseMsg.run(BaseMsg.java:377)
13:33:43,054 INFO [STDOUT] at EDU.oswego.cs.dl.util.concurrent.PooledExecutor$Worker.run(PooledExecutor.java:748)
13:33:43,054 INFO [STDOUT] ... 1 more
13:33:43,054 INFO [STDOUT] Caused by: java.sql.SQLException: Io exception: Connection reset
13:33:43,054 INFO [STDOUT] at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:134)
13:33:43,054 INFO [STDOUT] at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:179)
13:33:43,054 INFO [STDOUT] at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:333)
13:33:43,055 INFO [STDOUT] at oracle.jdbc.driver.OracleStatement.executeNonQuery(OracleStatement.java:2061)
13:33:43,055 INFO [STDOUT] at oracle.jdbc.driver.OracleStatement.doExecuteOther(OracleStatement.java:1940)
13:33:43,055 INFO [STDOUT] at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:2709)
13:33:43,055 INFO [STDOUT] at oracle.jdbc.driver.OraclePreparedStatement.executeUpdate(OraclePreparedStatement.java:589)
13:33:43,055 INFO [STDOUT] at org.jboss.resource.adapter.jdbc.CachedPreparedStatement.executeUpdate(CachedPreparedStatement.java:56)
13:33:43,055 INFO [STDOUT] at org.jboss.resource.adapter.jdbc.WrappedPreparedStatement.executeUpdate(WrappedPreparedStatement.java:335)
13:33:43,055 INFO [STDOUT] at org.jboss.mq.pm.jdbc2.PersistenceManager.add(PersistenceManager.java:783)
13:33:43,056 INFO [STDOUT] at org.jboss.mq.pm.jdbc2.PersistenceManager.saveToStorage(PersistenceManager.java:1211)
13:33:43,056 INFO [STDOUT] ... 17 more
The version of JBoss I use is 3.2.5. Restarting JBoss seems to help, but usually the problem returns after running a while. It might be that the bug occurs more easily when the messages sent are large. We are using Oracle database as a storage for the JDBC persistence manager. The configuration file for the persistence manager is attached below.
<?xml version="1.0" encoding="UTF-8"?>
<!-- $Id: oracle-jdbc2-service.xml,v 1.1 2004/08/18 13:41:18 kimmo Exp $ -->
<!-- ==================================================================== -->
<!-- Persistence and caching using Oracle -->
<!-- IMPORTANT: Remove hsqldb-jdbc2-service.xml -->
<!-- ==================================================================== -->
<!--
| The destination manager is the core service within JBossMQ
-->
<depends optional-attribute-name="MessageCache">jboss.mq:service=MessageCache
<depends optional-attribute-name="PersistenceManager">jboss.mq:service=PersistenceManager
<depends optional-attribute-name="StateManager">jboss.mq:service=StateManager
<!--
| The MessageCache decides where to put JBossMQ message that
| are sitting around waiting to be consumed by a client.
|
| The memory marks are in Megabytes. Once the JVM memory usage hits
| the high memory mark, the old messages in the cache will start getting
| stored in the DataDirectory. As memory usage gets closer to the
| Max memory mark, the amount of message kept in the memory cache aproaches 0.
-->
50
60
jboss.mq:service=PersistenceManager
<!-- The PersistenceManager is used to store messages to disk. -->
<!--
| The jdbc2 PersistenceManager is the new improved JDBC implementation.
| This implementation allows you to control how messages are stored in
| the database.
|
| This jdbc2 PM configuration has been tested against Oracle
-->
<depends optional-attribute-name="ConnectionManager">jboss.jca:service=LocalTxCM,name=testDB
BLOB_TYPE=BINARYSTREAM_BLOB
INSERT_TX = INSERT INTO JMS_TRANSACTIONS (TXID) values(?)
INSERT_MESSAGE = INSERT INTO JMS_MESSAGES (MESSAGEID, DESTINATION, MESSAGEBLOB, TXID, TXOP) VALUES(?,?,?,?,?)
SELECT_ALL_UNCOMMITED_TXS = SELECT TXID FROM JMS_TRANSACTIONS
SELECT_MAX_TX = SELECT MAX(TXID) FROM JMS_MESSAGES
SELECT_MESSAGES_IN_DEST = SELECT MESSAGEID, MESSAGEBLOB FROM JMS_MESSAGES WHERE DESTINATION=?
SELECT_MESSAGE = SELECT MESSAGEID, MESSAGEBLOB FROM JMS_MESSAGES WHERE MESSAGEID=? AND DESTINATION=?
MARK_MESSAGE = UPDATE JMS_MESSAGES SET TXID=?, TXOP=? WHERE MESSAGEID=? AND DESTINATION=?
UPDATE_MESSAGE = UPDATE JMS_MESSAGES SET MESSAGEBLOB=? WHERE MESSAGEID=? AND DESTINATION=?
UPDATE_MARKED_MESSAGES = UPDATE JMS_MESSAGES SET TXID=?, TXOP=? WHERE TXOP=?
UPDATE_MARKED_MESSAGES_WITH_TX = UPDATE JMS_MESSAGES SET TXID=?, TXOP=? WHERE TXOP=? AND TXID=?
DELETE_MARKED_MESSAGES_WITH_TX = DELETE FROM JMS_MESSAGES WHERE TXID IN (SELECT TXID FROM JMS_TRANSACTIONS) AND TXOP=?
DELETE_TX = DELETE FROM JMS_TRANSACTIONS WHERE TXID = ?
DELETE_MARKED_MESSAGES = DELETE FROM JMS_MESSAGES WHERE TXID=? AND TXOP=?
DELETE_TEMPORARY_MESSAGES = DELETE FROM JMS_MESSAGES WHERE TXOP='T'
DELETE_MESSAGE = DELETE FROM JMS_MESSAGES WHERE MESSAGEID=? AND DESTINATION=?
CREATE_MESSAGE_TABLE = CREATE TABLE JMS_MESSAGES ( MESSAGEID INTEGER NOT NULL, \
DESTINATION VARCHAR(255) NOT NULL, TXID INTEGER, TXOP CHAR(1), \
MESSAGEBLOB BLOB, PRIMARY KEY (MESSAGEID, DESTINATION) )
CREATE_TX_TABLE = CREATE TABLE JMS_TRANSACTIONS ( TXID INTEGER )
CREATE_TABLES_ON_STARTUP = TRUE
Can anyone help?
Regards,
Tero