检测你数据库连接的物理状态
ZDNet China
//
URL:
创建连接
Java JDBC API各种类的一个基石是javasqlConnection类很多问题都同其复用共用和验证相关对连接的验证在实时的应用程序中尤其重要因为它们必须无故障运行或者将故障率降至最低
事实上在很多情况下都可能产生连接的丢失(例如由于数据库的崩溃或者由于某些网络问题的存在)不幸的是标准的Java API并没有提供任何方法来检测连接的物理状态所以在每种特定的情况下都需要一种解决方法现在让我们来看看解决这个问题的两种方法第一种方法是使用软件制造商专用的API第二种方法是使用一种检测失败查询(testfail query)的方法
创建连接
在使用任何SQL陈述式之前应用程序必须要先连接到数据库建立连接的一种方法是使用javasql工具包里的连接工厂(connection factory)——DriverManagergetConnection()但是建立连接的首选方式是使用javaxsqlDataSourcegetConnection()你应该在对象每次请求进行连接的时候才使用这个工厂方法而不是在创建了连接之后将这个连接保存在对象里下面是这个方法的一个例子
void foo(){
//
Connection conn = myDataSourcegetConnection();
PreparedStatement ps = connprepareStatement();
//
}
此外一个实现DataSource接口的类能够使用命名服务来注册并使用JNDI API来访问DriverManager连接工厂和DataSource的巨大不同之处在于DataSource能够允许你控制连接的建立和使用
连接错误的问题
当你的应用程序尝试使用一个已经同数据库断开的连接时你会碰到一个像下面这样的异常
javasqlSQLException: Io exception: The Network Adapter could not establish the connection(lo异常网络适配器无法建立连接)
其结果是你的SQL查询会执行失败由于没有哪个API能够确定一个到数据库的连接是否失效因此你就只有在碰到SQL异常的时候才知道这个连接已经失效了如果一个异常是同一个已断开的连接相对应的那么你就必须要调整这个应用程序这样它才能够尝试重新建立连接并重新执行查询任务很显然这种处理数据库连接的混乱商务逻辑使得代码更容易出错而且难以管理
信赖软件制造商的API
信赖软件制造商的API
处理连接断开的一种方法是使用驱动程序专用的API你可以使用这个API来建立到数据库的连接现在让我们来看看Oracle的JDBC APIOracleConnectionCacheImpl这个类会实现javaxDataSource接口并在你每次请求的时候验证一下连接此外它还能够通过缓沖随后请求的连接来重复使用这个连接换句话说如果你关闭了数据库然后尝试使用一个连接你就会得到一个明确阐明了原因的SQL异常看看Listing A里面有数据源用法的一个例子
验证连接
另一个解决方案是你自己进行连接验证你可以编写一个连接工厂让其将连接返回给请求者之前检测连接的情况将验证机制从连接工厂里抽象出来是一个很好的代码编写惯例要实现这一目的你就要应用GoF策略模式它会引入一个负责进行连接验证的接口
类图表
Listing B里的AbstractDataSource类提供了DataSource接口的基础实现这样就为设置和访问连接的属性包括JDBC驱动程序类URL用户名和密码提供了便利的方法
这个类的确切实现有JdbcDataSource(Listing C)和ValidDataSource(Listing D)Listing C里的类为每个请求都创建了一个Connection对象Listing E里的类通过使用ConnectionValidator从而提供了连接验证的能力
Listing F里的SqlConnectionValidator是这个接口的简单实现在这个接口里一个快速的SQL查询会被执行以验证你认为需要进行验证的连接你的这一目的是通过调用validateConnection(Connection conn)方法来实现的它会在碰到任何连接问题的时候给出一个SQL异常
验证的好处
无论你选择使用哪种方法建立一个有效的数据库连接都是极其重要的尤其是在处理关键的实时应用程序的时候虽然定制连接验证这种方式能够为你提供更好的灵活性和API的独立性但是同使用软件制造商所提供的API相比而言它会降低整体的性能你必须决定增强可控制性所带来的好处同相应所增加的复杂性和代价相比是否值得