WebService传递大字符串
2015-10-21 11:42
651 查看
写一个小例子
WebService开发相对简单了 但是遇到了一个传递大字符串 并入库的需求
所以字符串入库肯定是CLOB 因为是大字符串
(需求是传递一个1M左右的字符串 然后返回一个1M的字符串)
最初觉得只是一个小需求
写一个WebService接口 然后里面用JDBC链接数据库 然后插入 最后返回 OK搞定
几分钟写完之后 觉得还行
然后测试
发现别说1M 就是上了几KB的数据 都进不去库 报错原因是数据量比较大 字符串太长
网上找了好多 有很多人说 理论上来讲WebService传递是没有大小限制的 又是更改连接时间 又是压缩字符串 或者是分包之类的办法
办法太杂 不晓得怎么弄 一时没了头绪 心中一万只草泥马奔腾而过……
(不知道大伙有没有这么感觉过 遇到困难了 找答案 然后看到一堆不想干 或者问题符合按照他给的办法就不是那么回事的了)
后来自己测试了一遍用存储过程写的SQL
效果比较好 终于能上10KB了 先高兴一下
然后20KB 的时候 又呵呵了…… %¥#%¥#¥%(各种骂娘中……)
最后找到了一个方法 抱着试一个疗程的态度 终于成功了
下面付上代码
package jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.PreparedStatement;
import java.util.Date;
import oracle.jdbc.OracleConnection;
import oracle.jdbc.OraclePreparedStatement;
import oracle.sql.CLOB;
public class IntoOrclImpl implements IntoOrcl {
public static void main(String[] args) {
IntoOrclImpl ioi = new IntoOrclImpl();
String str = "你";
str = str+str+str+str+str+str+str+str+str+str;
str = str+str+str+str+str+str+str+str+str+str;
str = str+str+str+str+str+str+str+str+str+str;
str = str+str+str+str+str+str+str+str+str+str;
str = str+str+str+str+str+str+str+str+str+str;
str = str+str+str+str+str+str+str+str+str+str;
ioi.intoOral(str);
}
@Override
public int intoOral(String demo) {
String driver = "oracle.jdbc.OracleDriver";// 驱动字符串
String url = "jdbc:oracle:thin:@127.0.0.1:1521:orcl";// 链接字符串
String user = "demo";// 用户名
String password = "demo";// 密码
Connection con = null;
OraclePreparedStatement pstm = null;
ResultSet rs = null;
boolean flag=false;
int i = 0;
try {
Class.forName(driver);
con = DriverManager.getConnection(url, user, password);
String sql = "DECLARE" +
" REALLYBIGTEXTSTRING CLOB := ?;" +
"BEGIN" +
" INSERT INTO demo VALUES(REALLYBIGTEXTSTRING);" +
"end ;";
CLOB clob = new CLOB((OracleConnection) con);
clob = oracle.sql.CLOB.createTemporary((OracleConnection) con, true,
1);
OracleConnection oCon = (OracleConnection) con;
pstm = (OraclePreparedStatement) oCon
.prepareCall(sql);
pstm.setString(1, demo);
i = pstm.executeUpdate();
flag=true;
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
if(rs!=null){
try {
rs.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//关闭执行通道
if(pstm!=null){
try {
pstm.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//关闭连接通道
try {
if(con!=null&&(!con.isClosed())){
try {
con.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(flag){
System.out.println("执行成功!");
}else{
System.out.println("执行失败!");
}
return i;
}
}
WebService开发相对简单了 但是遇到了一个传递大字符串 并入库的需求
所以字符串入库肯定是CLOB 因为是大字符串
(需求是传递一个1M左右的字符串 然后返回一个1M的字符串)
最初觉得只是一个小需求
写一个WebService接口 然后里面用JDBC链接数据库 然后插入 最后返回 OK搞定
几分钟写完之后 觉得还行
然后测试
发现别说1M 就是上了几KB的数据 都进不去库 报错原因是数据量比较大 字符串太长
网上找了好多 有很多人说 理论上来讲WebService传递是没有大小限制的 又是更改连接时间 又是压缩字符串 或者是分包之类的办法
办法太杂 不晓得怎么弄 一时没了头绪 心中一万只草泥马奔腾而过……
(不知道大伙有没有这么感觉过 遇到困难了 找答案 然后看到一堆不想干 或者问题符合按照他给的办法就不是那么回事的了)
后来自己测试了一遍用存储过程写的SQL
效果比较好 终于能上10KB了 先高兴一下
然后20KB 的时候 又呵呵了…… %¥#%¥#¥%(各种骂娘中……)
最后找到了一个方法 抱着试一个疗程的态度 终于成功了
下面付上代码
package jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.PreparedStatement;
import java.util.Date;
import oracle.jdbc.OracleConnection;
import oracle.jdbc.OraclePreparedStatement;
import oracle.sql.CLOB;
public class IntoOrclImpl implements IntoOrcl {
public static void main(String[] args) {
IntoOrclImpl ioi = new IntoOrclImpl();
String str = "你";
str = str+str+str+str+str+str+str+str+str+str;
str = str+str+str+str+str+str+str+str+str+str;
str = str+str+str+str+str+str+str+str+str+str;
str = str+str+str+str+str+str+str+str+str+str;
str = str+str+str+str+str+str+str+str+str+str;
str = str+str+str+str+str+str+str+str+str+str;
ioi.intoOral(str);
}
@Override
public int intoOral(String demo) {
String driver = "oracle.jdbc.OracleDriver";// 驱动字符串
String url = "jdbc:oracle:thin:@127.0.0.1:1521:orcl";// 链接字符串
String user = "demo";// 用户名
String password = "demo";// 密码
Connection con = null;
OraclePreparedStatement pstm = null;
ResultSet rs = null;
boolean flag=false;
int i = 0;
try {
Class.forName(driver);
con = DriverManager.getConnection(url, user, password);
String sql = "DECLARE" +
" REALLYBIGTEXTSTRING CLOB := ?;" +
"BEGIN" +
" INSERT INTO demo VALUES(REALLYBIGTEXTSTRING);" +
"end ;";
CLOB clob = new CLOB((OracleConnection) con);
clob = oracle.sql.CLOB.createTemporary((OracleConnection) con, true,
1);
OracleConnection oCon = (OracleConnection) con;
pstm = (OraclePreparedStatement) oCon
.prepareCall(sql);
pstm.setString(1, demo);
i = pstm.executeUpdate();
flag=true;
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
if(rs!=null){
try {
rs.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//关闭执行通道
if(pstm!=null){
try {
pstm.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//关闭连接通道
try {
if(con!=null&&(!con.isClosed())){
try {
con.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(flag){
System.out.println("执行成功!");
}else{
System.out.println("执行失败!");
}
return i;
}
}
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树
- [原创]java局域网聊天系统