日期:2014-05-20  浏览次数:20688 次

Spring 的 JDBCTemplate 使用preparedStatement操作SqlServer数据库的问题
大家好。

我现在工作中遇到了一个问题。

业务逻辑层使用Spring,数据层是Spring提供的JDBCTemplate

在执行SQL语句的时候,会用到类似如下的方式执行代码

Java code



this.getJdbcTemplate().query(new PreparedStatementCreator(){
   /*
    *这里的方法主要是实现prepareStatement方法
    *根据SQL语句里的?,把参数设置到ps对象上
    *然后返回ps对象
    */
}, new RowMapper(){

   //这里的方法就不写了

});




但是我发现一个问题。如果我用上述方式执行SQL语句,一次查询需要20多秒返回。关于数据量和数据结构我就不多解释了,因为已经发现和这些无关了。如果在SqlServer的查询分析器里执行这条SQL语句,只需要不到1秒的时间。

起初我以为是本地的链接受限。后来发现,当我不使用preparedStatement执行SQL语句的时候,比如,我在代码里,把参数以字符串的形式拼在SQL语句的String对象里,直接使用 

Java code

this.getJdbcTemplate().query(sql, new RowMapper(){});




这样的方法,执行SQL返回数据只需要不到1.5秒的时间。

在网上查阅了一些资料,貌似是使用preparedStatement的时候,如果SQL语句参数里有字符串类型

驱动程序会执行一些操作,进行转码或者类似的一些工作。查询效率低,就是这个原因。

有人说,在配置数据源的时候,url参数里,加一个 sendStringParamtersAsUnicode=false

就可以让驱动程序不再自动去做转码工作

但是我发现不行。

所以特来问下各位同学,有没有人遇到过这个问题,以及如何解决。

谢谢

------解决方案--------------------
是否是查询字段过多?导致,网络数据量大?
你前面使用ps和后面使用的sql是否一致?
------解决方案--------------------
关注中。。。
------解决方案--------------------
探讨
this.getJdbcTemplate().query(new PreparedStatementCreator(){
/*
*这里的方法主要是实现prepareStatement方法
*根据SQL语句里的?,把参数设置到ps对象上
*然后返回ps对象
*/
}, new RowMapper(){

//这里的方法就不写了

});