2014-05-02 22 views
0

據我所知,GridGain 6有一些自定義的序列化,並且還爲各種目的使用H2。GridGain GridH2IndexingSpi序列化與我們的H2數據庫衝突

我們使用H2作爲序列化的對象存儲。例如,這裏是表格模式的相關部分。

CREATE TABLE IF NOT EXISTS QUEUE (ID IDENTITY PRIMARY KEY, OBJECT OTHER NOT NULL ....) 

嘗試插入一行時,出現以下錯誤。最後幾行表明GridH2IndexingSpi已配置並且失敗(即使我的測試未在網格上運行)。由於spi源和我的調試器看起來不同步,並且行號沒有意義,所以我無法輕鬆進行進一步調試。

從我能夠在Utils.java中進行調試,看起來gridgain序列化器已經在H2(靜態!!!!)中配置並正在使用。

有關如何解決或避免這種情況的任何想法?我已經嘗試過各種H2版本,比如1.3.176(gridgain使用)和更新的1.4.177,但正如所料,它們沒有什麼區別,因爲問題在於使用索引spi。

我可以嘗試創建一個小的H2/Gridgain項目來說明這個問題,如果有幫助的話。

感謝

Exception in thread "pool-4-thread-1" org.springframework.jdbc.UncategorizedSQLException: PreparedStatementCallback; uncategorized SQLException for SQL []; SQL state [90026]; error code [90026]; Serialization failed, cause: "java.lang.NullPointerException"; SQL statement: 
INSERT INTO QUEUE (OBJECT....) VALUES (?,?,?,?) [90026-170]; nested exception is org.h2.jdbc.JdbcSQLException: Serialization failed, cause: "java.lang.NullPointerException"; SQL statement: 
INSERT INTO QUEUE (OBJECT, ....) VALUES (?,?,?,?) [90026-170] 
.... 
Caused by: org.h2.jdbc.JdbcSQLException: Serialization failed, cause: "java.lang.NullPointerException"; SQL statement: 
INSERT INTO QUEUE (OBJECT, ....) VALUES (?,?,?,?) [90026-170] 
at org.h2.message.DbException.getJdbcSQLException(DbException.java:329) 
at org.h2.message.DbException.get(DbException.java:158) 
.... 
Caused by: java.lang.NullPointerException 
at org.gridgain.grid.spi.indexing.h2.GridH2IndexingSpi.access$100(GridH2IndexingSpi.java:145) 
at org.gridgain.grid.spi.indexing.h2.GridH2IndexingSpi$1.serialize(GridH2IndexingSpi.java:201) 
at org.h2.util.Utils.serialize(Utils.java:273) 
... 27 more 

回答

1

我終於明白髮生了什麼事。在實現GridGain H2集成的時候,H2只有一個靜態串行器。這就是爲什麼GridGain使用靜態屬性。作爲一個可能的解決方法,您可以嘗試在H2數據庫中設置您的自定義序列化程序,它實際上會使用通常的H2序列化程序?

最新的H2版本支持指定每個數據庫的序列化程序,GridGain將在即將到來的版本中修復這個問題。

+0

是的,正如我所提到的那樣,它是負責的靜態序列化程序。現在我們的解決方法是可以接受的,當gridgain符合新的H2版本時,我會考慮整合每db序列化器。 –

0

我不知道它是什麼,你用H2做,但你不應該使用相同的H2數據庫內部使用GridGain。

GridGain在內部專門用於SQL索引和查詢功能。

+0

嗨 我們不使用與gridgain使用相同的H2,我們使用嵌入式H2的不同實例作爲快速嵌入式存儲。我的觀點是,由gridgain實現的H2序列化器已經接管了(H2將其稱爲靜態全局變量),並且當我們試圖插入序列化的java對象(類型= OTHER)時與我們的數據庫插入衝突。 我無論如何,我們通過重新定義該字段爲BLOB並手動序列化/反序列化我們的對象來避開這個問題。 –