锁定老帖子 主题:mysql的jdbc驱动分析
该帖已经被评为精华帖
|
|
---|---|
作者 | 正文 |
发表时间:2009-07-02
sql语句编译到底是什么意思??????????
有没有大侠给解释下啊 |
|
返回顶楼 | |
发表时间:2009-07-02
taupo 写道 sql语句编译到底是什么意思??????????
有没有大侠给解释下啊 长话短说, 就是,你在提交一个sql 的时候, database 会去先查一下这个sql 以前有没有执行过(我这里只是简单的说明, 就 “执行过” 3个字而言,就可以写一篇文章了), 如果没有执行过, database server会去编译这个sql,并把编译的结果保存下来(注意所谓的编译用法不太准确, 同样“编译”这2个字也可以写一篇文章),然后在去执行, 如果编译过的, 就把编译的结果拿出啦, 把参数绑定上去在执行。 很显然, 编译过的sql 当然要比没编译的执行起来要快得多啦。 我在说一下, 我只是简单的回答一下而已, 用词并不准确,可以说是不正确。 同时很多概念我都做了回避, 我只是简单的回答你的问题而已。 |
|
返回顶楼 | |
发表时间:2009-07-02
mikewang 写道 taupo 写道 sql语句编译到底是什么意思??????????
有没有大侠给解释下啊 长话短说, 就是,你在提交一个sql 的时候, database 会去先查一下这个sql 以前有没有执行过(我这里只是简单的说明, 就 “执行过” 3个字而言,就可以写一篇文章了), 如果没有执行过, database server会去编译这个sql,并把编译的结果保存下来(注意所谓的编译用法不太准确, 同样“编译”这2个字也可以写一篇文章),然后在去执行, 如果编译过的, 就把编译的结果拿出啦, 把参数绑定上去在执行。 很显然, 编译过的sql 当然要比没编译的执行起来要快得多啦。 我在说一下, 我只是简单的回答一下而已, 用词并不准确,可以说是不正确。 同时很多概念我都做了回避, 我只是简单的回答你的问题而已。 很准确,说明重点即可 |
|
返回顶楼 | |
发表时间:2009-07-02
annegu 写道 gembler 写道 怀疑你官方文档都没看完,JDBC Connector有这么一个参数:useServerPrepStmts,而默认是false。 你好,能请教一下replication和loadbalace这两个驱动的具体做法是怎么样的呢? 能给我详细解释一下吗,大体上我也知道一些,但是还是希望能有懂的人详细解释一下,希望不要用google或者一句话就带过,因为这个用的确实比较少,所以希望能了解一下。 对不起,只能一句带过,因为我不知道。 annegu 写道 mikewang说的是对的,我用的驱动是5.0.6的,预编译的功能是取决于server的。
没人说不是取决于server,不需要重复强调吧 :) 还有你主贴里那段红字还是修改一下吧,歪曲了事实 :) BTW: LZ是MM么? |
|
返回顶楼 | |
发表时间:2009-07-02
引用 你好,能请教一下replication和loadbalace这两个驱动的具体做法是怎么样的呢?
能给我详细解释一下吗,大体上我也知道一些,但是还是希望能有懂的人详细解释一下,希望不要用google或者一句话就带过,因为这个用的确实比较少,所以希望能了解一下。 mysql 没有就过, 不过oracle的驱动我研究过, oracle 除了提供ojdbc14 这个标准的驱动以外, 还提供很多遇有“增值” 功能的驱动, 不过要先说明一下, 这些增值功能都是oracle 自己的, 只能在oracle数据库上使用。其中有一个叫做dms (动态监控)的功能,如果你反编译一下他的驱动程序, 你会发现,他实际上封装了oracle server 提供的dms 协议,通过这个协议,取得oracle server的状态。 其实就这么简单。 说到这里, 其他提供增值功能的驱动程序是如何实现的,你应该能够自己想象出来了。 多观察多思考。 |
|
返回顶楼 | |
发表时间:2009-07-02
PreparedStatement 就是一个接口嘛, 按照接口行事就OK了,就像有的数据库不支持事物一样,那支持事物的rollback commit自然就没有效果了。 文章还是可以,就是太罗嗦了,就看红字就可以了
|
|
返回顶楼 | |
发表时间:2009-07-02
gembler 写道 还有你主贴里那段红字还是修改一下吧,歪曲了事实 :) 呃,哪里歪曲了事实?我觉得写的没错啊。后面P.S.了一下。 |
|
返回顶楼 | |
发表时间:2009-07-02
看来lz要好好学习了哦!~
|
|
返回顶楼 | |
发表时间:2009-07-02
kaipingk 写道 PreparedStatement 就是一个接口嘛, 按照接口行事就OK了,就像有的数据库不支持事物一样,那支持事物的rollback commit自然就没有效果了。 文章还是可以,就是太罗嗦了,就看红字就可以了
对你的言论,我不多作评价,但要说2点: 1, 所谓的按章行使,也要把章搞搞清楚, 也就是说, 总得把每个函数的作用搞搞清楚吧? 就拿mysql 而言, 如果是低版本的(< 4.1的), 那么用PreparedStatement 还不如使用Statement来的快。 2, 你有点想当然了,a) 数据库必须支持事务(严格的说,是必须支持本地事务),b)如果不支持xa事务, 而使用事务的话, 那么在征集事务时候(调用enlist函数是) 会发生错误,抛出异常,终止程序, 并非你说的,没有效果! |
|
返回顶楼 | |
发表时间: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有了重新的认识,有些东西往往都是想当然得出来的结论,真相还是要靠实践来发现。
看你还需要再重新认识一遍 |
|
返回顶楼 | |