之前接到客户反馈,数据库在使用ARRAY传递数组时发生报错,报错内容为“连接尚未建立或已关闭”。
应用为SPRING,数据库为DM数据库,中间件为TONGWEB
报错代码:
注意,DM8驱动中已不支持ARRAY和ArrayDescriptor,目前只有DM7支持
import dm.sql.ARRAY;
import dm.sql.ArrayDescriptor;
.....
public void testTongwebArray() {
// TODO Auto-generated method stub
Connection conn=null;
try {
Context ctx = new InitialContext();
Object datasourceRef = ctx.lookup("java:comp/env/jdbc/dm");
//引用数据源
DataSource ds = (DataSource) datasourceRef;
conn = ds.getConnection();
String[] gongwy_ids = {"123","234"};
ArrayDescriptor des = ArrayDescriptor.createDescriptor("RYIDARRAYS", conn);
ARRAY array_input = new ARRAY(des,conn,gongwy_ids);
} catch(Exception e) {
e.printStackTrace();
} finally {
if(conn!=null) {
try {
conn.close();
} catch(SQLException e) {
e.printStackTrace();
}
}
}
}
其中,ArrayDescriptor.createDescriptor("RYIDARRAYS", conn);发生报错。通过debugg发现,通过连接池取出的connection,是poolableconnection,而不是dmdbconnection。所以在createDescriptor方法中强制转换为dmdbconnection时报错。如果不走连接池,该写法不会报错。
测试了一下oracle使用dbcp连接池,同样报强制转换的错误:
由于连接池是必须使用的,所以对代码进行了改写,用java.sql.Array代替了dm.sql.Array,改写后代码如下:
public void testTongwebArray() {
// TODO Auto-generated method stub
Connection conn=null;
try {
Context ctx = new InitialContext();
Object datasourceRef = ctx.lookup("java:comp/env/jdbc/dm");
//引用数据源
DataSource ds = (DataSource) datasourceRef;
conn = ds.getConnection();
String[] gongwy_ids = {"123","234"};
java.sql.Array gongwy_ids_new = conn.createArrayOf("RYIDARRAYS", gongwy_ids);
String sql = "{call RY_PILIANG_HUAZHUAN(?)}";
CallableStatement cstmt = conn.prepareCall(sql);
cstmt.setArray(1, gongwy_ids_new);
cstmt.execute();
cstmt.close();
} catch(Exception e) {
e.printStackTrace();
} finally {
if(conn!=null) {
try {
conn.close();
} catch(SQLException e) {
e.printStackTrace();
}
}
}
}
执行成功,问题解决。