系统很早存在一个上传的问题,主要涉及到的是与开源软件的jasper文件的集成.之前一直是在数据库客户端,通过for update的方式.后来进行了改进,采用的是jdbc的方式,同时该了一下hibernate的blob字段的映射配置,问题基本解决.说基本是因为不同服务器对blob字段的包装问题,具体:
向oracle写入blob数据时,如下:
oracle.sql.BLOB blob = (oracle.sql.BLOB) rs.getBlob(1);
BufferedOutputStream bos = new BufferedOutputStream(blob.getBinaryOutputStream());
bos.write(image);
在本地的tomcat服务器上上传没问题,
但是发布到weblogic上,使用weblogic的连接池,就抛错了,如下:
后来查了一下,原因是通过weblogic连接池取出的连接取出的blob对象是weblogic封装过的OracleThinBlob,而不是oracle.sql.BLOB。然后又看了一下OracleThinBlob的方法与oracle.sql.BLOB类似,所以采用了下面的写法,避免异常(用到的是泛型的解决方法):
if("0".equals(type)){//上传图片
String update_fmp = "update web_prn_fmp set c_image_name=?,b_image=? where c_prn_fmp = '" + prnFmp+"'";
String query_fmp = "select b_image from web_prn_fmp where c_prn_fmp = ? FOR UPDATE" ;
pstmt = conn.prepareStatement(update_fmp);
pstmt.setString(1,imageName);
pstmt.setString(2,"0");//初始化blob数据,否则后续的调用会出现空指针异常.
pstmt.executeUpdate();
pstmt.clearParameters();
pstmt = conn.prepareStatement(query_fmp);
pstmt.setString(1,prnFmp);
rs = pstmt.executeQuery();
if(rs.next())
{
// oracle.sql.BLOB b_image = (oracle.sql.BLOB) rs.getBlob("b_image");
// java.io.OutputStream writer = b_image.getBinaryOutputStream();//得到对应于数据库相应blob字段的输出流
// BufferedOutputStream out = new BufferedOutputStream(writer);
//tomcat和weblogic对blob字段进行了不同的包装,需使用如下的泛型方案代码 zengshaotao 2011-03-14
Object obj = rs.getBlob("b_image");
Class clazz = obj.getClass();
Method method = clazz.getMethod("getBinaryOutputStream", new Class[]{});
OutputStream os = (OutputStream)method.invoke(obj, new Object[]{});
BufferedOutputStream out = new BufferedOutputStream(os);
out.write(image);
rs.close();
//writer.close();
out.close();
conn.commit();
conn.setAutoCommit(true);//恢复现场
}else{
throw new Exception("没有得到与给定的单证格式代码相应的记录!");
}
}
相关推荐
在深入探讨C#反射实例之前,我们首先了解几个关键的概念: - **Assembly(程序集)**:是.NET中的编译单元,包含了一组相关的类型和资源。 - **Type**:表示.NET Framework中的所有类型的抽象基类,包括类、结构、...
在提供的"java反射实例代码"中,应该包含了如何使用上述方法的实际示例,这些示例有助于加深对Java反射机制的理解。通过阅读和运行这些代码,开发者可以更直观地学习如何在程序运行时动态地操作类、方法和字段,从而...
在C#编程中,反射是一种强大的工具,它允许我们在运行时检查、实例化和操作程序集、类型、方法、属性等对象。这个“C# 反射 实例”压缩包很可能是包含了一些示例代码,帮助开发者理解如何在实践中使用反射。让我们...
### 反射实例—JAVA反射机制 #### 一、反射概念及原理 反射在计算机科学领域,特别是程序设计中,是指程序有能力访问、检测和修改其自身的结构和行为。这一概念最早由Smith于1982年提出,并迅速应用于各种编程语言...
//c# 反射实例 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Reflection; namespace ConsoleApplication1 { class Program { static void Main( string...
以下是对"java 反射实例,大量注释,简单易懂"这个主题的详细解释: 1. **反射基础**: - Java反射API主要由`java.lang.reflect`包提供,包括`Class`,`Constructor`,`Method`和`Field`等类。 - `Class`类代表...
在“qt反射实例.zip”这个压缩包中,包含了一个关于Qt反射机制的开发实例。反射是一种编程概念,它允许程序在运行时检查自身结构,如类、对象、方法等,并能够动态地操作这些信息。在C++中,Qt提供了一套完整的反射...
以下将详细介绍Java反射的8个关键实例。 1. 获取Class对象 要使用反射,首先需要获取到目标类的Class对象。这可以通过以下几种方式实现: - 使用`Class.forName()`方法,如`Class<?> clazz = Class.forName("全...
标题"Java反射实例源码"表明我们将探讨如何通过源代码来实现和理解Java反射。这个实例可能包含了如何动态地创建对象、调用方法、访问字段和执行构造器的示例。 描述中提到的博客文章"菜鸟学编程(九)——Java反射...
本压缩包文件"flash反射实例"提供了关于AS3.0反射机制的实际应用示例,对于想要深入了解和学习这一技术的开发者来说是一份宝贵的学习资源。 反射机制在AS3.0中的主要功能包括: 1. **类的动态操作**:你可以通过...
在标题和描述中提到的"java反射实例"是一个简单的入门程序,旨在演示如何使用反射来操作JavaBean的get和set方法。 首先,让我们理解JavaBean。JavaBean是一种符合特定规范的Java类,通常具有公有的getter和setter...
反射实例,如标题所示,旨在帮助我们深入理解这一关键概念,并应用它来实现自动升级和插件技术。让我们详细探讨一下这些知识点。 首先,我们要理解什么是反射。在.NET中,反射提供了一种在运行时获取类型信息并使用...
这个“C# 反射实例”提供了实际操作的例子,展示了如何利用反射来获取类的信息并进行动态操作。 反射的基本概念: 1. **程序集(Assembly)**: C#程序的编译结果,包含一个或多个类型的集合。例如,.dll或.exe文件...
在这个"C#版本的封装和反射实例"中,我们将深入探讨两个核心概念:封装和反射。 封装是面向对象编程的基础,它指的是将数据和操作这些数据的方法绑定在一起,形成一个独立的单元,即类。在C#中,我们通过访问修饰符...
总结一下,这个C#反射实例代码展示了如何通过接口动态加载和执行DLL中的代码,其核心知识点包括: 1. 接口:定义行为规范,实现多态性。 2. 反射:运行时检查和操作类型,如`Assembly`、`Type`、`Activator`的使用...
反射实例-JAVA反射机制
本文将深入探讨C#中的反射,并通过具体的实例来帮助大家更好地理解和掌握这个概念。 首先,我们需要理解什么是反射。反射允许程序在运行时检查自身的行为,即它能获取类型的信息(如类、接口、属性、方法等),并且...
在标题“Java反射实例”中,我们聚焦于如何在实际编程中应用这一特性。通过反射,我们可以动态地获取类的信息,如类名、方法名、字段名,甚至可以在运行时创建和调用对象。这对于实现元编程、插件系统、序列化、单元...
以下是对"Java反射实例"的详细解释: 1. **获取Class对象** 要使用反射,首先需要获取到对应的`Class`对象。这可以通过以下三种方式实现: - 使用`Class.forName()`方法,传入类的全名(包括包名)。 - 对象的`...