Oracle访问Web
一、Oracle访问Web
在系统实现中,有时会有直接在数据库端利用触发器、存储过程等方式进行数据传递、分发的业务,而其中可能会涉及一些业务逻辑,为了处理这些业务逻辑,并简单起见,可以直接在触发器或存储过程中调用一些java类或WebService或一个url连接。这一期呢我来说一下通过oracle中自带的utl_http怎样连接到一个url路径,至于oracle怎样调用WebService咱们下一期再说。
二、应用场景
当数据库中某个表做增删改操作时,需及时的更新缓存数据,同时通知客户端重新请求数据。
三、编码实现
以下是通过UTL_HTTP+SERVLET解决以上问题的一个具体实现,以后如果有类似的需求或问题大家可以借鉴一下。
1. 创建UpdateCacheServlet,并在web.xml中配置一下
创建此servlet的目的主要是用来更新缓存的数据等。
publicclass UpdateCacheServlet extends HttpServlet {
@Override
protectedvoid doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
String updateTable = req.getParameter("updateTable");
//调用更新缓存的方法
updateCache(updateTable);
}
/**
* 更新缓存,并通知相应的客户端更新数据
* (具体如何缓存数据以及通知客户端我这里不作为描述的重点)
*/
privatevoid updateCache(String updateTable) {
if(updateTable == null || updateTable.trim().equals("")) {
return;
}
//oracle触发器的执行是在事务提交之前执行的,所以大家在更新数据的时候最好延迟一下。
if(updateTable == "TEST_TABLE") {
//具体的缓存代码我这里就不写了,估计大家都会,这里不作为描述的重点
System.out.println("在这里延迟更新缓存数据");
//通知客户端,数据需要更新了,具体如何实现通知客户端我这里也不作为描述的重点。
System.out.println("在这里发送通知客户端重新请求数据的通知");
}
}
}
2. 创建Oracle触发器
为TEST_TABLE表添加触发器,触发UpdateCacheServlet的请求。
CREATEORREPLACETRIGGER TEST_TABLE_TRIGGER--给TEST_TABLE表添加触发器
afterinsertON TEST_TABLE --这里在TEST_TABLE添加数据后出发一下事件
--(关于触发器的使用大家可以去查询其它相关资料我这里就不在赘述)
declare
-- 声明相应变量
url varchar2(2000);
req utl_http.req;--创建reques请求变量
resp utl_http.resp;--创建response相应变量
value VARCHAR2(1000);--存储请求文本的变量
begin
url:='http://forevergis:8898/jinangis/updatecache.do?updateTable=TEST_TABLE';--需要请求的url
req:= utl_http.begin_request(url);--发送请求
resp:= utl_http.get_response(req);--获得请求响应
loop
utl_http.read_line(resp,value,TRUE);
dbms_output.put_line('' || value);--打印方法,oracle提供
ENDloop;
utl_http.end_response(resp);--结束请求响应
EXCEPTION
WHEN utl_http.end_of_body THEN
utl_http.end_response(resp);--结束请求响应
end;
/
注意事项:
oracle触发器的执行是在事务提交之前完成的,所以如果在servlet中,做更新缓存数据的时候,最好加一个延时,避免出现读取错误数据的现象。