当前位置: 技术问答>java相关
为什么这样同一个Bean对不同的数据库会出现不同现象呢?!!(高分求解)
来源: 互联网 发布时间:2015-03-17
本文导语: 下面是这个Bean内的查询模块代码:Connnect是从连接池内取得的不存在任何问题 public ResultSet executeQry(String sql) { rs = null; try { conn = poolMgr.getConnection("mysql"); //从连接池中获得Connection赋给 ...
下面是这个Bean内的查询模块代码:Connnect是从连接池内取得的不存在任何问题
public ResultSet executeQry(String sql) {
rs = null;
try {
conn = poolMgr.getConnection("mysql"); //从连接池中获得Connection赋给
stmt = conn.createStatement();
rs = stmt.executeQuery(sql);
stmt.close(); // 特别注意这么一句-------------------,
/**加入这么一句话对数据库MySQL是可行的,但换成Oracle运行时就出错:“javax.servlet.ServletException: 关闭的语句: next” */
poolMgr.freeConnection("mysql",conn); //释放conn返还连接池
}
catch (SQLException e) {
}
return rs;
}
问题:为什么这样同一个Bean对不同的数据库会出现不同现象呢????
1。 按照JDK文档的说明,当关闭Statement时会自动关闭ResultSet的,如果是这样的话,那说明使用Oracle时出错时正常的。
2. 但是为什么当使用MySQL时,却会一点问题都没有,而且很正常啊!!奇怪
3. 这难道与数据库驱动程序支持的JDBC版本不一样有关系?(注:两种连接方式都是使用相应厂商提供的纯JDBC驱动程序)
public ResultSet executeQry(String sql) {
rs = null;
try {
conn = poolMgr.getConnection("mysql"); //从连接池中获得Connection赋给
stmt = conn.createStatement();
rs = stmt.executeQuery(sql);
stmt.close(); // 特别注意这么一句-------------------,
/**加入这么一句话对数据库MySQL是可行的,但换成Oracle运行时就出错:“javax.servlet.ServletException: 关闭的语句: next” */
poolMgr.freeConnection("mysql",conn); //释放conn返还连接池
}
catch (SQLException e) {
}
return rs;
}
问题:为什么这样同一个Bean对不同的数据库会出现不同现象呢????
1。 按照JDK文档的说明,当关闭Statement时会自动关闭ResultSet的,如果是这样的话,那说明使用Oracle时出错时正常的。
2. 但是为什么当使用MySQL时,却会一点问题都没有,而且很正常啊!!奇怪
3. 这难道与数据库驱动程序支持的JDBC版本不一样有关系?(注:两种连接方式都是使用相应厂商提供的纯JDBC驱动程序)
|
确实不同。
sun只是制定的jdbc的规范,具体实现还是由各个厂商自己做的。
所以,同一数据库的不同驱动是绝对不同的。
另外,oracle的驱动还分oci和thin的,如果有客户端,建议使用oci,感觉毛病少点。
sun只是制定的jdbc的规范,具体实现还是由各个厂商自己做的。
所以,同一数据库的不同驱动是绝对不同的。
另外,oracle的驱动还分oci和thin的,如果有客户端,建议使用oci,感觉毛病少点。
|
这样的写法好像有毛病,如果出exception的时候,最好把connection和statement 释放掉,我自己的写法是,在finally中,把connection释放,这样,就可以避免在某些数据库下,resultset和connection释放先后顺序而导致的问题。
请指教
请指教
|
MySql的JDBC驱动是不太完善。
我在程序中不小心把statement关闭以后在stmt.excuteQuery(),结果MySql抛出一
个Runtime(用catch(SQLException)捕捉不到的)的Exception,告诉我空指针错误,
弄得我莫名其妙;而Sybase则给我一个SQLException,告诉我“连接已关闭”,这才
让我找到了BUG。
我在程序中不小心把statement关闭以后在stmt.excuteQuery(),结果MySql抛出一
个Runtime(用catch(SQLException)捕捉不到的)的Exception,告诉我空指针错误,
弄得我莫名其妙;而Sybase则给我一个SQLException,告诉我“连接已关闭”,这才
让我找到了BUG。
|
按照JDK文档的说明,当关闭Statement时会自动关闭ResultSet的.这个是肯定没错的,所以oracle 报的错是对的,原因是在于mysql的jdbc。这段程序如果用在sybase上一定也会报这个错误。要么,您可以写一个专门释放connection 和statement的function,通过调用这个function来释放掉连接,最好在有一个建立连接的function,这样只用调用一次,就可以建立连接,不然您每次在调用executeQry(String sql) 时都要建一个连接,这样会影响访问速度的,而且如果不及时释放可能会出现连接被占满的情况。
|
我用的是 CallableStatement
连结 oracle, 关闭 CallableStatement 后使用 ResultSet 没有问题。
当然 connection 是不能 close 的.
连结 oracle, 关闭 CallableStatement 后使用 ResultSet 没有问题。
当然 connection 是不能 close 的.