免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
1234下一页
最近访问板块 发新帖
查看: 4750 | 回复: 37

jdbc问题,请多帮忙 [复制链接]

论坛徽章:
4
2015年亚洲杯之阿联酋
日期:2015-03-10 10:32:022015年亚洲杯之阿曼
日期:2015-03-10 14:53:222015亚冠之水原三星
日期:2015-07-18 15:40:262015亚冠之塔什干棉农
日期:2015-07-27 20:52:05
发表于 2005-12-01 16:46 |显示全部楼层
请问
Statement stmt
stmt.addBatch("xxx");
stmt.executeBatch();

PreparedStatemt stmt
stmt.setXXX(x,x)
...
stmt.addBatch()
stmt.executeBatch()
有什么区别呢?
可以从任何方面来说,多谢

论坛徽章:
0
发表于 2005-12-01 20:14 |显示全部楼层
原帖由 1017of 于 2005-12-1 16:46 发表
请问
Statement stmt
stmt.addBatch("xxx");
stmt.executeBatch();

PreparedStatemt stmt
stmt.setXXX(x,x)
...
stmt.addBatch()
stmt.executeBatch()
有什么区别呢?
可以从任何方面来说 ...

还没有怎么用过 jdbc
呵呵

我感觉到的一点,就是 preparedStatement 比 statement 灵活点,比如,你code的时候只清楚sql的大致语句,但是不知道具体的参数值,可以使用preparedstatement ,然后使用 set 方法传递值会方便些,当然,使用 Statement也是行的

其他的我就不知道了

[ 本帖最后由 白色乌鸦 于 2005-12-1 20:16 编辑 ]

论坛徽章:
0
发表于 2005-12-01 20:19 |显示全部楼层
上面的我可能说的不对

这个是jdk文档中关于类 PreparedStatement 的说明,希望对你有帮助

  1. An object that represents a precompiled SQL statement.

  2. A SQL statement is precompiled and stored in a PreparedStatement object. [color=Red]This object can then be used to efficiently execute this statement multiple times. [/color]

  3. Note: The setter methods (setShort, setString, and so on) for setting IN parameter values must specify types that are compatible with the defined SQL type of the input parameter. For instance, if the IN parameter has SQL type INTEGER, then the method setInt should be used.

  4. If arbitrary parameter type conversions are required, the method setObject should be used with a target SQL type.

  5. In the following example of setting a parameter, con represents an active connection:

  6.    PreparedStatement pstmt = con.prepareStatement("UPDATE EMPLOYEES
  7.                                      SET SALARY = ? WHERE ID = ?");
  8.    pstmt.setBigDecimal(1, 153833.00)
  9.    pstmt.setInt(2, 110592)

复制代码

[ 本帖最后由 白色乌鸦 于 2005-12-1 20:21 编辑 ]
redappleboy 该用户已被删除
发表于 2005-12-02 08:53 |显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
4
2015年亚洲杯之阿联酋
日期:2015-03-10 10:32:022015年亚洲杯之阿曼
日期:2015-03-10 14:53:222015亚冠之水原三星
日期:2015-07-18 15:40:262015亚冠之塔什干棉农
日期:2015-07-27 20:52:05
发表于 2005-12-02 13:50 |显示全部楼层
乌鸦猛啊,偶感兴趣的是两者在系统处理与执行效率的差别
A SQL statement is precompiled and stored in a PreparedStatement object.
precompiled sql statement是存储在客户端的java pool或者stack中?还是会存储在database中的某种cache中?
This object can then be used to efficiently execute this statement multiple times.
如果多次setXXX()和addBatch(),而后executeBatch(),object需要被多次precompile吗?
另statement、preparedstatement和动态sql有什么关系呢?statement、preparedstatement在处理batch时,又有什么区别呢?

论坛徽章:
0
发表于 2005-12-02 14:03 |显示全部楼层
大家思考一下可行性
addBatch() 你存放的是不同的 SQL ,那还怎么提前编译之说啊?那个只是为了批处理




PreparedStatemt stmt
stmt.setXXX(x,x)

这种方式,同一个SQL,不同值而已,有预编译的可能


但 addBatch 也有可能是同一语句只编译一次:发现同一个SQL语句,而且里面还得同一个赋值时,做 hash 处理
不过可能性相当相当小,因为还不如直接执行了

论坛徽章:
0
发表于 2005-12-02 14:52 |显示全部楼层
原帖由 1017of 于 2005-12-2 13:50 发表
乌鸦猛啊,偶感兴趣的是两者在系统处理与执行效率的差别
A SQL statement is precompiled and stored in a PreparedStatement object.
precompiled sql statement是存储在客户端的java pool或者stack中?还是会存储在database中的某种cache中?
This object can then be used to efficiently execute this statement multiple times.
如果多次setXXX()和addBatch(),而后executeBatch(),object需要被多次precompile吗?
另statement、preparedstatement和动态sql有什么关系呢?statement、preparedstatement在处理batch时,又有什么区别呢?


问题好多哦,我一个一个地来,由于我用这个用得不多,我就只能谈点自己想法。

第一句
A SQL statement is precompiled and stored in a PreparedStatement object.

这句说 那个冬冬是保存在 PreparedStatement  对象中,因而,也就是保存在了客户端 java 虚拟机内的堆中(应该就是你说的stack中)

[ 本帖最后由 白色乌鸦 于 2005-12-2 14:54 编辑 ]

论坛徽章:
0
发表于 2005-12-02 15:16 |显示全部楼层
关于第二个问题:

这个是我从网络上找的,不知道对你有没有帮助

利用PreparedStatement对象提高数据库的总体效率

  在使用PreparedStatement对象执行SQL命令时,命令被数据库进行解析和编译,然后被放到命令缓冲区。然后,每当执行同一个PreparedStatement对象时,它就会被再解析一次,但不会被再次编译。在缓冲区中可以发现预编译的命令,并且可以重新使用。在有大量用户的企业级应用软件中,经常会重复执行相同的SQL命令,使用PreparedStatement对象带来的编译次数的减少能够提高数据库的总体性能。如果不是在客户端创建、预备、执行PreparedStatement任务需要的时间长于Statement任务,我会建议在除动态SQL命令之外的所有情况下使用PreparedStatement对象。

论坛徽章:
0
发表于 2005-12-02 15:48 |显示全部楼层
我在一个帖子上猛灌,是不是不太好呀,

呵呵

PreparedStatemt 是接口类型的,记得我们语句是这样写的

Connection conn;
................

PreparedStatement pstmt = conn.prepareStatement(........);


所以,我去看了一下 Connection 中的prepareStatement()方法,其中有这样的一个 NOTE:

This method is optimized for handling parametric SQL statements that benefit from precompilation. If the driver supports precompilation, the method prepareStatement will send the statement to the database for precompilation. Some drivers may not support precompilation. In this case, the statement may not be sent to the database until the PreparedStatement object is executed. This has no direct effect on users; however, it does affect which methods throw certain SQLExceptions.

论坛徽章:
4
2015年亚洲杯之阿联酋
日期:2015-03-10 10:32:022015年亚洲杯之阿曼
日期:2015-03-10 14:53:222015亚冠之水原三星
日期:2015-07-18 15:40:262015亚冠之塔什干棉农
日期:2015-07-27 20:52:05
发表于 2005-12-02 16:37 |显示全部楼层
乌鸦,你应该叫白色牛人啊,嘿嘿
第一:堆是不是应该为heap啊,堆栈好象是stack,不过我不知道这俩有什么区别;
第二:从7楼和8楼的内容是否sql是在database端被precompile的呢?那么所谓的命令缓冲区是属于谁的呢?OS或者database?解析和编译有什么不同呢?解析需要额外命令缓冲区空间或者其他存储空间吗?
第三:如果仅仅是动态sql的参数不同,addBatch与executeBatch符合preparedstatement的减少编译的条件吗?或者与数据库或jdbc驱动有关?
第四:9楼的it does affect which methods throw certain SQLExceptions,可能会出现什么现象呢?
找了好久,一点有价值的都没找到,你是在哪里找到这些的?share一下吧,嘿
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP