Ignite 如何确定CacheJdbcBlobStore表项的正确大小?

Ignite 如何确定CacheJdbcBlobStore表项的正确大小?,ignite,Ignite,我正在尝试为我的ApacheIgnite应用程序设置一个持久缓存存储。我尝试使用的缓存存储是CacheJdbcBlobStore。以下是我在原型中使用的软件列表: JDK 1.8.0_66 ApacheTomcat 7.0.68 ApacheIgnite1.6.0 HyperSQL 2.3.4 我的数据源在春季设置如下: 以及点火配置: 但是,当我运行应用程序时,出现了以下异常: ERROR - root - Failed to updat

我正在尝试为我的ApacheIgnite应用程序设置一个持久缓存存储。我尝试使用的缓存存储是CacheJdbcBlobStore。以下是我在原型中使用的软件列表:

  • JDK 1.8.0_66
  • ApacheTomcat 7.0.68
  • ApacheIgnite1.6.0
  • HyperSQL 2.3.4
我的数据源在春季设置如下:


以及点火配置:


但是,当我运行应用程序时,出现了以下异常:

ERROR - root                       - Failed to update web session: null
class org.apache.ignite.IgniteException: Failed to save session: C56AF4E1DA01A439E43E512950D32D45
Caused by: javax.cache.integration.CacheWriterException: class org.apache.ignite.internal.processors.cache.CachePartialUpdateCheckedException: Failed to update keys (retry update if possible).: [C56AF4E1DA
01A439E43E512950D32D45]
Caused by: class org.apache.ignite.internal.processors.cache.CachePartialUpdateCheckedException: Failed to update keys (retry update if possible).: [C56AF4E1DA01A439E43E512950D32D45]
                Suppressed: class org.apache.ignite.IgniteCheckedException: Failed to put object [key=C56AF4E1DA01A439E43E512950D32D45, val=WebSessionEntity [id=C56AF4E1DA01A439E43E512950D32D45, createTime=1464182374328, accessTime=1464182374330, maxInactiveInterval=1800, attributes=[]]]
                        at org.apache.ignite.internal.processors.cache.store.GridCacheStoreManagerAdapter.put(GridCacheStoreManagerAdapter.java:583)
                        at org.apache.ignite.internal.processors.cache.GridCacheMapEntry.innerUpdate(GridCacheMapEntry.java:2358)
                        at org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridDhtAtomicCache.updateSingle(GridDhtAtomicCache.java:2246)
                        ... 37 more
                Caused by: javax.cache.integration.CacheWriterException: Failed to put object [key=C56AF4E1DA01A439E43E512950D32D45, val=WebSessionEntity [id=C56AF4E1DA01A439E43E512950D32D45, createTime=1464182374328, accessTime=1464182374330, maxInactiveInterval=1800, attributes=[]]]
                        at org.apache.ignite.cache.store.jdbc.CacheJdbcBlobStore.write(CacheJdbcBlobStore.java:281)
                        at org.apache.ignite.internal.processors.cache.store.GridCacheStoreManagerAdapter.put(GridCacheStoreManagerAdapter.java:575)
                        ... 39 more
                Caused by: java.sql.SQLDataException: data exception: string data, right truncation;  table: ENTRIES column: AKEY
                        at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source)
                        at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source)
                        at org.hsqldb.jdbc.JDBCPreparedStatement.fetchResult(Unknown Source)
                        at org.hsqldb.jdbc.JDBCPreparedStatement.executeUpdate(Unknown Source)
                        at org.apache.ignite.cache.store.jdbc.CacheJdbcBlobStore.write(CacheJdbcBlobStore.java:277)
                        ... 40 more
我发现您需要将createTableQuery属性添加到jdbc.cachejdbcbBlobstoreFactory:


...
以便覆盖默认值:

create table if not exists ENTRIES (akey binary primary key, val binary)

我的问题是:如何确定表条目(尤其是val列)的大小?目前我投了10公里。如果我将大小设置得太高,那将是浪费,但是如果我将大小设置得太低,我迟早会遇到上面提到的异常。谢谢。

也许您不必担心表条目的列大小。例如,在HyperSQL数据库中,如果按以下方式创建表:

如果不存在条目,则创建表(akey VARBINARY(100)主键,val BLOB(10k))
10k是列val的最大大小,而不是实际占用的空间。因此,如果实际长度低于最大限制,则不会造成浪费

在Oracle中,您可以按如下方式创建表:

创建表条目(akey VARCHAR2(100)主键,val BLOB);
同样,您不必担心列val的大小。在Oracle中,BLOB类型的列的大小可以被视为是无限制的。实际占用的空间取决于缓存的实际大小。不会浪费任何空间