JBoss數(shù)據(jù)源連接不能創(chuàng)建存儲(chǔ)過(guò)程數(shù)組輸入?yún)?shù)的解決方法
在使用JBoss Datasource獲取connection并為Oracle存儲(chǔ)過(guò)程創(chuàng)建數(shù)組輸入?yún)?shù)時(shí),有時(shí)會(huì)遇到的問(wèn)題。本文將介紹一種基于ojdbc7的反射機(jī)制解決方法。獲取Connection和
在使用JBoss Datasource獲取connection并為Oracle存儲(chǔ)過(guò)程創(chuàng)建數(shù)組輸入?yún)?shù)時(shí),有時(shí)會(huì)遇到的問(wèn)題。本文將介紹一種基于ojdbc7的反射機(jī)制解決方法。
獲取Connection和創(chuàng)建Array輸入?yún)?shù)
通常我們從Datasource獲取connection后,會(huì)使用如下方式創(chuàng)建ARRAY輸入數(shù)組參數(shù):
```
ArrayDescriptor descriptor ("ARRAY_TYPE", connection.unwrap());
ARRAY array new ARRAY(descriptor, connection.unwrap(), inputArray);
```
然而,由于Datasource返回的是一個(gè)OracleConnection Wrapper,而ArrayDescriptor需要一個(gè),因此會(huì)拋出ClassCastException。
解決ClassCastException問(wèn)題
根據(jù)以往經(jīng)驗(yàn),我們可以通過(guò)獲取Wrapper的underlying connection來(lái)獲得的實(shí)例。但是在某些情況下,會(huì)報(bào) cannot be cast to 的奇怪錯(cuò)誤。這個(gè)問(wèn)題的原因比較復(fù)雜,可能是由于JBoss本身ClassLoader加載了不同版本的WrappedConnectionJDK6。
使用反射機(jī)制創(chuàng)建存儲(chǔ)過(guò)程數(shù)組輸入?yún)?shù)
在ojdbc7中,ArrayDescriptor和ARRAY類(lèi)已被廢除,取而代之的是方法。但是我們不能直接調(diào)用這個(gè)方法,而是需要通過(guò)反射機(jī)制調(diào)用getUnderlyingConnection()方法和createARRAY()方法來(lái)創(chuàng)建存儲(chǔ)過(guò)程的數(shù)組輸入?yún)?shù)。
解決方法步驟
1. 通過(guò)反射獲取connection對(duì)象的underlying connection。
2. 使用反射調(diào)用underlying connection的createARRAY方法,傳入相應(yīng)的參數(shù)以創(chuàng)建存儲(chǔ)過(guò)程的數(shù)組輸入?yún)?shù)。
通過(guò)以上步驟,我們可以成功創(chuàng)建存儲(chǔ)過(guò)程的數(shù)組輸入?yún)?shù),避免了ClassCastException等問(wèn)題。
總結(jié):
本文介紹了在使用JBoss Datasource獲取connection并為Oracle存儲(chǔ)過(guò)程創(chuàng)建數(shù)組輸入?yún)?shù)時(shí)可能遇到的問(wèn)題,并提供了一種基于ojdbc7的反射機(jī)制解決方法。通過(guò)該方法,我們可以順利地創(chuàng)建存儲(chǔ)過(guò)程的數(shù)組輸入?yún)?shù),提高了代碼的穩(wěn)定性和可靠性。