ARTEMIS-957 Use setBytes JDBC API vs Concat BLOB

(cherry picked from commit b8595d610df77271029669a3d8b7ed1b6ef9478f)


Project: http://git-wip-us.apache.org/repos/asf/activemq-artemis/repo
Commit: http://git-wip-us.apache.org/repos/asf/activemq-artemis/commit/3d765ae4
Tree: http://git-wip-us.apache.org/repos/asf/activemq-artemis/tree/3d765ae4
Diff: http://git-wip-us.apache.org/repos/asf/activemq-artemis/diff/3d765ae4

Branch: refs/heads/1.x
Commit: 3d765ae4cf1b122328ce7bfa8f8db671ad758b92
Parents: f231fe4
Author: Martyn Taylor <[email protected]>
Authored: Fri Feb 10 14:27:26 2017 +0000
Committer: Martyn Taylor <[email protected]>
Committed: Fri Feb 10 15:29:27 2017 +0000

----------------------------------------------------------------------
 .../store/drivers/derby/DerbySQLProvider.java   |  9 --------
 .../file/JDBCSequentialFileFactoryDriver.java   | 23 +++++++++++++-------
 .../jdbc/store/sql/GenericSQLProvider.java      |  2 +-
 3 files changed, 16 insertions(+), 18 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/3d765ae4/artemis-jdbc-store/src/main/java/org/apache/activemq/artemis/jdbc/store/drivers/derby/DerbySQLProvider.java
----------------------------------------------------------------------
diff --git 
a/artemis-jdbc-store/src/main/java/org/apache/activemq/artemis/jdbc/store/drivers/derby/DerbySQLProvider.java
 
b/artemis-jdbc-store/src/main/java/org/apache/activemq/artemis/jdbc/store/drivers/derby/DerbySQLProvider.java
index ab61cc2..7e0ce58 100644
--- 
a/artemis-jdbc-store/src/main/java/org/apache/activemq/artemis/jdbc/store/drivers/derby/DerbySQLProvider.java
+++ 
b/artemis-jdbc-store/src/main/java/org/apache/activemq/artemis/jdbc/store/drivers/derby/DerbySQLProvider.java
@@ -26,16 +26,12 @@ public class DerbySQLProvider extends GenericSQLProvider {
 
    private final String createFileTableSQL;
 
-   private final String appendToFileSQL;
-
    private DerbySQLProvider(String tableName) {
       super(tableName.toUpperCase());
 
       createFileTableSQL = "CREATE TABLE " + tableName +
          "(ID BIGINT NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 1, 
INCREMENT BY 1)," +
          "FILENAME VARCHAR(255), EXTENSION VARCHAR(10), DATA BLOB, PRIMARY 
KEY(ID))";
-
-      appendToFileSQL = "UPDATE " + tableName + " SET DATA = DATA || ? WHERE 
ID=?";
    }
 
    @Override
@@ -49,11 +45,6 @@ public class DerbySQLProvider extends GenericSQLProvider {
    }
 
    @Override
-   public String getAppendToLargeObjectSQL() {
-      return appendToFileSQL;
-   }
-
-   @Override
    public boolean closeConnectionOnShutdown() {
       return false;
    }

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/3d765ae4/artemis-jdbc-store/src/main/java/org/apache/activemq/artemis/jdbc/store/file/JDBCSequentialFileFactoryDriver.java
----------------------------------------------------------------------
diff --git 
a/artemis-jdbc-store/src/main/java/org/apache/activemq/artemis/jdbc/store/file/JDBCSequentialFileFactoryDriver.java
 
b/artemis-jdbc-store/src/main/java/org/apache/activemq/artemis/jdbc/store/file/JDBCSequentialFileFactoryDriver.java
index 41ad105..b773cd9 100644
--- 
a/artemis-jdbc-store/src/main/java/org/apache/activemq/artemis/jdbc/store/file/JDBCSequentialFileFactoryDriver.java
+++ 
b/artemis-jdbc-store/src/main/java/org/apache/activemq/artemis/jdbc/store/file/JDBCSequentialFileFactoryDriver.java
@@ -74,7 +74,7 @@ public class JDBCSequentialFileFactoryDriver extends 
AbstractJDBCDriver {
       this.copyFileRecord = 
connection.prepareStatement(sqlProvider.getCopyFileRecordByIdSQL());
       this.renameFile = 
connection.prepareStatement(sqlProvider.getUpdateFileNameByIdSQL());
       this.readLargeObject = 
connection.prepareStatement(sqlProvider.getReadLargeObjectSQL());
-      this.appendToLargeObject = 
connection.prepareStatement(sqlProvider.getAppendToLargeObjectSQL());
+      this.appendToLargeObject = 
connection.prepareStatement(sqlProvider.getAppendToLargeObjectSQL(), 
ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_UPDATABLE);
       this.selectFileNamesByExtension = 
connection.prepareStatement(sqlProvider.getSelectFileNamesByExtensionSQL());
    }
 
@@ -154,7 +154,8 @@ public class JDBCSequentialFileFactoryDriver extends 
AbstractJDBCDriver {
 
          try (ResultSet rs = readLargeObject.executeQuery()) {
             if (rs.next()) {
-               file.setWritePosition((int) rs.getBlob(1).length());
+               Blob blob = rs.getBlob(1);
+               file.setWritePosition((int) blob.length());
             }
             connection.commit();
          } catch (SQLException e) {
@@ -242,13 +243,19 @@ public class JDBCSequentialFileFactoryDriver extends 
AbstractJDBCDriver {
     */
    public int writeToFile(JDBCSequentialFile file, byte[] data) throws 
SQLException {
       synchronized (connection) {
-         try {
-            connection.setAutoCommit(false);
-            appendToLargeObject.setBytes(1, data);
-            appendToLargeObject.setLong(2, file.getId());
-            appendToLargeObject.executeUpdate();
+         connection.setAutoCommit(false);
+         appendToLargeObject.setLong(1, file.getId());
+
+         int bytesWritten = 0;
+         try (ResultSet rs = appendToLargeObject.executeQuery()) {
+            if (rs.next()) {
+               Blob blob = rs.getBlob(1);
+               bytesWritten = blob.setBytes(blob.length() + 1, data);
+               rs.updateBlob(1, blob);
+               rs.updateRow();
+            }
             connection.commit();
-            return data.length;
+            return bytesWritten;
          } catch (SQLException e) {
             connection.rollback();
             throw e;

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/3d765ae4/artemis-jdbc-store/src/main/java/org/apache/activemq/artemis/jdbc/store/sql/GenericSQLProvider.java
----------------------------------------------------------------------
diff --git 
a/artemis-jdbc-store/src/main/java/org/apache/activemq/artemis/jdbc/store/sql/GenericSQLProvider.java
 
b/artemis-jdbc-store/src/main/java/org/apache/activemq/artemis/jdbc/store/sql/GenericSQLProvider.java
index 0527c54..1d9b829 100644
--- 
a/artemis-jdbc-store/src/main/java/org/apache/activemq/artemis/jdbc/store/sql/GenericSQLProvider.java
+++ 
b/artemis-jdbc-store/src/main/java/org/apache/activemq/artemis/jdbc/store/sql/GenericSQLProvider.java
@@ -69,7 +69,7 @@ public class GenericSQLProvider implements SQLProvider {
 
       selectIdByFileNameSQL = "SELECT ID, FILENAME, EXTENSION, DATA FROM " + 
tableName + " WHERE fileName=?";
 
-      appendToFileSQL = "UPDATE " + tableName + " SET DATA = CONCAT(DATA, ?) 
WHERE ID=?";
+      appendToFileSQL = "SELECT DATA FROM " + tableName + " WHERE ID=? FOR 
UPDATE";
 
       readLargeObjectSQL = "SELECT DATA FROM " + tableName + " WHERE ID=?";
 

Reply via email to