论坛首页 Java企业应用论坛

mysql的jdbc驱动分析

浏览 39790 次
该帖已经被评为精华帖
作者 正文
   发表时间:2009-07-02  
sql语句编译到底是什么意思??????????


有没有大侠给解释下啊
0 请登录后投票
   发表时间:2009-07-02  
taupo 写道
sql语句编译到底是什么意思??????????
有没有大侠给解释下啊


长话短说, 就是,你在提交一个sql 的时候, database 会去先查一下这个sql 以前有没有执行过(我这里只是简单的说明, 就 “执行过” 3个字而言,就可以写一篇文章了), 如果没有执行过, database server会去编译这个sql,并把编译的结果保存下来(注意所谓的编译用法不太准确, 同样“编译”这2个字也可以写一篇文章),然后在去执行, 如果编译过的, 就把编译的结果拿出啦, 把参数绑定上去在执行。
很显然, 编译过的sql 当然要比没编译的执行起来要快得多啦。

我在说一下, 我只是简单的回答一下而已, 用词并不准确,可以说是不正确。 同时很多概念我都做了回避, 我只是简单的回答你的问题而已。
0 请登录后投票
   发表时间:2009-07-02  
mikewang 写道
taupo 写道
sql语句编译到底是什么意思??????????
有没有大侠给解释下啊


长话短说, 就是,你在提交一个sql 的时候, database 会去先查一下这个sql 以前有没有执行过(我这里只是简单的说明, 就 “执行过” 3个字而言,就可以写一篇文章了), 如果没有执行过, database server会去编译这个sql,并把编译的结果保存下来(注意所谓的编译用法不太准确, 同样“编译”这2个字也可以写一篇文章),然后在去执行, 如果编译过的, 就把编译的结果拿出啦, 把参数绑定上去在执行。
很显然, 编译过的sql 当然要比没编译的执行起来要快得多啦。

我在说一下, 我只是简单的回答一下而已, 用词并不准确,可以说是不正确。 同时很多概念我都做了回避, 我只是简单的回答你的问题而已。


很准确,说明重点即可
0 请登录后投票
   发表时间:2009-07-02  
annegu 写道
gembler 写道

怀疑你官方文档都没看完,JDBC Connector有这么一个参数:useServerPrepStmts,而默认是false。


你好,能请教一下replication和loadbalace这两个驱动的具体做法是怎么样的呢?
能给我详细解释一下吗,大体上我也知道一些,但是还是希望能有懂的人详细解释一下,希望不要用google或者一句话就带过,因为这个用的确实比较少,所以希望能了解一下。

对不起,只能一句带过,因为我不知道。

annegu 写道
mikewang说的是对的,我用的驱动是5.0.6的,预编译的功能是取决于server的。

没人说不是取决于server,不需要重复强调吧  :)
还有你主贴里那段红字还是修改一下吧,歪曲了事实  :)



BTW: LZ是MM么?  
0 请登录后投票
   发表时间:2009-07-02  
引用
你好,能请教一下replication和loadbalace这两个驱动的具体做法是怎么样的呢?
能给我详细解释一下吗,大体上我也知道一些,但是还是希望能有懂的人详细解释一下,希望不要用google或者一句话就带过,因为这个用的确实比较少,所以希望能了解一下。


mysql 没有就过, 不过oracle的驱动我研究过, oracle 除了提供ojdbc14 这个标准的驱动以外, 还提供很多遇有“增值” 功能的驱动, 不过要先说明一下, 这些增值功能都是oracle 自己的, 只能在oracle数据库上使用。其中有一个叫做dms (动态监控)的功能,如果你反编译一下他的驱动程序, 你会发现,他实际上封装了oracle server 提供的dms 协议,通过这个协议,取得oracle server的状态。 其实就这么简单。

说到这里, 其他提供增值功能的驱动程序是如何实现的,你应该能够自己想象出来了。

多观察多思考。

0 请登录后投票
   发表时间:2009-07-02  
PreparedStatement 就是一个接口嘛, 按照接口行事就OK了,就像有的数据库不支持事物一样,那支持事物的rollback commit自然就没有效果了。 文章还是可以,就是太罗嗦了,就看红字就可以了
0 请登录后投票
   发表时间:2009-07-02  
gembler 写道

还有你主贴里那段红字还是修改一下吧,歪曲了事实  :)


呃,哪里歪曲了事实?我觉得写的没错啊。后面P.S.了一下。
0 请登录后投票
   发表时间:2009-07-02  
看来lz要好好学习了哦!~
0 请登录后投票
   发表时间:2009-07-02  
kaipingk 写道
PreparedStatement 就是一个接口嘛, 按照接口行事就OK了,就像有的数据库不支持事物一样,那支持事物的rollback commit自然就没有效果了。 文章还是可以,就是太罗嗦了,就看红字就可以了


对你的言论,我不多作评价,但要说2点:

1, 所谓的按章行使,也要把章搞搞清楚, 也就是说, 总得把每个函数的作用搞搞清楚吧? 就拿mysql 而言, 如果是低版本的(< 4.1的), 那么用PreparedStatement 还不如使用Statement来的快。

2, 你有点想当然了,a) 数据库必须支持事务(严格的说,是必须支持本地事务),b)如果不支持xa事务, 而使用事务的话, 那么在征集事务时候(调用enlist函数是) 会发生错误,抛出异常,终止程序, 并非你说的,没有效果!
0 请登录后投票
   发表时间:2009-07-02  
annegu 写道
gembler 写道

还有你主贴里那段红字还是修改一下吧,歪曲了事实  :)


呃,哪里歪曲了事实?我觉得写的没错啊。后面P.S.了一下。


||
vv

annegu 写道
所以说,从mysql驱动的实现里面,我们并没有看到mysql支持预编译功能的证据,
是你看不到,并不是我们看不到,你看到的应该是com.mysql.jdbc.PreparedStatement,这是client-side的prepared statement实现,另外一个com.mysql.jdbc.ServerPreparedStatement应该是你没看到的,而且在mysql client/server通讯协议里面,也有prepared statement packet


由此,annegu得出结论,在mysql数据库上使用PreparedStatement并不能提高效率(实际测试也表明,PreparedStatement和Statement的效率几乎一样,甚至当使用次数不多的时候,PreparedStatement比Statement还要慢一些)。

这个结论就更...我不想说了...有想说的就替我补充一下


annegu 写道

P.S.:sql语句预编译的功能取决于server端,oracle就是支持sql预编译的。

这句 有等于没有

annegu 写道
另外一个就是对于PreparedStatement有了重新的认识,有些东西往往都是想当然得出来的结论,真相还是要靠实践来发现。

看你还需要再重新认识一遍
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics