DM数据库 使用ARRAY传递数组

之前接到客户反馈,数据库在使用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(); 
				} 
			} 
		}

		
	}

执行成功,问题解决。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值