Java Spring JDBC`SimpleJDBCall`带有BLOB输出,仅返回8000字节

Java Spring JDBC`SimpleJDBCall`带有BLOB输出,仅返回8000字节,java,sql-server,jdbc,spring-jdbc,jtds,Java,Sql Server,Jdbc,Spring Jdbc,Jtds,我尝试使用存储过程提取存储为SQL Server数据库中BLOB的PDF。有点类似于以下内容: SimpleJdbcCall sp = new SimpleJdbcCall(getJdbcTemplate()) .withSchemaName("dbo") .withProcedureName("sp_find_doc") .declareParameters( new SqlParameter("DocID", j

我尝试使用存储过程提取存储为SQL Server数据库中BLOB的PDF。有点类似于以下内容:

SimpleJdbcCall sp = new SimpleJdbcCall(getJdbcTemplate())
        .withSchemaName("dbo")
        .withProcedureName("sp_find_doc")
        .declareParameters(
                new SqlParameter("DocID", java.sql.Types.BIGINT),
                new SqlOutParameter("DocBLOB", java.sql.Types.BLOB));

SqlParameterSource args = new MapSqlParameterSource().addValue("ID", 1L);
Map<String, Object> map = sp.execute(args);
SimpleJdbcCall sp=newsimplejdbccall(getJdbcTemplate())
.使用Chemaname(“dbo”)
.withProcedureName(“sp\U find\U doc”)
.申报参数(
新的SqlParameter(“DocID”,java.sql.Types.BIGINT),
新的SqlOutParameter(“DocBLOB”,java.sql.Types.BLOB));
SqlParameterSource args=new-MapSqlParameterSource().addValue(“ID”,1L);
Map Map=sp.execute(args);
存储过程将输出定义为
varbinary(max)
,因此它应该支持相当大的输出。但是,PDF已损坏。更仔细地检查,我可以看到
execute
方法返回到映射的对象被截断为8000字节

8000字节是基本的
varbinary
(没有
max
),因此我猜测某些组件无法正确指定输出类型。或者,
execute
方法只是读取前8000个字节

我上面的代码中是否缺少确保SpringJDBC定义正确类型并映射BLOB中所有字节的内容

请注意,我还尝试在数据库URL上指定
useLOBs=false
,并为输出指定
LONGVARBINARY
,但返回的数组限制为8000字节

仅供参考-我正在使用SQL Server 2014、jTDS 1.3.1和Spring Boot 1.3.1(Spring JDBC 4.2.3)

解决方法

注意,我已经实现了一种重写存储过程以返回结果集而不是输出参数的变通方法。这样,我就可以使用
rs.getBlob(“DocBLOB”)
,它工作得很好


但是,我当然想知道是否有正确/更好的方法来执行在输出参数中返回blob的存储过程。

您是否在配置中为该连接指定了TDS协议的版本?类似这样的报告表明,较旧的协议版本(大约SQL Server 2000)有时会根据情况以4000或8000个字符/字节的速度截断长“things”。我没有指定版本,因此根据jTDS文档,它应该默认为8.0。我看不到任何更高版本的选项。但jTDS似乎已经有一段时间没有更新了。我可以从结果集中获取80k+对象,但正是这些存储过程输出参数似乎将对象限制在8k以内。您尝试过Microsoft SQL Server JDBC驱动程序吗?我最近有点想看看它是否有什么好处。。。上次我尝试时,它无法处理命名管道,这使我无法在一些开发环境中使用它。