Statements s=new Statements(); s.setTablePrefix("ACTIVEMQ."); String[] stats=s.getCreateSchemaStatements(); System.out.println("<bean id=\"statements\" class=\"org.apache.activemq.store.jdbc.Statements\">"); System.out.println("<property name=\"createSchemaStatements\">"); String[] statsDrop=s.getDropSchemaStatements(); System.out.println("<property name=\"dropSchemaStatements\">"); System.out.println("<list>");
@Override public void doAddMessage(TransactionContext c, long sequence, MessageId messageID, ActiveMQDestination destination, byte[] data, long expiration, byte priority, XATransactionId xid) throws SQLException, IOException { PreparedStatement s = null; try { // Add the Blob record. s = c.getConnection().prepareStatement(statements.getAddMessageStatement()); s.setLong(1, sequence); s.setString(2, messageID.getProducerId().toString()); s.setLong(3, messageID.getProducerSequenceId()); s.setString(4, destination.getQualifiedName()); s.setLong(5, expiration); s.setLong(6, priority); if (s.executeUpdate() != 1) { throw new IOException("Failed to add broker message: " + messageID + " in container."); } s.close(); // Select the blob record so that we can update it. updateBlob(c.getConnection(), statements.getFindMessageByIdStatement(), sequence, data); if (xid != null) { byte[] xidVal = xid.getEncodedXidBytes(); xidVal[0] = '+'; updateBlob(c.getConnection(), statements.getFindXidByIdStatement(), sequence, xidVal); } } finally { close(s); } }
"CREATE TABLE " + statements.getFullMessageTableName() + "(" + "ID " + statements.getSequenceDataType() + " NOT NULL" + ", CONTAINER " + statements.getContainerNameDataType() + ", MSGID_PROD " + statements.getMsgIdDataType() + ", MSGID_SEQ " + statements.getSequenceDataType() + ", EXPIRATION " + statements.getLongDataType() + ", MSG " + (statements.isUseExternalMessageReferences() ? statements.getStringIdDataType() : statements.getBinaryDataType()) + ", PRIMARY KEY ( ID ) )", "CREATE INDEX " + statements.getFullMessageTableName() + "_MIDX ON " + statements.getFullMessageTableName() + " (MSGID_PROD,MSGID_SEQ)", "CREATE INDEX " + statements.getFullMessageTableName() + "_CIDX ON " + statements.getFullMessageTableName() + " (CONTAINER)", "CREATE INDEX " + statements.getFullMessageTableName() + "_EIDX ON " + statements.getFullMessageTableName() + " (EXPIRATION)", "CREATE TABLE " + statements.getFullAckTableName() + "(" + "CONTAINER " + statements.getContainerNameDataType() + " NOT NULL" + ", SUB_DEST " + statements.getContainerNameDataType() + ", CLIENT_ID " + statements.getStringIdDataType() + " NOT NULL" + ", SUB_NAME " + statements.getStringIdDataType() + " NOT NULL" + ", SELECTOR " + statements.getStringIdDataType() + ", LAST_ACKED_ID " + statements.getSequenceDataType() + ", PRIMARY KEY ( CONTAINER, CLIENT_ID, SUB_NAME))" }; statements.setCreateSchemaStatements(createStatements); statements.setLongDataType("LONG"); statements.setSequenceDataType("LONG");
public String[] getCreateSchemaStatements() { if (createSchemaStatements == null) { createSchemaStatements = new String[] { "CREATE TABLE " + getFullMessageTableName() + "(" + "ID " + sequenceDataType + " NOT NULL" + ", CONTAINER " + containerNameDataType + " NOT NULL, MSGID_PROD " + msgIdDataType + ", MSGID_SEQ " + sequenceDataType + ", EXPIRATION " + longDataType + ", MSG " + (useExternalMessageReferences ? stringIdDataType : binaryDataType) + ", PRIMARY KEY ( ID ) )", "CREATE INDEX " + getFullMessageTableName() + "_MIDX ON " + getFullMessageTableName() + " (MSGID_PROD,MSGID_SEQ)", "CREATE INDEX " + getFullMessageTableName() + "_CIDX ON " + getFullMessageTableName() + " (CONTAINER)", "CREATE INDEX " + getFullMessageTableName() + "_EIDX ON " + getFullMessageTableName() + " (EXPIRATION)", "CREATE TABLE " + getFullAckTableName() + "(" + "CONTAINER " + containerNameDataType + " NOT NULL" + ", SUB_DEST " + stringIdDataType + ", CLIENT_ID " + stringIdDataType + " NOT NULL" + ", SUB_NAME " + stringIdDataType + " NOT NULL" + ", SELECTOR " + stringIdDataType + ", LAST_ACKED_ID " + sequenceDataType + ", PRIMARY KEY ( CONTAINER, CLIENT_ID, SUB_NAME))", "ALTER TABLE " + getFullMessageTableName() + " ADD PRIORITY " + sequenceDataType, "CREATE INDEX " + getFullMessageTableName() + "_PIDX ON " + getFullMessageTableName() + " (PRIORITY)", "ALTER TABLE " + getFullMessageTableName() + " ADD XID " + stringIdDataType, "ALTER TABLE " + getFullAckTableName() + " ADD PRIORITY " + sequenceDataType + " DEFAULT 5 NOT NULL", "ALTER TABLE " + getFullAckTableName() + " ADD XID " + stringIdDataType, "ALTER TABLE " + getFullAckTableName() + " " + getDropAckPKAlterStatementEnd(), "ALTER TABLE " + getFullAckTableName() + " ADD PRIMARY KEY (CONTAINER, CLIENT_ID, SUB_NAME, PRIORITY)", "CREATE INDEX " + getFullMessageTableName() + "_XIDX ON " + getFullMessageTableName() + " (XID)", "CREATE INDEX " + getFullAckTableName() + "_XIDX ON " + getFullAckTableName() + " (XID)" }; getCreateLockSchemaStatements(); String[] allCreateStatements = new String[createSchemaStatements.length + createLockSchemaStatements.length]; System.arraycopy(createSchemaStatements, 0, allCreateStatements, 0, createSchemaStatements.length);
if( !type.equals(INNODB) && !type.equals(NDBCLUSTER) ) { statements.setLockCreateStatement("LOCK TABLE " + statements.getFullLockTableName() + " WRITE"); statements.setBinaryDataType("LONGBLOB"); String[] s = statements.getCreateSchemaStatements(); for (int i = 0; i < s.length; i++) { if( s[i].startsWith("CREATE TABLE")) { l.add("ALTER TABLE "+statements.getFullMessageTableName()+" ENGINE="+NDBCLUSTER); l.add("ALTER TABLE "+statements.getFullAckTableName()+" ENGINE="+NDBCLUSTER); l.add("ALTER TABLE "+statements.getFullLockTableName()+" ENGINE="+NDBCLUSTER); l.add("FLUSH TABLES"); s = l.toArray(new String[l.size()]); statements.setCreateSchemaStatements(s);
long lastMessageId = -1; if (!retroactive) { s = c.getConnection().prepareStatement(this.statements.getFindLastSequenceIdInMsgsStatement()); ResultSet rs = null; try { s = c.getConnection().prepareStatement(this.statements.getCreateDurableSubStatement()); int maxPriority = 1; if (isPrioritizedMessages) {
s = c.prepareStatement(statements.getAddMessageStatement()); s.setLong(1, seq); s.setString(2, destinationName); s = c.prepareStatement(statements.getFindMessageStatement()); s.setLong(1, seq); rs = s.executeQuery(); s = c.prepareStatement(statements.getUpdateMessageStatement()); s.setBlob(1, blob); s.setLong(2, seq);
@Override public void doAddMessageReference(TransactionContext c, long sequence, MessageId messageID, ActiveMQDestination destination, long expirationTime, String messageRef) throws SQLException, IOException { PreparedStatement s = c.getAddMessageStatement(); try { if (s == null) { s = c.getConnection().prepareStatement(this.statements.getAddMessageStatement()); if (this.batchStatements) { c.setAddMessageStatement(s); } } s.setLong(1, messageID.getBrokerSequenceId()); s.setString(2, messageID.getProducerId().toString()); s.setLong(3, messageID.getProducerSequenceId()); s.setString(4, destination.getQualifiedName()); s.setLong(5, expirationTime); s.setString(6, messageRef); if (this.batchStatements) { s.addBatch(); } else if (s.executeUpdate() != 1) { throw new SQLException("Failed add a message"); } } finally { if (!this.batchStatements) { s.close(); } } }
public Statements getStatements() { if (statements == null) { statements = new Statements(); } return statements; }
public String[] getCreateSchemaStatements() { if (createSchemaStatements == null) { createSchemaStatements = new String[] { "CREATE TABLE " + getFullMessageTableName() + "(" + "ID " + sequenceDataType + " NOT NULL" + ", CONTAINER " + containerNameDataType + ", MSGID_PROD " + msgIdDataType + ", MSGID_SEQ " + sequenceDataType + ", EXPIRATION " + longDataType + ", MSG " + (useExternalMessageReferences ? stringIdDataType : binaryDataType) + ", PRIMARY KEY ( ID ) )", "CREATE INDEX " + getFullMessageTableName() + "_MIDX ON " + getFullMessageTableName() + " (MSGID_PROD,MSGID_SEQ)", "CREATE INDEX " + getFullMessageTableName() + "_CIDX ON " + getFullMessageTableName() + " (CONTAINER)", "CREATE INDEX " + getFullMessageTableName() + "_EIDX ON " + getFullMessageTableName() + " (EXPIRATION)", "CREATE TABLE " + getFullAckTableName() + "(" + "CONTAINER " + containerNameDataType + " NOT NULL" + ", SUB_DEST " + stringIdDataType + ", CLIENT_ID " + stringIdDataType + " NOT NULL" + ", SUB_NAME " + stringIdDataType + " NOT NULL" + ", SELECTOR " + stringIdDataType + ", LAST_ACKED_ID " + sequenceDataType + ", PRIMARY KEY ( CONTAINER, CLIENT_ID, SUB_NAME))", "CREATE TABLE " + getFullLockTableName() + "( ID " + longDataType + " NOT NULL, TIME " + longDataType + ", BROKER_NAME " + stringIdDataType + ", PRIMARY KEY (ID) )", "INSERT INTO " + getFullLockTableName() + "(ID) VALUES (1)", "ALTER TABLE " + getFullMessageTableName() + " ADD PRIORITY " + sequenceDataType, "CREATE INDEX " + getFullMessageTableName() + "_PIDX ON " + getFullMessageTableName() + " (PRIORITY)", "ALTER TABLE " + getFullAckTableName() + " ADD PRIORITY " + sequenceDataType + " DEFAULT 5 NOT NULL", "ALTER TABLE " + getFullAckTableName() + " " + getDropAckPKAlterStatementEnd(), "ALTER TABLE " + getFullAckTableName() + " ADD PRIMARY KEY (CONTAINER, CLIENT_ID, SUB_NAME, PRIORITY)", }; } return createSchemaStatements; }
ResultSet rs = null; try { rs = c.getConnection().getMetaData().getTables(null, null, this.statements.getFullMessageTableName(), new String[] { "TABLE" }); alreadyExists = rs.next(); String[] createStatments = this.statements.getCreateSchemaStatements(); for (int i = 0; i < createStatments.length; i++) {
@Override public void doDeleteSubscription(TransactionContext c, ActiveMQDestination destination, String clientId, String subscriptionName) throws SQLException, IOException { PreparedStatement s = null; try { s = c.getConnection().prepareStatement(this.statements.getDeleteSubscriptionStatement()); s.setString(1, destination.getQualifiedName()); s.setString(2, clientId); s.setString(3, subscriptionName); s.executeUpdate(); } finally { close(s); } }
@Override public int doGetMessageCount(TransactionContext c, ActiveMQDestination destination) throws SQLException, IOException { PreparedStatement s = null; ResultSet rs = null; int result = 0; try { s = c.getConnection().prepareStatement(this.statements.getDestinationMessageCountStatement()); s.setString(1, destination.getQualifiedName()); rs = s.executeQuery(); if (rs.next()) { result = rs.getInt(1); } } finally { close(rs); close(s); } return result; }
@Override public void doCreateTables(TransactionContext transactionContext) throws SQLException, IOException { // Check to see if the table already exists. If it does, then don't log warnings during startup. // Need to run the scripts anyways since they may contain ALTER statements that upgrade a previous version of the table boolean messageTableAlreadyExists = messageTableAlreadyExists(transactionContext); for (String createStatement : this.statements.getCreateSchemaStatements()) { // This will fail usually since the tables will be // created already. executeStatement(transactionContext, createStatement, messageTableAlreadyExists); } }
@Override public void doDeleteOldMessages(TransactionContext c) throws SQLException, IOException { PreparedStatement s = null; try { LOG.debug("Executing SQL: " + this.statements.getDeleteOldMessagesStatementWithPriority()); s = c.getExclusiveConnection().prepareStatement(this.statements.getDeleteOldMessagesStatementWithPriority()); int priority = priorityIterator++%10; s.setInt(1, priority); s.setInt(2, priority); int i = s.executeUpdate(); LOG.debug("Deleted " + i + " old message(s) at priority: " + priority); } finally { close(s); } }
@Override public void doRecordDestination(TransactionContext c, ActiveMQDestination destination) throws SQLException, IOException { PreparedStatement s = null; try { s = c.getConnection().prepareStatement(this.statements.getCreateDurableSubStatement()); s.setString(1, destination.getQualifiedName()); s.setString(2, destination.getQualifiedName()); s.setString(3, destination.getQualifiedName()); s.setString(4, null); s.setLong(5, 0); s.setString(6, destination.getQualifiedName()); s.setLong(7, 11); // entry out of priority range if (s.executeUpdate() != 1) { throw new IOException("Could not create ack record for destination: " + destination); } } finally { close(s); } }
public void doDeleteOldMessages(TransactionContext c, boolean isPrioritizedMessages) throws SQLException, IOException { PreparedStatement s = null; cleanupExclusiveLock.writeLock().lock(); try { if (isPrioritizedMessages) { LOG.debug("Executing SQL: " + this.statements.getDeleteOldMessagesStatementWithPriority()); s = c.getConnection().prepareStatement(this.statements.getDeleteOldMessagesStatementWithPriority()); } else { LOG.debug("Executing SQL: " + this.statements.getDeleteOldMessagesStatement()); s = c.getConnection().prepareStatement(this.statements.getDeleteOldMessagesStatement()); } s.setLong(1, System.currentTimeMillis()); int i = s.executeUpdate(); LOG.debug("Deleted " + i + " old message(s)."); } finally { cleanupExclusiveLock.writeLock().unlock(); close(s); } }
if( !type.equals(INNODB) && !type.equals(NDBCLUSTER) ) { statements.setLockCreateStatement("LOCK TABLE " + statements.getFullLockTableName() + " WRITE"); statements.setBinaryDataType("LONGBLOB"); String[] s = statements.getCreateSchemaStatements(); for (int i = 0; i < s.length; i++) { if( s[i].startsWith("CREATE TABLE")) { l.add("ALTER TABLE "+statements.getFullMessageTableName()+" ENGINE="+NDBCLUSTER); l.add("ALTER TABLE "+statements.getFullAckTableName()+" ENGINE="+NDBCLUSTER); l.add("ALTER TABLE "+statements.getFullLockTableName()+" ENGINE="+NDBCLUSTER); l.add("FLUSH TABLES"); s = l.toArray(new String[l.size()]); statements.setCreateSchemaStatements(s);
public String[] getCreateSchemaStatements() { if (createSchemaStatements == null) { createSchemaStatements = new String[] { "CREATE TABLE " + getFullMessageTableName() + "(" + "ID " + sequenceDataType + " NOT NULL" + ", CONTAINER " + containerNameDataType + " NOT NULL, MSGID_PROD " + msgIdDataType + ", MSGID_SEQ " + sequenceDataType + ", EXPIRATION " + longDataType + ", MSG " + (useExternalMessageReferences ? stringIdDataType : binaryDataType) + ", PRIMARY KEY ( ID ) )", "CREATE INDEX " + getFullMessageTableName() + "_MIDX ON " + getFullMessageTableName() + " (MSGID_PROD,MSGID_SEQ)", "CREATE INDEX " + getFullMessageTableName() + "_CIDX ON " + getFullMessageTableName() + " (CONTAINER)", "CREATE INDEX " + getFullMessageTableName() + "_EIDX ON " + getFullMessageTableName() + " (EXPIRATION)", "CREATE TABLE " + getFullAckTableName() + "(" + "CONTAINER " + containerNameDataType + " NOT NULL" + ", SUB_DEST " + stringIdDataType + ", CLIENT_ID " + stringIdDataType + " NOT NULL" + ", SUB_NAME " + stringIdDataType + " NOT NULL" + ", SELECTOR " + stringIdDataType + ", LAST_ACKED_ID " + sequenceDataType + ", PRIMARY KEY ( CONTAINER, CLIENT_ID, SUB_NAME))", "ALTER TABLE " + getFullMessageTableName() + " ADD PRIORITY " + sequenceDataType, "CREATE INDEX " + getFullMessageTableName() + "_PIDX ON " + getFullMessageTableName() + " (PRIORITY)", "ALTER TABLE " + getFullMessageTableName() + " ADD XID " + stringIdDataType, "ALTER TABLE " + getFullAckTableName() + " ADD PRIORITY " + sequenceDataType + " DEFAULT 5 NOT NULL", "ALTER TABLE " + getFullAckTableName() + " ADD XID " + stringIdDataType, "ALTER TABLE " + getFullAckTableName() + " " + getDropAckPKAlterStatementEnd(), "ALTER TABLE " + getFullAckTableName() + " ADD PRIMARY KEY (CONTAINER, CLIENT_ID, SUB_NAME, PRIORITY)", "CREATE INDEX " + getFullMessageTableName() + "_XIDX ON " + getFullMessageTableName() + " (XID)", "CREATE INDEX " + getFullAckTableName() + "_XIDX ON " + getFullAckTableName() + " (XID)" }; getCreateLockSchemaStatements(); String[] allCreateStatements = new String[createSchemaStatements.length + createLockSchemaStatements.length]; System.arraycopy(createSchemaStatements, 0, allCreateStatements, 0, createSchemaStatements.length);
long lastMessageId = -1; if (!retroactive) { s = c.getConnection().prepareStatement(this.statements.getFindLastSequenceIdInMsgsStatement()); ResultSet rs = null; try { s = c.getConnection().prepareStatement(this.statements.getCreateDurableSubStatement()); int maxPriority = 1; if (isPrioritizedMessages) {