首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何确定CacheJdbcBlobStore表项的正确大小?

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

Stack Overflow用户
提问于 2016-05-25 14:10:22
回答 1查看 592关注 0票数 1

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

  • JDK 1.8.0_66
  • Apache Tomcat 7.0.68
  • 1.6.0
  • HyperSQL 2.3.4

我的数据源在Spring中设置如下:

代码语言:javascript
复制
<bean id="myDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="org.hsqldb.jdbcDriver"/>
    <property name="url" value="jdbc:hsqldb:http://localhost"/>
    <property name="username" value="sa"/>
    <property name="password" value=""/>
</bean>

以及Ignite配置:

代码语言:javascript
复制
<bean id="ignite.cfg" class="org.apache.ignite.configuration.IgniteConfiguration">
    <property name="cacheConfiguration">
        <list>
            <bean class="org.apache.ignite.configuration.CacheConfiguration">
                <property name="cacheMode" value="REPLICATED"/>
                <property name="name" value="session-cache"/>
                <property name="cacheStoreFactory">
                    <bean class="org.apache.ignite.cache.store.jdbc.CacheJdbcBlobStoreFactory">
                        <property name="dataSourceBean" value="myDataSource" />
                    </bean>
                </property>
                <property name="readThrough" value="true" />
                <property name="writeThrough" value="true" />                               
            </bean>
        </list>
    </property>
</bean>

然而,当我运行应用程序时,我得到了以下异常:

代码语言:javascript
复制
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.CacheJdbcBlobStoreFactory中:

代码语言:javascript
复制
<bean class="org.apache.ignite.cache.store.jdbc.CacheJdbcBlobStoreFactory">
    ...
    <property name="createTableQuery" value="create table if not exists ENTRIES (akey VARBINARY(100) primary key, val BLOB(10k))" />
</bean>

以便重写默认的:

代码语言:javascript
复制
create table if not exists ENTRIES (akey binary primary key, val binary)

我的问题是:如何确定表条目(特别是val列)的大小?现在我下了一万块。如果我设置的大小太高,这将是浪费,但如果我把尺寸太低,我会得到上面提到的例外迟早。谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-05-27 11:54:41

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

代码语言:javascript
复制
create table if not exists ENTRIES (akey VARBINARY(100) primary key, val BLOB(10k))

10k是val列的最大大小,而不是实际占用的空间。因此,如果实际长度低于最大限度,就不会造成浪费。

在Oracle中,您可以如下所示创建表:

代码语言:javascript
复制
create table ENTRIES (akey VARCHAR2(100) primary key, val BLOB);

再说一遍,您不必担心val列的大小。在Oracle中,BLOB类型列的大小可以看作是无限的大小初始化参数(8 TB到128 TB)。实际占用的空间取决于缓存的实际大小。空间是不会浪费的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37439718

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档