今天发现JDBC的一个怪问题。
同样的sql,在mysql客户端中执行只要0.6、7秒,但是在JDBC中执行却要十二三分钟!这差距也太大了!而且只是其中一张表如此,查看表结构,很正常,没有索引,连主键都没有,就只有字段,字段类型也没有BLOB、CLOB之类的大数据类型,和其他表相比,字段数量也差不错。那就奇怪了,虽说JDBC是要慢些,但是不至于差别几百倍吧。再对比sql,唯一不同的就是这个慢的sql中使用了大量的convert函数,难道是这个原因?把函数去掉,果然速度提升起来了,和其他表一样快了!由于插入该表需要把中文改成GBK编码,因而使用了大量的CONVERT函数,而且数据量上万,导致使用JDBC执行超级慢。至于为何如此,那就不太清楚原因了,后面再研究下,或者有高手指点下就更好。
那怎么解决这个问题呢?很简单,在执行sql的preparedStatement中有个设置编码的方法:preparedStatement.setBytes,把占位符的数据用getBytes(Charset)转换编码后设进去即可,如:
1
|
preparedStatement.setBytes(
1
, valeue.getBytes(Charset.forName(
"GBK"
)));
//其中1为对应的占位符位置
|