You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@shardingsphere.apache.org by GitBox <gi...@apache.org> on 2019/02/25 12:01:28 UTC

[GitHub] elfogre opened a new issue #1919: Use byte[] column as sharding column

elfogre opened a new issue #1919: Use byte[] column as sharding column
URL: https://github.com/apache/incubator-shardingsphere/issues/1919
 
 
   Hello shardingsphere team!
   
   I'm using your project and it works great! But now I have a new requirement that looks can't be managed with your library.
   
   I need to use a byte[] column as sharding value. However I'm getting an exception:
   
   `INFO - testInsertInProperTable(com.tuenti.platform.db.objectstorage.JpaObjectStorageShardedByteArrayIntegrationTest)  Time elapsed: 0.004 sec  <<< ERROR!
   INFO - io.shardingsphere.core.exception.ShardingException: Parameter `[B@397278e7` should extends Comparable for sharding value.
   INFO - 	at io.shardingsphere.core.parsing.parser.context.condition.Condition.getConditionValues(Condition.java:130)
   INFO - 	at io.shardingsphere.core.optimizer.insert.InsertOptimizeEngine.getShardingCondition(InsertOptimizeEngine.java:117)
   INFO - 	at io.shardingsphere.core.optimizer.insert.InsertOptimizeEngine.optimize(InsertOptimizeEngine.java:102)
   INFO - 	at io.shardingsphere.core.routing.router.sharding.ParsingSQLRouter.route(ParsingSQLRouter.java:109)
   INFO - 	at io.shardingsphere.core.routing.PreparedStatementRoutingEngine.route(PreparedStatementRoutingEngine.java:66)
   INFO - 	at io.shardingsphere.shardingjdbc.jdbc.core.statement.ShardingPreparedStatement.sqlRoute(ShardingPreparedStatement.java:229)
   INFO - 	at io.shardingsphere.shardingjdbc.jdbc.core.statement.ShardingPreparedStatement.executeUpdate(ShardingPreparedStatement.java:124)
   INFO - 	at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:187)
   INFO - 	at org.hibernate.engine.jdbc.batch.internal.NonBatchingBatch.addToBatch(NonBatchingBatch.java:62)
   INFO - 	at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3124)
   INFO - 	at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3587)
   INFO - 	at org.hibernate.action.internal.EntityInsertAction.execute(EntityInsertAction.java:103)
   INFO - 	at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:453)
   INFO - 	at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:345)
   INFO - 	at org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:350)
   INFO - 	at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:56)
   INFO - 	at org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1218)
   INFO - 	at org.hibernate.jpa.spi.AbstractEntityManagerImpl.flush(AbstractEntityManagerImpl.java:1335)
   INFO - 	at com.tuenti.platform.db.objectstorage.JpaObjectStorage.insert(JpaObjectStorage.java:166)
   INFO - 	at com.google.inject.persist.jpa.JpaStdAnnotationTxnInterceptor.invoke(JpaStdAnnotationTxnInterceptor.java:53)
   INFO - 	at com.tuenti.platform.db.objectstorage.JpaObjectStorageShardedByteArrayIntegrationTest.insert(JpaObjectStorageShardedByteArrayIntegrationTest.java:89)
   `
   As I can see, only comparables can be used at Condition:
   
   `/**
        * Get condition values.
        * 
        * @param parameters parameters
        * @return condition values
        */
       public List<Comparable<?>> getConditionValues(final List<?> parameters) {
           List<Comparable<?>> result = new LinkedList<>(positionValueMap.values());
           for (Entry<Integer, Integer> entry : positionIndexMap.entrySet()) {
               Object parameter = parameters.get(entry.getValue());
               if (!(parameter instanceof Comparable<?>)) {
                   throw new ShardingException("Parameter `%s` should extends Comparable for sharding value.", parameter);
               }
               if (entry.getKey() < result.size()) {
                   result.add(entry.getKey(), (Comparable<?>) parameter);
               } else {
                   result.add((Comparable<?>) parameter);
               }
           }
           return result;
       }`
   
   Do you know a workaround to use a byte[] column as the key for sharding?
   
   Thank you very much!

----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
users@infra.apache.org


With regards,
Apache Git Services