|
1 前言在基于J2EE平台的应用开发中,大多数的应用都需要跟数据库打交道;而自从接触JDBC起,我们便不止一次的被告之:数据库资源是十分宝贵的系统资源,一定要谨慎使用。但令人遗憾的是,在笔者见过的大部分跟数据库相关的应用开发中,针对数据库资源的使用总是充斥着这样或者那样的问题。在本文中,笔者针对常见的一些错误或者不当的使用数据库资源的案例进行介绍与分析,并阐述金蝶Apusic应用服务器提供的一些增值特性,通过这些特性能够有效的避免某些错误的发生。 2 常见数据库资源错误/不当用法的案例分析2.1 未正确的关闭数据库连接申请了数据库连接,却没有及时的关闭它,这几乎是最常见的数据库连接使用错误。犯这种错误的原因有很多,以下是常见的一种低级错误: | public void foo() { |
| Connection conn = getConnection(); | | Statement stmt = null; | | try { |
| conn = getConnection(); | | stmt = conn.createStatement(); | | } catch (Exception e) { | | } finally { | | close(stmt, conn); | | } | | } <示例代码一> |
在上述案例中的第 行代码中,作者已经申请了一个Connection,但在第 行代码中,又申请了一个新的Connection,并且丢失了第一次申请的connection的引用,至此,当程序每调一次foo方法,将导致申请一个新的Connection而没有释放它,如此一来,当数据库达到能够承受的最大连接数时,将导致整个应用的运行失败。 避免这种错误的方法有很多,譬如,可采用类似于FindBugs(注1)的代码分析工具对应用的源码进行分析,找出可能产生错误的代码。 此外,在应用中,我们需要非常频繁的对申请的数据库连接进行关闭与释放,此时,建议封装成某些工具类使用,并且要尽可能安全的关闭数据库连接。下面,我们以关闭Statement及Connection的通用close方法的不同实现方案来比较: 不安全的关闭方法: | private void close(Statement stmt, Connection conn) { | | try { |
| stmt.close(); |
| conn.close(); | | } catch (Exception e) { | | } | | <示例代码二> |
在上述代码中,倘若第 行代码中的stmt为空,或者stmt.close()方法出错并抛出异常,都将使第 行代码不能够正常调用,从而导致数据库连接无法释放,那么,更安全的写法应该是: 安全的关闭数据库资源方法: | private void close(Statement stmt, Connection conn) { | | try { |
| if(stmt!=null) stmt.close(); | | } catch (Exception e) {} | | try { |
| if(conn!=null) conn.close(); | | } catch (Exception e) {} | | } | | <示例代码三> |
在修订后的代码中,我们可以看到,无论第 行代码中关闭stmt是否成功,程序都能够保证向下执行,从而正确的关闭conn。 这些常用的数据库资源操作公用类,可以使用Apache的Commons DbUtils(注2)组件。
1
2
3
4
下一页>>
|