为什么创建Clob绑定到Connection类?

时间:2014-12-04 20:34:10

标签: java soap jdbc connection clob

我有一个Java方法,它使用JDBC将CLOB传递给PL / SQL过程。我能够使用createClob()类的Connection方法做到这一点。

这是Java Doc for the Connection class。如果您注意到createClob()方法以外的方法,则此类中还有createBlob()createArrayOf()createNClob()方法。

我很好奇为什么创建BlobClobNClob的实例是Connection类的一部分?这似乎有点不合适。为什么数据类型及其创建应该与连接对象绑定?

为什么我们不能独立创建这些数据类型的实例?我计划在SOAP Web服务中使用以下签名公开此方法:

public String handleEmployeeReview(int empId , String fileName)

Web服务客户端首先必须创建Connection实例来创建Clob的实例,这似乎有些奇怪。 (除非有另一种创造和传递Clobs的方式,我不知道。)

这也让我想知道我为这个方法选择的Clob数据类型是否正确。考虑将其暴露在网络服务中。

1 个答案:

答案 0 :(得分:3)

JDBC旨在独立于数据库引擎。数据库类型INTVARCHARTIMESTAMP等可以在Java类型中实现更常见的实现:intString,{{1} }从java.sql.Timestamp延伸,然后在。

java.util.DateBLOBCLOB等数据类型是更具体的字段,可以在数据库引擎中以非常不同的方式实现,某些数据库引擎甚至不支持数组作为数据表列的类型,但JDBC仍应提供透明的接口来传递客户端代码和数据库引擎。 JDBC接口的设计者认为这些对象的创建应该依赖于JDBC实现(这是NLOB对象是特定于数据库引擎的),以及提供CLOB对象创建的最佳位置(和类似的)将由CLOB接口提供,因为您至少需要打开物理数据库连接来创建此类特定数据库引擎对象的实例。 IMO这是执行此操作的正确界面,因为它允许在不同的java.sql.ConnectionCLOB中使用相同的PreparedStatement对象而没有任何问题。

只有你的dao图层才能使用Connection#createClob方法和类似物。其他数据源可能使用不同的方法来存储文件的二进制数据,例如存储在内存中的直接CallableStatement,对于这种情况,数据源将是缓存系统,而不是直接数据库。